<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ariel Salminen</title>
  <subtitle>Read the latest articles from Ariel Salminen.</subtitle>
  <link href="https://arielsalminen.com/atom.xml" rel="self"/>
  <link href="https://arielsalminen.com"/>
  <updated>2026-01-20T00:00:00Z</updated>
  <id>https://arielsalminen.com/</id>
  <author>
    <name>Ariel Salminen</name>
    <email>info@arielsalminen.com</email>
  </author>
    
    <entry>
      <title>Hiring a Design Engineer for Kesko Design System</title>
      <link href="https://arielsalminen.com/2026/hiring-a-design-engineer-for-kesko-design-system/"/>
      <updated>2026-01-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2026/hiring-a-design-engineer-for-kesko-design-system/</id>
      <content type="html">&lt;p&gt;Hi 👋🏻, I’m &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;Arielle&lt;/a&gt;, a Design Systems Architect working with &lt;a href=&quot;https://www.kesko.fi/en/&quot;&gt;Kesko&lt;/a&gt;. I’m currently helping to strengthen the existing design systems team in the organization, whose main responsibility is building and maintaining Kesko’s design and frontend infrastructure.&lt;/p&gt;
&lt;p&gt;Right now, we’re looking for an experienced &lt;em&gt;Design Engineer&lt;/em&gt; to join this newly founded team. Someone who has a hybrid designer/developer experience, is kind, empathetic, and prefers the freedom that working in a hybrid environment gives them.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/kesko.png&quot; width=&quot;3162&quot; height=&quot;2070&quot; style=&quot;background:transparent;box-shadow:none;max-inline-size: 100%;&quot; alt=&quot;A screenshot of the upcoming Kesko Design System (alpha version).&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;A screenshot of the upcoming &lt;em&gt;Kesko Design System&lt;/em&gt; (alpha version).&lt;/span&gt;
&lt;p&gt;In this role, you will work together with &lt;a href=&quot;https://www.kesko.fi/en/company/divisions/&quot;&gt;our product teams&lt;/a&gt; and me, &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;Arielle&lt;/a&gt;, to design and develop the fundamental building blocks of Kesko’s products to accelerate development and elevate the quality and consistency of product team work. You will also find yourself talking to the system’s users, hosting monthly design system sessions, and reaching outside your role as much as you see fit.&lt;/p&gt;
&lt;p&gt;Our frontend stack is &lt;a href=&quot;https://www.w3.org/standards/&quot;&gt;web standards&lt;/a&gt; based and consists of components that are written in JavaScript, HTML and CSS. They ship as standards based &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements&quot;&gt;custom elements&lt;/a&gt; making them compatible with current and future JavaScript based frameworks like &lt;a href=&quot;https://angular.dev/&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt;, &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue&lt;/a&gt; and &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to frontend, you will also spend the majority of your time in &lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt; to maintain and collaborate on Kesko’s Figma Toolkit including defining and standardizing reusable components. You’ll also receive all the support needed from both the product teams and myself.&lt;/p&gt;
&lt;h2 id=&quot;responsibilities&quot;&gt;Responsibilities &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2026/hiring-a-design-engineer-for-kesko-design-system/#responsibilities&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Serve as the primary owner of Kesko’s Figma Toolkit including defining and standardizing reusable design components.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help develop and maintain Kesko’s frontend tooling and the design system infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collaborate with product, design and engineering to create design components that evolve and improve the design system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Advocate for accessibility standards and inclusive design principles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help teams across Kesko to onboard the design system and provide support for its users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write clear and detailed documentation for multiple audiences.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help maintain a culture of empathy, safety and belonging where all voices are heard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;experience&quot;&gt;Experience &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2026/hiring-a-design-engineer-for-kesko-design-system/#experience&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Several years of experience working in cross-functional product teams, on design systems, and with accessibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Several years of experience building design systems with Figma.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Several years of experience with React, Next.js and TypeScript.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Familiarity with platform conventions for responsive web as well as iOS and Android.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Good understanding of web standards based development using semantic HTML, CSS, JavaScript, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experience with modern JavaScript libraries and tooling, and debugging JavaScript issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experience writing maintainable and scalable CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experience nurturing a work environment that allows everyone to bring their whole selves to work, and values diversity and inclusion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bonus points for experience with Custom Elements, Shadow DOM, Lit, Stencil, Custom Elements Manifest, and similar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://emp.jobylon.com/jobs/328160-k-ryhma-design-engineer-for-our-design-system-team-k-group/&quot; target=&quot;_blank&quot; class=&quot;button button-has-svg&quot;&gt;Apply &lt;svg aria-hidden=&quot;true&quot; viewBox=&quot;0 0 20 20&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;m17 13h3v4c0 1.8333-1.1667 3-3 3h-14c-1.83333 0-3-1.1667-3-3v-14c0-1.83333 1.16667-3 3-3h4v3h-4v14h14zm-7-13v3h5l-6.16667 5.81667 2.34997 2.35003 5.8167-6.1667v5h3v-10z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://arielsalminen.com/contact/&quot; class=&quot;readmore&quot;&gt;Got questions?&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;message-from-arielle&quot;&gt;Message from Arielle &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2026/hiring-a-design-engineer-for-kesko-design-system/#message-from-arielle&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
  &lt;p&gt;“Don’t meet every single requirement? We’re dedicated to building a diverse and inclusive team, so if you’re excited about this role, but your past experience doesn’t align perfectly with the description, we encourage you to apply anyways. You may be just the right candidate.” 🧡&lt;/p&gt;
&lt;/blockquote&gt;</content>
    </entry>
    
    <entry>
      <title>On Freedom, Curiosity &amp; Happiness</title>
      <link href="https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/"/>
      <updated>2025-07-03T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/</id>
      <content type="html">&lt;p&gt;I have been recently contemplating the intricate relationship between my &lt;a href=&quot;https://bsky.app/profile/arielsalminen.com&quot;&gt;personal life&lt;/a&gt; and the &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;work I do&lt;/a&gt;, particularly how these domains inevitably get intertwined and influence one another. It’s not always easy to keep these separate, especially when one’s vocation transcends mere occupation to become a genuine passion and source of fulfillment.&lt;/p&gt;
&lt;p&gt;A job, much like &lt;a href=&quot;https://lea.verou.me/blog/2025/construction-lines/&quot;&gt;a relationship&lt;/a&gt;, often starts with great enthusiasm, but may eventually evolve to reveal fundamental incompatibilities. Having made this observa­tion about my own job lately, I decided it was time to step back and think about what’s next. After some consideration, I have made the decision to resign from my full time position at &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nordhealth&lt;/a&gt; to follow my passion and focus on building my own business instead.&lt;/p&gt;
&lt;p&gt;This post was also sparked by a question that my therapist recently asked me — &lt;em&gt;“Can you explain what are your personal values?”&lt;/em&gt; — because realizing that I couldn’t answer this immediately, gave me a pause.&lt;/p&gt;
&lt;p&gt;There’s a saying that you have probably heard about a dozen times if not more, &lt;em&gt;“the shoemakers children always go barefoot.”&lt;/em&gt; I am quoting this because in hindsight it seems almost predictable that when someone works defining &lt;a href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/&quot;&gt;design principles&lt;/a&gt; for their clients all day, they don’t necessarily stop and think: &lt;em&gt;Oh, maybe I should apply these same methods to my own life as well.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;But here we are, and I am finally doing this for myself. The following set of fundamental principles are something that I strongly believe in and which I think will guide me forward and help me do better decisions in the future.&lt;/p&gt;
&lt;div class=&quot;universe universe-relative&quot;&gt;&lt;/div&gt;
&lt;script&gt;
  document.addEventListener(&quot;DOMContentLoaded&quot;, function () {
    universe();
  });
&lt;/script&gt;
&lt;h2 id=&quot;1.-freedom&quot;&gt;1. Freedom &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#1.-freedom&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first one is the strongest principle on my list. &lt;em&gt;Freedom&lt;/em&gt; for me means the ability to follow whatever path I take. I don’t want to spend my life living someone else’s dream.&lt;/p&gt;
&lt;p&gt;I recently read an interview from &lt;a href=&quot;https://thecreativeindependent.com/people/author-and-illustrator-linda-liukas-on-building-a-career-out-of-curiosity/&quot;&gt;Linda Liukas&lt;/a&gt; where she said:&lt;/p&gt;
&lt;blockquote&gt;
“Coming from this background of Silicon Valley and Stanford, I put a lot of pressure on myself. What does success look like? What do the next steps look like? Should I open a school? Should this be a big company that employs a lot of people?”
&lt;/blockquote&gt;
&lt;p&gt;And later expanded it with:&lt;/p&gt;
&lt;blockquote&gt;
“One of the choices I’m most proud of is that early on, I realized that what success looks like for me is freedom and curiosity and the ability to follow whatever path I take.”
&lt;/blockquote&gt;
&lt;p&gt;This was something that deeply resonated with me, especially since I have a Silicon Valley background as well. I remember &lt;em&gt;freedom&lt;/em&gt; having such an important role in my life previously, but somewhere along the path, I somehow got lost. And I want to course correct now, years later.&lt;/p&gt;
&lt;h2 id=&quot;2.-curiosity&quot;&gt;2. Curiosity &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#2.-curiosity&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The second principle, &lt;em&gt;curiosity,&lt;/em&gt; maintains an intrinsic connection to &lt;a href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#1.-freedom&quot;&gt;the first&lt;/a&gt;. From my earliest years, I have possessed a fascination with the world surrounding me, coupled with a strong desire to understand how everything works. And I think it’s imperative that we deliberately cultivate this curiosity throughout our adult lives, or else risk losing this part of ourselves.&lt;/p&gt;
&lt;p&gt;If you want something that you have never had, you must be willing to do something you have never done. And I can accept that I will fail on the way there, perhaps repeatedly, but what I can’t accept is if I don’t even try.&lt;/p&gt;
&lt;p&gt;Maintaining and nurturing curiosity serves as a foundation to transcend my present limitations and go after new opportunities with confidence.&lt;/p&gt;
&lt;h2 id=&quot;3.-happiness&quot;&gt;3. Happiness &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#3.-happiness&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ll be honest, I have been feeling miserable for more than a year. Lots of things resulted in me feeling this way; going through a rough divorce, the difficulties I faced from some folks in the tech community because of my gender, going through and trying to survive from a sexual assault, continuously working on things that were on a fundamental level against my own values, inappropriate and offensive behaviour that I have witnessed on many occasions outside of work, a surgery that went sideways, and finally also experiencing a burnout caused by these things, and more…&lt;/p&gt;
&lt;p&gt;I remember years ago, the young version of me telling myself that &lt;em&gt;happiness is the single most important thing in life worth pursuing for.&lt;/em&gt; It’s what matters in the end. Living a life that makes you happy. Doing things that make you happy. And if something makes you feel miserable, stop doing it, cut it out of your life. And this is why the third principle on my list is &lt;em&gt;happiness.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The only limit to our realization of tomorrow will be our doubts of today. Don&#39;t let that yesterday take up too much space.&lt;/p&gt;
&lt;h2 id=&quot;4.-authenticity&quot;&gt;4. Authenticity &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#4.-authenticity&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The fourth principle, &lt;em&gt;authenticity,&lt;/em&gt; is somewhat contradictory. I chose it because I have lived a big part of my life being a people pleaser. And I want to live by fundamental principles that support a positive change. Not just something that already represent me, but things that I strongly believe in. Things that I should be doing more.&lt;/p&gt;
&lt;p&gt;I wrote previously about being tired of pretending and living my life for other people. And during the past four years I have started to understand that I don’t have to either. I have the freedom to be my authentic self, whatever form or shape that takes.&lt;/p&gt;
&lt;p&gt;It’s never too late to be what you might have been.&lt;/p&gt;
&lt;h2 id=&quot;5.-love&quot;&gt;5. Love &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#5.-love&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The best things in life cannot be seen or heard, they must be felt with heart. And I chose &lt;em&gt;love&lt;/em&gt; to be the last principle on my list, because fundamentally, I believe it is something one chooses to pursue. This ties together with my other principles, such as &lt;em&gt;&lt;a href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#1.-freedom&quot;&gt;freedom&lt;/a&gt;,&lt;/em&gt; because I believe the best way to do great work is to do what you love.&lt;/p&gt;
&lt;p&gt;But love, for me, is by no means tied to work. Of course, I want to work on things that I love doing, but ultimately, even with all its risks and contradic­tions, love is also something that can make our lives so much more.&lt;/p&gt;
&lt;p&gt;Recently, I read something that &lt;a href=&quot;https://cyhaaam.substack.com/p/the-paradox-of-love-longing-fear&quot;&gt;Cyhaaam wrote&lt;/a&gt; which felt like listening to my own inner thoughts:&lt;/p&gt;
&lt;blockquote&gt;
“I want love that is more than longing. Love that stays even when I am difficult, even when I am scared, even when I don’t know how to ask for it. Love that reminds me that fear and love are not opposites and that love is choosing to stay despite the fear.
&lt;p&gt;I write about love not because I understand it, but because I don’t. Because it undoes me. Because I still believe in it, even when I don’t know how to hold it.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cyhaaam then continues:&lt;/p&gt;
&lt;blockquote&gt;“Because love, for all its risks, for all its contradictions, is the only thing that has ever made life feel like more.”&lt;/blockquote&gt;
&lt;p&gt;And I want to live &lt;a href=&quot;https://arielsalminen.com/2024/a-love-letter/&quot;&gt;a life filled with love&lt;/a&gt; that nurtures, strengthens and comes when you least expect it. It’s a terrifying leap of faith, but I’ve neglegted that side of me for far too long in an effort to protect myself.&lt;/p&gt;
&lt;h2 id=&quot;what%E2%80%99s-next&quot;&gt;What’s Next? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/on-freedom-curiosity-and-happiness/#what%E2%80%99s-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since running &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;my own business&lt;/a&gt; and &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;doing consulting&lt;/a&gt; have always been things I find fulfilling, I have decided to try them again. What makes me happy isn’t necessarily working less, but rather the opportunity to focus on meaningful work that aligns with my passions.&lt;/p&gt;
&lt;p&gt;That said, I’m not dismissing full-time opportunities entirely. I recognize there are organizations that value passion and provide the kind of autonomy where I could flourish. However, for the time being, I believe establishing my own business offers the most direct path to creating this environment.&lt;/p&gt;
&lt;p&gt;I’m particularly happy to share that this week I have secured a significant new contract for my business: developing an entirely new design systems function for a major client that employs tens of thousands of people around the Nordics &lt;em&gt;(who shall remain unnamed for now, though I’m confident you’ll hear more about this collaboration later).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In parallel, I’m also taking on some smaller &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;design systems consulting&lt;/a&gt; work starting at the beginning of January, 2026. So if you’re wrestling with challenges and would like my help, &lt;a href=&quot;https://arielsalminen.com/contact/&quot;&gt;please get in touch&lt;/a&gt;. ✌🏻&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With love,&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Generating LLMs.txt Using Eleventy</title>
      <link href="https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/"/>
      <updated>2025-07-02T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/</id>
      <content type="html">&lt;p&gt;Large Language Models are increasingly relying on information found on the web, but often struggle to handle most websites in their entirety because the context windows are too small. In an attempt to solve this, there is a new emerging standard called &lt;a href=&quot;https://llmstxt.org/&quot;&gt;llms.txt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This proposal aims to standardize on using an &lt;code&gt;/llms.txt&lt;/code&gt; file to provide information to help LLMs use a website at inference time. The proposal is based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Markdown&quot;&gt;Markdown format&lt;/a&gt; as it’s the most widely and easily understood format for language models right now.&lt;/p&gt;
&lt;p&gt;Since my website uses &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; and the content is already written in Markdown format, I wanted to spend a few hours implementing this feature. Mainly to see how it could be utilized with different AI tools and if it &lt;em&gt;(already today)&lt;/em&gt; improves the visibility of my website’s content in various contexts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Side note:&lt;/strong&gt; I’ve previously had conflicting thoughts when it comes to the content on this website and whether I want that to be re-purposed by LLMs. I’ve since changed my mind on this though. Mainly because I realized that I want the information I provide here to be accessible to the widest possible range of users in the future. The method used to access or re-purpose the content isn’t something I want to try to control.&lt;/p&gt;
&lt;h2 id=&quot;what-goes-into-llms.txt&quot;&gt;What goes into LLMs.txt? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#what-goes-into-llms.txt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In its simplest form, an &lt;code&gt;/llms.txt&lt;/code&gt; looks like this. Note that the &lt;code&gt;Optional&lt;/code&gt; section holds a special meaning — if it’s included, the URLs provided there can be skipped if a shorter context is needed:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Title&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token blockquote punctuation&quot;&gt;&gt;&lt;/span&gt; Optional description goes here&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;Optional details go here&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Link title&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://link_url.md&lt;/span&gt;)&lt;/span&gt;: Optional link details&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Optional&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Link title&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://link_url.md&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Looks fairly straightforward? Ok, let’s try to implement this using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;preparing-robots.txt&quot;&gt;Preparing Robots.txt &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#preparing-robots.txt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get started, I first ended up removing the previously defined &lt;a href=&quot;https://arielsalminen.com/robots-block-ai-bots.txt&quot;&gt;AI Data Scrapers block list&lt;/a&gt; from my website’s &lt;code&gt;/robots.txt&lt;/code&gt; and simplified it to allow crawling for all user agents. The updated version looks like this:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Robots.txt of arielsalminen.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; www.robotstxt.org&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Allow crawling of all content&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;User-agent: *&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;Sitemap: https://arielsalminen.com/sitemap.xml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;creating-template-for-llms.txt&quot;&gt;Creating Template for LLMS.txt &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#creating-template-for-llms.txt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The next step was to create an &lt;code&gt;llms.njk&lt;/code&gt; template in the root of my website’s &lt;code&gt;src&lt;/code&gt; directory. This template basically takes care of generating the &lt;code&gt;/llms.txt&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; llms.txt
&lt;span class=&quot;token key atrule&quot;&gt;eleventyExcludeFromCollections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Ariel Salminen&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token blockquote punctuation&quot;&gt;&gt;&lt;/span&gt; Ariel Salminen is a Design Systems Architect from Helsinki, &lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;Finland with 20 years of experience helping companies build &lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;tools for the web platform.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the above example, I’m setting the &lt;code&gt;permalink&lt;/code&gt; option to define the output file name and use &lt;code&gt;eleventyExcludeFromCollections&lt;/code&gt; to make sure that this template isn’t included in any of the &lt;a href=&quot;https://www.11ty.dev/docs/collections/&quot;&gt;Eleventy collections&lt;/a&gt; I’m using elsewhere on the website.&lt;/p&gt;
&lt;h2 id=&quot;adding-posts-to-llms.txt&quot;&gt;Adding Posts to LLMS.txt &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#adding-posts-to-llms.txt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once I had a template to utilize, I created a simple Nunjucks &lt;code&gt;for&lt;/code&gt; loop to get the posts from my blog onto this template. They are all tagged with &lt;code&gt;post&lt;/code&gt;, so I used that collection directly:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- for page in collections.post | reverse %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [{{ page.data.title | safe }}](https://arielsalminen.com{{ page.url | replace(r/.$/, &quot;.md&quot;) }}){% if page.data.llms %}: {{ page.data.llms | safe }}{% endif %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- endfor %}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I’m keeping the URL the same as the original content, but replacing the ending with &lt;code&gt;.md&lt;/code&gt; instead. Additionally, if the post contains &lt;code&gt;llms&lt;/code&gt; meta data, that is also being added as a description to provide more context for the language models.&lt;/p&gt;
&lt;h2 id=&quot;serving-content-in-markdown-format&quot;&gt;Serving Content in Markdown Format &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#serving-content-in-markdown-format&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While my website’s content is written in &lt;em&gt;Markdown format&lt;/em&gt; already, Eleventy converts that into an HTML format in the build phase. The original &lt;code&gt;.md&lt;/code&gt; files also include some unnecessary meta data that I don’t really want to expose to the language models.&lt;/p&gt;
&lt;p&gt;To solve these problems, I ended up creating another template called &lt;code&gt;markdown.njk&lt;/code&gt; into the root of my &lt;code&gt;src&lt;/code&gt; directory with the following contents in it:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; collections.post&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; article&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.data.date | year }}/{{ article.data.title | slug }}.md&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;eleventyExcludeFromCollections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; {{ article.data.title | safe }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{{ article.rawInput | safe }}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This template makes sure that each post on my blog gets generated and served in Markdown format in addition to the HTML format, but with &lt;code&gt;.md&lt;/code&gt; appended at the end of the URL.&lt;/p&gt;
&lt;h2 id=&quot;adjusting-netlify-headers-for-.md-and-.txt&quot;&gt;Adjusting Netlify Headers for .MD and .TXT &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#adjusting-netlify-headers-for-.md-and-.txt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By default, &lt;a href=&quot;https://docs.netlify.com/routing/headers/&quot;&gt;Netlify&lt;/a&gt; seems to serve &lt;code&gt;.md&lt;/code&gt; and &lt;code&gt;.txt&lt;/code&gt; files with a charset that doesn’t support some common characters in UTF-8. To improve this, I modified the &lt;code&gt;Content-Type&lt;/code&gt; and &lt;code&gt;Cache-Control&lt;/code&gt; headers for these file types for a better experience:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key property&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*.md&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;headers.values&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token key property&quot;&gt;Cache-Control&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;max-age=3600,public,must-revalidate&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token key property&quot;&gt;Content-Type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;text/x-markdown; charset=utf-8&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key property&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*.txt&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;headers.values&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token key property&quot;&gt;Cache-Control&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;max-age=3600,public,must-revalidate&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token key property&quot;&gt;Content-Type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;text/plain; charset=utf-8&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;custom-descriptions-for-context&quot;&gt;Custom Descriptions for Context &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#custom-descriptions-for-context&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To provide more context about each page linked in the &lt;code&gt;/llms.txt&lt;/code&gt; file, I first tried to utilize the page’s description, and if that didn’t exist, utilize an excerpt from the beginning of the page instead.&lt;/p&gt;
&lt;p&gt;I quickly realized though that this doesn’t often provide the best possible context for the language models. After some tweaking, I ended up creating a custom &lt;a href=&quot;https://www.11ty.dev/docs/data-frontmatter/&quot;&gt;Front Matter&lt;/a&gt; variable called &lt;code&gt;llms&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;llms&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &quot;This article explains what CSS View Transitions are 
and how you can enable them for any website today.&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For each page on the website, this variable gets populated with more specific information about the content. Eventually, it gets injected into the &lt;code&gt;/llms.txt&lt;/code&gt; file after each Markdown link that is listed, like this:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Figma MCP Server&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/2025/figma-mcp-server.md&lt;/span&gt;)&lt;/span&gt;: This article explains what the Figma MCP Server is and how it helps LLMs with design-informed code generation.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Introducing Brands for Nord Design System&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system.md&lt;/span&gt;)&lt;/span&gt;: This article introduces Nord Design System’s latest 4.0 version which ships with a completely reimagined theming architecture.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Modern Way to Center Elements with CSS&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/2025/modern-way-to-center-elements-with-css.md&lt;/span&gt;)&lt;/span&gt;: This article explains how to center elements with CSS using only two lines, display: grid; and place-self: center;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;complete-llms-template&quot;&gt;Complete LLMS Template &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#complete-llms-template&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is what the complete &lt;code&gt;llms.njk&lt;/code&gt; template looks like at the time of writing this article:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; llms.txt
&lt;span class=&quot;token key atrule&quot;&gt;eleventyExcludeFromCollections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Ariel Salminen&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token blockquote punctuation&quot;&gt;&gt;&lt;/span&gt; Ariel Salminen is a Design Systems Architect from Helsinki, Finland with 20 years of experience helping companies build tools for the web platform.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;Important notes:&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Ariel Salminen has an extensive experience working on the web platform both as a designer and a developer. She often likes to describe that her job, in a design systems team, is about bridging the gap between designers, developers, and other disciplines in the company and that’s also where her greatest strengths lie.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Instead of working in silos, Ariel Salminen believes in a more collaborative process where we sketch our ideas in code or work closely together with the developers to achieve that.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Ariel Salminen is a systems thinker; designing for the whole rather than the individual parts. As an architect, she collaborates with design, product and engineering teams on the tactical and strategic direction of a design system and helps her clients set up the right tooling, processes and teams — all the way down to designing and developing complete design system platforms for them.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Ariel Salminen is based in Helsinki, Finland but is available for both local and remote design systems work around the world.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Main content{{&quot;&#92;n&quot;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- for page in collections.content %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [{{ page.data.title | safe }}]{% if page.data.llmLink %}({{ page.data.llmLink }}){% else %}(https://arielsalminen.com{{ page.url }}){% endif %}{% if page.data.llms %}: {{ page.data.llms | safe }}{% endif %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- endfor %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Supporting content{{&quot;&#92;n&quot;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- for page in collections.addons %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [{{ page.data.title | safe }}]{% if page.data.llmLink %}({{ page.data.llmLink }}){% else %}(https://arielsalminen.com{{ page.url }}){% endif %}{% if page.data.llms %}: {{ page.data.llms | safe }}{% endif %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- endfor %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Docs{{&quot;&#92;n&quot;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- for page in collections.post | reverse %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [{{ page.data.title | safe }}](https://arielsalminen.com{{ page.url | replace(r/.$/, &quot;.md&quot;) }}){% if page.data.llms %}: {{ page.data.llms | safe }}{% endif %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- endfor %}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Optional&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Testimonials&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/#testimonials&lt;/span&gt;)&lt;/span&gt;: Ariel Salminen’s clients and past colleagues share their experiences working with her.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Trusted by&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/#clients&lt;/span&gt;)&lt;/span&gt;: Companies that trust Ariel Salminen’s work.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Recent work&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/#work&lt;/span&gt;)&lt;/span&gt;: Ariel Salminen’s recent projects and achievements.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Resume&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://arielsalminen.com/resume.pdf&lt;/span&gt;)&lt;/span&gt;: Ariel Salminen’s résumé that contains a summary of relevant job experience and education.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…And here’s the final output: &lt;a href=&quot;https://arielsalminen.com/llms.txt&quot;&gt;https://arielsalminen.com/llms.txt&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m quite happy how simple Eleventy makes generating the &lt;a href=&quot;https://arielsalminen.com/llms.txt&quot;&gt;llms.txt&lt;/a&gt;. I also tested setting up an &lt;a href=&quot;https://github.com/langchain-ai/mcpdoc&quot;&gt;MCP Server&lt;/a&gt; to directly interact with the data using tools such as &lt;a href=&quot;https://www.cursor.com/&quot;&gt;Cursor&lt;/a&gt; and &lt;a href=&quot;https://claude.ai/&quot;&gt;Claude&lt;/a&gt;. &lt;code&gt;llms.txt&lt;/code&gt; seemed to significantly improve the accuracy of the replies and contextual suggestions.&lt;/p&gt;
&lt;p&gt;I also noticed that two weeks after adding this feature, the rankings and displayed meta data in the Google Search improved significantly for my website. Could be a coincidence, but the timing makes me suspicious. 🤷🏻‍♀️&lt;/p&gt;
&lt;p&gt;Ultimately, I can see how the &lt;code&gt;llms.txt&lt;/code&gt; standard can be beneficial in the context of a large documentation website such as the one we’ve built for &lt;a href=&quot;http://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt; &lt;em&gt;(especially if the proposed standard gets more widely adopted).&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further Reading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/generating-llms.txt-using-eleventy/#further-reading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://knock.app/blog/how-we-think-about-writing-for-robots-with-llms-txt&quot;&gt;How we think about writing for robots with llms.txt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://glaforge.dev/posts/2025/03/03/llms-txt-to-help-llms-grok-your-content/&quot;&gt;LLMs.txt to help LLMs grok your content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/langchain-ai/mcpdoc&quot;&gt;MCP LLMS-TXT Documentation Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llmstxt.org/&quot;&gt;llmstxt.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llmstxt.site/&quot;&gt;llmstxt.site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Community Assets in Nord Design System</title>
      <link href="https://arielsalminen.com/2025/community-assets-in-nord-design-system/"/>
      <updated>2025-06-11T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/community-assets-in-nord-design-system/</id>
      <content type="html">&lt;p&gt;As mentioned in my &lt;a href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/&quot;&gt;previous post&lt;/a&gt;, we recently introducing a completely new section for the Nord Design System, called &lt;a href=&quot;https://nordhealth.design/community-assets/&quot;&gt;Community Assets&lt;/a&gt;. These are product-specific assets from feature teams built using the &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System’s tools&lt;/a&gt;. These are not part of the core system, but may eventually be migrated into Nord for usage across all products.&lt;/p&gt;
&lt;a target=&quot;_blank&quot; href=&quot;https://nordhealth.design/community-assets/pcnf-filter-bar/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/community.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the community assets in Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Community Assets in &lt;a target=&quot;_blank&quot; href=&quot;https://nordhealth.design/community-assets/pcnf-filter-bar/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;My colleague &lt;a href=&quot;https://elwinvaneede.com/&quot;&gt;Elwin van Eede&lt;/a&gt; wrote a slightly &lt;a href=&quot;https://elwinvaneede.com/blog/2025/introducing-community-assets-for-nord-design-system/&quot;&gt;more detailed post&lt;/a&gt; about this. He explains how this new feature allows feature teams to more easily contribute to the design system with full autonomy, and how on a concep­tual level you can think of it as a design system component incubator.&lt;/p&gt;
&lt;p&gt;The community assets allow designers and developers within &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; to fully own their product-specific UI components and work at a relatively fast pace, while we in the design systems team can carry on working on the &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;core components&lt;/a&gt; at a slower, more considered pace.&lt;/p&gt;
&lt;p&gt;One of the aims of this feature is to also allow consumers of the design system to experiment and innovative more freely. The design system can then capture and share the successful experiments after they prove out.&lt;/p&gt;
&lt;p&gt;Read &lt;a href=&quot;https://elwinvaneede.com/blog/2025/introducing-community-assets-for-nord-design-system/&quot;&gt;Elwin’s full article&lt;/a&gt; to learn more:&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://elwinvaneede.com/blog/2025/introducing-community-assets-for-nord-design-system/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Figma MCP Server</title>
      <link href="https://arielsalminen.com/2025/figma-mcp-server/"/>
      <updated>2025-06-05T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/figma-mcp-server/</id>
      <content type="html">&lt;p&gt;I’m intrigued to see Figma announce their own &lt;a href=&quot;https://docs.anthropic.com/en/docs/agents-and-tools/mcp&quot;&gt;Model Context Protocol&lt;/a&gt; server to help LLMs achieve design-informed code generation. I’ve been &lt;em&gt;also&lt;/em&gt; prototyping one utilizing &lt;a href=&quot;https://github.com/GLips/Figma-Context-MCP&quot;&gt;Figma Context MCP&lt;/a&gt; that would provide a deeper integration between the &lt;a href=&quot;https://nordhealth.design/figma/&quot;&gt;Figma Toolkit&lt;/a&gt; and the code based tools such as &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt; in the Nord Design System.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/figma-mcp.png&quot; width=&quot;3264&quot; height=&quot;1836&quot; style=&quot;max-inline-size: 100%;&quot; alt=&quot;A screenshot showing how text and layer names for the current Figma selection show up in the MCP server’s output which allows LLMs more easily achieve design-informed code generation.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Text and layer names for the current Figma selection show up in the MCP server’s output which allows LLMs more easily achieve design-informed code generation.&lt;/span&gt;
&lt;p&gt;Until recently, the only way to provide design context to AI tools was to feed an image of a design or an API response to a chatbot. This has changed with the recent release of &lt;a href=&quot;https://docs.anthropic.com/en/docs/agents-and-tools/mcp&quot;&gt;Model Context Protocol&lt;/a&gt; (MCP), a standard for how applications provide context to LLMs.&lt;/p&gt;
&lt;p&gt;You could think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.&lt;/p&gt;
&lt;p&gt;Today, &lt;a href=&quot;https://www.figma.com/blog/introducing-figmas-dev-mode-mcp-server/&quot;&gt;Figma has released three new tools&lt;/a&gt; in their MCP server that allow you to get context from Figma for the current selection or a specific node: &lt;em&gt;one for code, another for images, and a third for variable definitions.&lt;/em&gt; You can also change the type of response the code tool returns inside the server settings, which allows for fine tuning based on the task at hand.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://www.figma.com/blog/introducing-figmas-dev-mode-mcp-server/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Introducing Brands for Nord Design System</title>
      <link href="https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/"/>
      <updated>2025-06-03T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/</id>
      <content type="html">&lt;p&gt;Over the past six weeks, my colleague and I have been working on a new major update for the &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;. The latest &lt;code&gt;4.0&lt;/code&gt; version launched a few weeks ago now unifies Nordhealth’s two design system platforms into a single platform that can serve all of the feature teams across the entire organization and various business units within.&lt;/p&gt;
&lt;p&gt;We identified this consolidation as a necessary step to strengthen the organization’s design system infrastructure and better support the next generation of applications and generative AI experiences that the feature teams are working on.&lt;/p&gt;
&lt;p&gt;To learn more about the new features included in the latest release, keep reading below for details. ✨&lt;/p&gt;
&lt;a target=&quot;_blank&quot; href=&quot;https://www.linkedin.com/posts/arielsalminen_our-team-just-published-a-new-major-version-activity-7325480561924362241-x_Nc&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord-brands/linkedin.png&quot; style=&quot;max-inline-size: 100%;&quot; width=&quot;1966&quot; height=&quot;1672&quot; alt=&quot;Screenshot of the version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;overview-of-changes&quot;&gt;Overview of Changes &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#overview-of-changes&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The latest version of &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt; now ships with two distinctive brands, &lt;a href=&quot;https://nordhealth.design/?theme=nord&quot;&gt;therapy&lt;/a&gt; and &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;veterinary&lt;/a&gt;. You can choose the currently active brand from the top left corner of the updated &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;documentation platform&lt;/a&gt;. Once chosen, you will get content that is tailored specifically for the brand and the business unit you’re working in:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/switch.png&quot; width=&quot;1760&quot; height=&quot;936&quot; alt=&quot;Screenshot of the version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Brand switcher in the latest version of &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;While this is a major change for the underlying architecture of Nord Design System, we’ve kept it as backwards compatible as possible so that the upgrade path would stay straight­forward. Hence, this major release doesn’t include any breaking changes for the existing users.&lt;/p&gt;
&lt;p&gt;Introducing this new layer of abstraction into Nord’s theming architecture means that it now consists of the following four layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;Foundations&lt;/a&gt;:&lt;/strong&gt; The foundations for building the next generation of apps and generative AI experiences at Nordhealth.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/start/&quot;&gt;Brands&lt;/a&gt;:&lt;/strong&gt; Any business unit specific customizations.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Interface Modes&lt;/a&gt;:&lt;/strong&gt; Light, dark, and high contrast themes.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/themes/#accent-color&quot;&gt;Accent Color&lt;/a&gt;:&lt;/strong&gt; For apps that provide custom theming.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;improved-documentation&quot;&gt;Improved Documentation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#improved-documentation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While creating the technical foundations to support this newly introduced &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;theming architecture&lt;/a&gt;, I have been on the side also improving the design and usability of the documentation platform ever so slightly. The latest iteration looks like this:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/docs.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Version 4.0 of &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;All pages within the documentation platform are updated as well. The &lt;a href=&quot;https://nordhealth.design/tokens/?theme=vet&quot;&gt;design tokens&lt;/a&gt; for example now ship with a total of 8 different interface theme modes which you can view by switching the brands:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/tokens/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/tokens.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the design tokens in version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Design Tokens in version 4.0 of &lt;a href=&quot;https://nordhealth.design/tokens/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;We have also upgraded all of the existing &lt;a href=&quot;https://nordhealth.design/components/?theme=vet&quot;&gt;web components&lt;/a&gt; to support the new theming architecture so that they can be used as building blocks for any brand specific applications within &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt;:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/components/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/components.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the web components in version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Web Components in version 4.0 of &lt;a href=&quot;https://nordhealth.design/components/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;I also wrote an in-depth &lt;a href=&quot;https://nordhealth.design/migration/4.0.0/?theme=vet&quot;&gt;migration guide&lt;/a&gt; that will help developers to transition an existing project from using an older version of Nord Design System to using the latest &lt;code&gt;4.0&lt;/code&gt; version:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/migration/4.0.0/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/migration.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the migration guide in version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Migration guide for version 4.0 of &lt;a href=&quot;https://nordhealth.design/migration/4.0.0/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;introducing-community-assets&quot;&gt;Introducing Community Assets &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#introducing-community-assets&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have introducing a completely new section for the documentation platform, called &lt;a href=&quot;https://nordhealth.design/community-assets/&quot;&gt;Community Assets&lt;/a&gt;. These are product-specific community assets from feature teams built using the Nord Design System’s tools. These are not part of the core system, but may eventually be migrated into Nord for usage across all products:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/community-assets/pcnf-filter-bar/?theme=vet&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/community.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the community assets in Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Community Assets in &lt;a href=&quot;https://nordhealth.design/community-assets/pcnf-filter-bar/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;The high level aim here has been to enable the feature teams to be able to ship things faster, while also providing a platform that works as a single source of truth for both design and frontend related documentation.&lt;/p&gt;
&lt;p&gt;Previously, without this functionality, one of two things kept happening:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firstly, the core design system started to become polluted with product-specific components and documentation, making the system unusable for the rest of the org.&lt;/li&gt;
&lt;li&gt;Secondly, the previous setup put the design system team in a role where we were sometimes slowing down the product development in order to prevent the feature teams from creating too much deviation from the existing design system conventions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By introducing &lt;a href=&quot;https://nordhealth.design/community-assets/pcnf-filter-bar/?theme=vet&quot;&gt;this new abstraction&lt;/a&gt;, we can more easily preserve the integrity of the core system while also letting feature teams do what they need within the same space and ship things faster.&lt;/p&gt;
&lt;h2 id=&quot;updated-theme-builder&quot;&gt;Updated Theme Builder &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#updated-theme-builder&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have updated the &lt;a href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;theme builder&lt;/a&gt; that I originally built for quickly testing out the &lt;a href=&quot;https://nordhealth.design/themes/#accent-color&quot;&gt;accent color&lt;/a&gt; feature to support the latest theming architecture. Now you can test all new interface theme modes in one go:&lt;/p&gt;
&lt;a target=&quot;_blank&quot; href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/theme-builder.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the theme builder in Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Theme Builder in &lt;a href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;updated-color-generator&quot;&gt;Updated Color Generator &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#updated-color-generator&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://nordhealth.design/color-generator/?theme=vet&amp;amp;color=%23401197&amp;amp;gray=true&quot;&gt;color generator&lt;/a&gt; is a tool that generates color palettes program­matically for use with Nord Themes. I originally built this for developing our existing color palettes and testing out new color variations. Color generator now also supports the new interface theme modes:&lt;/p&gt;
&lt;a target=&quot;_blank&quot; href=&quot;https://nordhealth.design/color-generator/?theme=vet&amp;color=%23401197&amp;gray=true&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/color-generator.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the color generator in Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Color Generator in &lt;a href=&quot;https://nordhealth.design/color-generator/?theme=vet&amp;color=%23401197&amp;gray=true&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;improved-accessibility-checklist&quot;&gt;Improved Accessibility Checklist &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#improved-accessibility-checklist&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord’s &lt;a href=&quot;https://nordhealth.design/accessibility-checklist/&quot;&gt;accessibility checklist&lt;/a&gt; also got some minor updates in this release. This is a tool that helps us improve the experience for everyone who uses our products and ensures our high standards for accessibility are met:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/accessibility-checklist/&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/a11y.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the accessibility checklist in Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Accessibility Checklist in &lt;a href=&quot;https://nordhealth.design/accessibility-checklist/&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;deprecating-react-components&quot;&gt;Deprecating React Components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#deprecating-react-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With the recent &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#support-for-custom-elements&quot;&gt;release of React 19&lt;/a&gt; and the added support for Custom Elements, we have decided to deprecate the &lt;code&gt;@nordhealth/react&lt;/code&gt; package and it will be removed in the next major release.&lt;/p&gt;
&lt;p&gt;For now, &lt;code&gt;@nordhealth/react&lt;/code&gt; will continue to receive updates as its build is fully automated, but you should start planning on utilizing the &lt;code&gt;@nordhealth/components&lt;/code&gt; package directly where possible as React now ships with full support for &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;web components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To continue having type checking and auto-completion in your JSX, you can use the new &lt;code&gt;react.d.ts&lt;/code&gt; type definition file by adding the following to your &lt;code&gt;tsconfig.json&lt;/code&gt; in a TypeScript project, or &lt;code&gt;jsconfig.json&lt;/code&gt; in a JavaScript project:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;compilerOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;types&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nordhealth/components/lib/react.d.ts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;deprecating-vue-types&quot;&gt;Deprecating Vue Types &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#deprecating-vue-types&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To unify the experience of using Nord, we have also decided to make the Vue-specific types for our components part of the &lt;code&gt;@nordhealth/components&lt;/code&gt; package and deprecate the separate &lt;code&gt;@nordhealth/vue&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;The types can now be retrieved from the new &lt;code&gt;vue.d.ts&lt;/code&gt; type definition file instead by adding the following to your &lt;code&gt;tsconfig.json&lt;/code&gt; in a TypeScript project, or &lt;code&gt;jsconfig.json&lt;/code&gt; in a JavaScript project:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;compilerOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;types&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nordhealth/components/lib/vue.d.ts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;project-statistics&quot;&gt;Project Statistics &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#project-statistics&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From a pure developer and codebase perspective, the &lt;a href=&quot;https://nordhealth.design/changelog/&quot;&gt;new release&lt;/a&gt; and &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;theming architecture&lt;/a&gt; introduced required the following over the six week period my colleague and I worked on it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total of 233 commits&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;246 changed files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;13 098 added lines of code&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8 740 removed lines of code&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;200 new design tokens&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6 weeks of time&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://github.com/arielsalminen&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/statistics.png&quot; style=&quot;max-inline-size:100%;&quot; width=&quot;1824&quot; height=&quot;1202&quot; alt=&quot;Screenshot of the project statistics from GitHub.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Project statistics from &lt;a href=&quot;https://github.com/arielsalminen&quot;&gt;GitHub&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;The added design tokens are purely coming from the number of interface mode themes added (4). In total, Nord Design System now has &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;448 design tokens&lt;/a&gt; split across the following categories:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/token-stats.jpg&quot; style=&quot;max-inline-size:100%;&quot; width=&quot;1444&quot; height=&quot;848&quot; alt=&quot;Nord Design Tokens illustrated in a bar chart.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Design Tokens in &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;For &lt;a href=&quot;https://nordhealth.design/tokens/#color&quot;&gt;colors&lt;/a&gt; specifically, it is worth mentioning that many of them are aliases so the above bar chart may be a little misleading in that sense.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; now has a design system platform that can better support the growing needs of the organization. The &lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;new platform&lt;/a&gt; supports creating specific guidelines and solutions for each business unit where needed. With this added flexibility they’re able to move quicker and it’s easier than ever for feature teams to contribute back to the design system.&lt;/p&gt;
&lt;p&gt;Finally, if it wasn’t already obvious by looking at the documentation, we have also kept the &lt;a href=&quot;https://nordhealth.design/?theme=nord&quot;&gt;orginal theme&lt;/a&gt; that you may have grown used to, but it has been polished ever so slightly:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/?theme=nord&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/nord-brands/nord.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;Screenshot of the version 4.0 of Nord Design System.&quot; /&gt;
&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Version 4.0 of &lt;a href=&quot;https://nordhealth.design/?theme=nord&quot;&gt;Nord Design System&lt;/a&gt;.&lt;/span&gt;
&lt;p&gt;Have fun exploring the latest version of &lt;em&gt;&lt;a href=&quot;https://nordhealth.design/?theme=vet&quot;&gt;Nord Design System&lt;/a&gt;&lt;/em&gt; and let me know on &lt;a href=&quot;https://www.linkedin.com/posts/arielsalminen_our-team-just-published-a-new-major-version-activity-7325480561924362241-x_Nc&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://bsky.app/profile/arielsalminen.com/post/3loiqs7kkk22e&quot;&gt;Bluesky&lt;/a&gt; if you have any questions. ✌🏻&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further Reading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/introducing-brands-for-nord-design-system/#further-reading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/2025/community-assets-in-nord-design-system/&quot;&gt;Community Assets in Nord Design System&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Modern Way to Center Elements with CSS</title>
      <link href="https://arielsalminen.com/2025/modern-way-to-center-elements-with-css/"/>
      <updated>2025-05-28T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/modern-way-to-center-elements-with-css/</id>
      <content type="html">&lt;p&gt;If you’ve worked with CSS for a longer period, you’ve probably seen and used about a dozen different ways to center block-level elements on the page. These methods used to vary between a combination of &lt;a href=&quot;https://css-tricks.com/negative-margins/&quot;&gt;negative margins&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/translate&quot;&gt;CSS translations&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/CSS_layout/Flexbox&quot;&gt;Flexbox&lt;/a&gt;, and more. Heck, I’ve even used the infamous &lt;code&gt;display: table&lt;/code&gt; back in the day.&lt;/p&gt;
&lt;p&gt;Fortunately, we today have a solution that requires only two lines of CSS, &lt;code&gt;display: grid&lt;/code&gt; and &lt;code&gt;place-self: center&lt;/code&gt;. The following code snippet will position any item in the middle of the container both vertically and horizontally:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.center&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* Place this item in the middle of the container
   * both vertically and horizontally. */&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;place-self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also use &lt;code&gt;place-content&lt;/code&gt; on the container itself to center all child items in the middle both vertically and horizontally:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* Place all items in the container in the middle
   * both vertically and horizontally. */&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;place-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In case you want to stack these items, you can utilize another simple property, &lt;code&gt;grid-area&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.center&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* Place this item in the middle of the container
   * both vertically and horizontally. */&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;place-self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* Stack all items on the same grid area. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1/1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I hope you find this useful! I first learned about the above method for stacking with &lt;code&gt;grid-area&lt;/code&gt; from &lt;a href=&quot;https://bsky.app/profile/anatudor.bsky.social/post/3ley64k4zsc2q&quot;&gt;Ana Tudor&lt;/a&gt;. Here’s also a quick &lt;a href=&quot;https://codepen.io/arielsalminen/pen/NPqPVGW&quot;&gt;Codepen&lt;/a&gt; to demonstrate the modern way to center elements with CSS:&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-default-tab=&quot;css,result&quot; data-slug-hash=&quot;NPqPVGW&quot; data-pen-title=&quot;Untitled&quot; data-user=&quot;arielsalminen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/arielsalminen/pen/NPqPVGW&quot;&gt;
  Untitled&lt;/a&gt; by Ariel Salminen (&lt;a href=&quot;https://codepen.io/arielsalminen&quot;&gt;@arielsalminen&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io/&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://public.codepenassets.com/embed/index.js&quot;&gt;&lt;/script&gt;</content>
    </entry>
    
    <entry>
      <title>View Transitions for Any Website</title>
      <link href="https://arielsalminen.com/2025/view-transitions-for-any-website/"/>
      <updated>2025-05-26T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/view-transitions-for-any-website/</id>
      <content type="html">&lt;p&gt;View Transitions are probably one of my favorite CSS features at the moment. You can enable them for any site today by adding the following code snippet into your CSS. This will immediately make the experience of using your website smoother by fundamentally changing the behavior of what happens when people navigate from one page to another:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@view-transition&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;navigation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setting &lt;code&gt;navigation: auto;&lt;/code&gt; ensures that any element that’s the same from one page to the next stays exactly in place. You can try it out yourself by navigating the pages on &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;my website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The difference with &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&quot;&gt;view transitions&lt;/a&gt; enabled is that the background and any repeating elements stay constant. And then anything that’s different, will be transitioned using a crossfade.&lt;/p&gt;
&lt;p&gt;To further improve the example &lt;em&gt;(especially if you’re building more complex transitions)&lt;/em&gt; you could wrap these styles inside &lt;code&gt;prefers-reduced-motion&lt;/code&gt; media query:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@view-transition&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;navigation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allows you to reduce motion for users with motion sensitivity while keeping the transitions for users who have not indicated their preference.&lt;/p&gt;
&lt;p&gt;You can read more about the feature from the &lt;a href=&quot;https://webkit.org/blog/16967/two-lines-of-cross-document-view-transitions-code-you-can-use-on-every-website-today/&quot;&gt;Webkit blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://webkit.org/blog/16967/two-lines-of-cross-document-view-transitions-code-you-can-use-on-every-website-today/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Building Search Index with Eleventy</title>
      <link href="https://arielsalminen.com/2025/building-search-index-with-eleventy/"/>
      <updated>2025-05-25T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/building-search-index-with-eleventy/</id>
      <content type="html">&lt;p&gt;One of the features that I’m quite happy about on my &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;new website&lt;/a&gt; is the built-in search functionality and how the search index gets built for it. You can test it out yourself by pressing &lt;kbd class=&quot;modifier control-key&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;K&lt;/kbd&gt; and entering a search query into the input that is revealed:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/search.jpg&quot; width=&quot;1676&quot; height=&quot;1730&quot; alt=&quot;Screenshot of the search feature.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Screenshot of the search feature.&lt;/span&gt;
&lt;p&gt;I’ve built this feature using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; and some custom filter logic that I will attempt to explain in this post. While I realize that a lot of the functionality here could be further simplified especially with some built-in logic that &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; nowadays provides, I’ve so far left it as is &lt;em&gt;(since it works!)&lt;/em&gt; and focused on improving other bits.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/#getting-started&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get started building a similar feature for your own Eleventy website, you will first want to create a Nunjucks template named &lt;code&gt;search.njk&lt;/code&gt;. The overall idea here is that this template will pick up all contents from the Eleventy &lt;code&gt;search&lt;/code&gt; collection:&lt;/p&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;eleventyExcludeFromCollections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;eleventyImport&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token variable&quot;&gt;collections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;search&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;collections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;searchIndex&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;dump&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;safe&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;searchIndex&lt;/code&gt; filter in this template takes care of constructing the search index strings by removing unnecessary symbols and such in addition to things like html elements and other bits that’d break the final JSON output. I will explain how to build this in a moment.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;dump&lt;/code&gt; filter is &lt;a href=&quot;https://mozilla.github.io/nunjucks/templating.html#dump&quot;&gt;Nunjucks’ built-in filter&lt;/a&gt; that calls &lt;code&gt;JSON.stringify&lt;/code&gt; on the returned object. This basically converts the data into a JSON format that can be consumed by the clientside JavaScript on this website.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;safe&lt;/code&gt; filter here is another &lt;a href=&quot;https://mozilla.github.io/nunjucks/templating.html#safe&quot;&gt;Nunjucks’ built-in filter&lt;/a&gt; that marks the value as safe which means that in an environment with automatic escaping enabled this variable will not be escaped.&lt;/p&gt;
&lt;h2 id=&quot;adding-content-to-the-search-collection&quot;&gt;Adding Content to the Search Collection &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/#adding-content-to-the-search-collection&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While you might want to utilize &lt;code&gt;collections.all&lt;/code&gt; in the &lt;code&gt;search.njk&lt;/code&gt; template instead of a custom &lt;code&gt;search&lt;/code&gt; collection, you may quickly run into Eleventy’s &lt;code&gt;Tried to use templateContent too early&lt;/code&gt; error depending on how you’ve set up the rest of your website. To avoid this, I would recommend you to define a specific collection for the search results instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For my own website, I’ve set it up like this:&lt;/strong&gt; For the blog posts, I have a directory data file called &lt;code&gt;posts.json&lt;/code&gt; in the root of my &lt;code&gt;src/posts&lt;/code&gt; directory that sets this tag automatically for all of the posts in the blog:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;tags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;post&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;layout&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;layouts/post.njk&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Similarly, for any individual pages that I want to be picked up by the search, I’ve set this in the page’s frontmatter:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; layouts/layout.njk&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Home&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Hello&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; I’m Ariel Salminen&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; a Design Systems Architect from Helsinki&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Finland with 20 years of experience helping companies build tools for the web platform.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; page&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; search&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;creating-search-index-filter&quot;&gt;Creating Search Index Filter &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/#creating-search-index-filter&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next, we will create an Eleventy filter that can be used to format the data in a way that can be easily searched. To get started, create a new file called &lt;code&gt;searchIndex.js&lt;/code&gt; inside &lt;code&gt;src/_filters&lt;/code&gt; directory and paste the following &lt;code&gt;indexer&lt;/code&gt; function to the beginning of the file you just created:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*!
&lt;span class=&quot;highlight-line&quot;&gt; * Creates an index of searchable keywords.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * &lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * https://arielsalminen.com&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * MIT License&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * @param  {String} Template contents&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * @return {String} List of keywords&lt;/span&gt;
 */&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;indexer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Convert text to all lower case&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Remove HTML elements&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; plain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unescape&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&amp;lt;.*?&gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gis&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Remove other unnecessary characters from the index&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; plain&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[&#92;,|&#92;?|&#92;n|&#92;|&#92;&#92;&#92;*]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove punctuation, newlines, and special chars&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&#92;b(&#92;,|&quot;|#|&#39;|;|:|&quot;|&quot;|&#39;|&#39;|“|”|‘|’)&#92;b&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gi&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove punctuation at word boundaries&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[ ]{2,}&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove repeated spaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This function returns a string that includes an index of searchable keywords from whatever content you pass to it. Depending on your content, you may need to tweak the &lt;code&gt;replace&lt;/code&gt; logic slightly to fit your needs. Be conscious about characters that may break the JSON output.&lt;/p&gt;
&lt;p&gt;Additionally, we want to create a separate &lt;code&gt;excerpt&lt;/code&gt; function that takes care of squashing the original text contents of the page into a short excerpt that can be displayed in the search results. To achieve this, paste the following code &lt;em&gt;after&lt;/em&gt; the &lt;code&gt;indexer&lt;/code&gt; function in the same &lt;code&gt;searchIndex.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*!
&lt;span class=&quot;highlight-line&quot;&gt; * Create an excerpt from the template contents.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * &lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * https://arielsalminen.com&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * MIT License&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * @param  {String} Template contents&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; * @return {String} The excerpt&lt;/span&gt;
 */&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;excerpt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Remove HTML elements and headings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; plain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unescape&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&#92;&amp;lt;h1(.*)&#92;&gt;(.*)&#92;&amp;lt;&#92;/h1&#92;&gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&amp;lt;.*?&gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gis&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Remove other unnecessary characters from the text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; plain&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[&quot;&#39;#]|&#92;n&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove quotes, hashtags, and newlines&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&amp;amp;(&#92;S*)&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove HTML entities&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[ ]{2,}&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove repeated spaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[&#92;&#92;|]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove special characters&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;140&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Only 140 first chars&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This function returns an excerpt from whatever content you pass to it. Again, depending on your content, you may want to tweak the &lt;code&gt;replace&lt;/code&gt; logic slightly to fit your needs. Please note though that it’s necessary to replace or escape certain characters to not break the JSON output.&lt;/p&gt;
&lt;p&gt;Once you have these two functions in place, you should define the &lt;code&gt;searchIndex&lt;/code&gt; filter that will be utilizing the above functions. To create that, paste the below code at the end of the &lt;code&gt;searchIndex.js&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;searchIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;collection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; search &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; collection&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;page&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;excludeFromSearch&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; templateContent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; description &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;excerpt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;description&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;excerpt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;templateContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keywords &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;title&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;templateContent&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;description&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Ariel Salminen&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;readabletitle&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;indexer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        keywords&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; search &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, you will need to register this new filter in your &lt;code&gt;eleventyConfig&lt;/code&gt;. To do that, add the following into your &lt;code&gt;.eleventy.js&lt;/code&gt; file, like so:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;searchIndex&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./src/_filters/searchIndex.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it! With these steps you should now have a fairly functional starting point to tweak your search index and its settings further.&lt;/p&gt;
&lt;h2 id=&quot;json-output&quot;&gt;JSON Output &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/#json-output&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The final JSON output from the &lt;code&gt;search.njk&lt;/code&gt; template will look something like this and is accessible through &lt;code&gt;/search.json&lt;/code&gt; URL in the browser:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;search&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/services/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Services&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Design isn&#39;t just about the look and feel. Design is how it works, and I believe the best way to focus on this is to work as close to the end product as possible. Design Systems I help my clients set up the right tooling, process&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;readabletitle&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;services&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;keywords&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;services my services design isn&#39;t just about the look and feel. design is how it works and i believe the best way to focus on this is to work as close to the end product as possible. design systems i help my clients set up the right tooling processes and teams all the way to designing and developing complete design system platforms for them. […]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/webrings/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Webrings&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Webrings let you browse related websites in one big loop. This website belongs to a few of them.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;readabletitle&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;webrings&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;keywords&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;webrings webrings webrings let you browse related websites in one big loop. this site belongs to a few of them. design systems webring a webring for design system practitioners. css joy a webring for those who take joy in messing around with css. a11y-webring.club a webring for digital accessibility practitioners. bucket webring a webring for cool people who like to make things. […]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fetching-the-json&quot;&gt;Fetching the JSON &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/#fetching-the-json&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To further test your implementation in the browser, you could create a simple &lt;code&gt;fetch&lt;/code&gt; function to get this data when the search is activated and manipulate the results further:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getSearchData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;searchIndex &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/search.json?v=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        searchIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;No search index found!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial obviously leaves the clientside implementation to be up to the reader to build, but having &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; generate a searchable index with keywords is a great start if you want to implement a similar functionality into your own website.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Optimizing Webfont Performance</title>
      <link href="https://arielsalminen.com/2025/optimizing-webfont-performance/"/>
      <updated>2025-05-24T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/optimizing-webfont-performance/</id>
      <content type="html">&lt;p&gt;Webfonts play a crucial role in giving &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;our websites&lt;/a&gt; personalized feel, but they can also be a hidden culprit behind sluggish load times. If you’ve ever wondered why your beautifully designed site isn’t performing optimally, inefficient font loading strategy might be to blame. In this article, we’ll delve into practical strategies to enhance your webfont performance, ensuring a better user experience.&lt;/p&gt;
&lt;p&gt;Back in January, when I was working on the website’s design and setting up the foundations for it, I eventually settled on a specific typeface called &lt;a href=&quot;https://www.hvdfonts.com/fonts/brandon-text&quot;&gt;Brandon Text&lt;/a&gt; from the &lt;a href=&quot;https://www.hvdfonts.com/&quot;&gt;HvD Fonts&lt;/a&gt; type foundry. After purchasing the license and downloading the webfonts, I quickly became aware that the webfonts would in their &lt;em&gt;(then)&lt;/em&gt; current form be the single biggest resource downloaded over the network.&lt;/p&gt;
&lt;p&gt;For context, I’m using four different styles of &lt;a href=&quot;https://www.hvdfonts.com/fonts/brandon-text&quot;&gt;Brandon Text&lt;/a&gt;: Regular, Regular Italic, Bold, and Black.&lt;/p&gt;
&lt;h2 id=&quot;ensuring-text-visibility-during-loading&quot;&gt;Ensuring Text Visibility During Loading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/#ensuring-text-visibility-during-loading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first thing that you’d usually do to improve webfont performance is to ensure that your website’s text remains visible during font loading. To achieve this, I’m using &lt;code&gt;font-display:swap&lt;/code&gt; in the &lt;code&gt;@font-face&lt;/code&gt; rule in CSS:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;brandon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;/fonts/brandon.woff2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; swap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above ensures that the user can still read the content using a fallback font if the webfont does not load or takes a long time to load.&lt;/p&gt;
&lt;p&gt;This approach creates another problem though, which is layout shift caused by deferred fonts. Basically, you may now at times temporarily get a system font and experience a flash of unstyled text (FOUT).&lt;/p&gt;
&lt;p&gt;To combat this, I ended up defining a local &lt;code&gt;@font-face&lt;/code&gt; rule as well with &lt;code&gt;size-adjust&lt;/code&gt; and &lt;code&gt;ascent-override&lt;/code&gt; to more closely match the fallback font and the actual webfont that I wanted to be displayed:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Make a custom fallback font based on the local Arial */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;brandon-fallback&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 93%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;ascent-override&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 117%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Arial&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, in my &lt;code&gt;font-family&lt;/code&gt; declaration, I’m defining it like so:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;   &lt;span class=&quot;token property&quot;&gt;--font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;brandon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;brandon-fallback&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* …Later in another CSS partial: */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--font-family&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;preloading-webfonts&quot;&gt;Preloading Webfonts &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/#preloading-webfonts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To further improve things, I also wanted to make sure that the webfonts are being preloaded for optimal loading speed to minimize the flash of unstyled text. To achieve this, I added the following &lt;code&gt;link&lt;/code&gt; elements to the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of the website:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/fonts/brandon.woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font/woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/fonts/brandon-italic.woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font/woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/fonts/brandon-black.woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font/woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/fonts/brandon-bold.woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font/woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;configuring-caching&quot;&gt;Configuring Caching &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/#configuring-caching&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I also wanted to make sure that the webfonts would get served through the content delivery network using optimal caching. I’m using &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; to host this website, so to tweak this, I utilized the &lt;code&gt;netlify.toml&lt;/code&gt; configuration and added the following:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key property&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*.woff2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;headers.values&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token key property&quot;&gt;Cache-Control&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;max-age=31536000,public,must-revalidate&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;offline-support&quot;&gt;Offline Support &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/#offline-support&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since my website is also a &lt;a href=&quot;https://en.wikipedia.org/wiki/Progressive_web_app&quot;&gt;progressive web app&lt;/a&gt;, I wanted to make sure that the webfonts would stay functional in case the network connection fails. So I added the following into the website’s &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API&quot;&gt;service worker&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;updateStaticCache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; caches&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;staticCacheName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;staticCache&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; staticCache&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token string&quot;&gt;&quot;/fonts/brandon.woff2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token string&quot;&gt;&quot;/fonts/brandon-italic.woff2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token string&quot;&gt;&quot;/fonts/brandon-black.woff2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token string&quot;&gt;&quot;/fonts/brandon-bold.woff2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;subsetting-webfonts&quot;&gt;Subsetting Webfonts &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/#subsetting-webfonts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While these steps improved the overall webfont performance, they still left me with the problem that the webfonts were the single biggest resource being downloaded over the network on the first visit.&lt;/p&gt;
&lt;p&gt;Being conscious about webfont licensing and the limitations they usually have, I reached out to the type foundry directly to see if they’d allow me to subset the webfonts:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/email.jpg&quot; width=&quot;1488&quot; height=&quot;1998&quot; loading=&quot;lazy&quot; class=&quot;image-padding&quot; alt=&quot;Screenshot of me nerding about the webfonts in an email to the type foundry after I got their permission to subset the fonts.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Me nerding about the webfonts in an email to the type foundry. ❤️&lt;/span&gt;
&lt;p&gt;Once I had their permission to subset the webfonts, I ended up building an automation to do just that in the build phase. I made it work so that the source code still contains the original font files, but only subsets of them get deployed to the CDN. This way, I now always have the right subset of characters needed to serve this website’s content, but nothing extra.&lt;/p&gt;
&lt;p&gt;To achieve this, I used &lt;a href=&quot;https://github.com/zachleat/glyphhanger&quot;&gt;Glyphanger&lt;/a&gt; and made this process a part of the build script. The way Glyphanger works is that it analyzes the pages on this website to find the necessary glyphs, and then subsets the original fonts using the &lt;code&gt;unicode-ranges&lt;/code&gt; it finds.&lt;/p&gt;
&lt;p&gt;While I won’t go into detail of the whole automated build process in this post, I still wanted to provide the manual steps for anyone wanting to do something similar. To get started, you should first install &lt;a href=&quot;https://github.com/zachleat/glyphhanger&quot;&gt;Glyphanger&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; glyphhanger&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, run the following command to install the necessary Python dependencies (tested on the latest macOS):&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;pip3 &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; fonttools brotli zopfli&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you’ve installed the dependencies, run the below command to get the glyphs. This will give you the &lt;code&gt;unicode-range&lt;/code&gt; used:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;glyphhanger https://arielsalminen.com&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also specify multiple URLs and they can be local too:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;glyphhanger https://arielsalminen.com https://arielsalminen.com/about/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, you can use the returned &lt;code&gt;unicode-range&lt;/code&gt; with the &lt;code&gt;--whitelist&lt;/code&gt; option to subset the webfonts:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;glyphhanger &lt;span class=&quot;token parameter variable&quot;&gt;--whitelist&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;U+20,U+61-7A &lt;span class=&quot;token parameter variable&quot;&gt;--formats&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;woff2,woff &lt;span class=&quot;token parameter variable&quot;&gt;--subset&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;brandon.otf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;--formats&lt;/code&gt; option in the above script defines which formats Glyphanger should output. The &lt;code&gt;--subset&lt;/code&gt; option refers to the original font file that you want to subset.&lt;/p&gt;
&lt;h2 id=&quot;the-outcome&quot;&gt;The Outcome &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/#the-outcome&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m quite happy with this solution since the website source still contains the original font files, but with the subsetting, I managed to get the weight down from &lt;code&gt;350.3KB&lt;/code&gt; to just &lt;code&gt;147.7KB&lt;/code&gt;. A reduction of &lt;code&gt;202.6KB&lt;/code&gt; on the data transferred over the network on the first visit.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The 10th Edition of Arielsalminen.com</title>
      <link href="https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/"/>
      <updated>2025-05-23T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/</id>
      <content type="html">&lt;p&gt;Over the past month I’ve been slowly handcrafting a &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;new website&lt;/a&gt; for myself to better showcase what I do and have a future home for experiments I may want to tinker with. Designing the whole thing in the browser using &lt;code&gt;HTML&lt;/code&gt;, &lt;code&gt;CSS&lt;/code&gt;, and a tiny bit of plain &lt;code&gt;JavaScript&lt;/code&gt; has been truly a joy.&lt;/p&gt;
&lt;p&gt;The current version is the 10th iteration of this website, although there’re even older versions which I’m not counting anymore. They used to live on a completely different domain for a completely different purpose and to be fair, I’d be too ashamed to include them into my &lt;a href=&quot;https://arielsalminen.com/faq/#archive&quot;&gt;archive of old versions&lt;/a&gt; at this point in time anymore.&lt;/p&gt;
&lt;p&gt;What’s special about the newest version, is that I’ve brought here more than just &lt;a href=&quot;https://arielsalminen.com/writing/&quot;&gt;the blog&lt;/a&gt; and made it somewhat focus on what I do as a &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;design engineer&lt;/a&gt; and systems architect at my current job.&lt;/p&gt;
&lt;p&gt;This includes creating a space for some of my &lt;a href=&quot;https://arielsalminen.com/#work&quot;&gt;past work&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/#clients&quot;&gt;companies&lt;/a&gt; who trust the tools I’ve built, &lt;a href=&quot;https://arielsalminen.com/#testimonials&quot;&gt;testimonials&lt;/a&gt; from the past clients and colleagues, and also listing out &lt;a href=&quot;https://arielsalminen.com/services/&quot;&gt;services&lt;/a&gt; that I’m good at. I would still also like to create a proper portfolio section at some point to include real case studies, but that’s still on my &lt;a href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#website-wishlist&quot;&gt;wishlist of things&lt;/a&gt; to add later.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/website.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; class=&quot;image-padding&quot; alt=&quot;Screenshot of the 10th oteration of arielsalminen.com.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Version 10.0 of &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;arielsalminen.com&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;behind-the-scenes&quot;&gt;Behind the Scenes &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#behind-the-scenes&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As mentioned earlier, all of the website is built using standard web technologies; including HTML, CSS and plain JavaScript. I’m also using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; behind the scenes to power the blog and for example to generate the &lt;a href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/&quot;&gt;JSON search index&lt;/a&gt; for the &lt;kbd class=&quot;modifier control-key&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;K&lt;/kbd&gt; search feature.&lt;/p&gt;
&lt;p&gt;While on the surface things may look really simple, I’ve included a lot of small and fun functionality here and there that you may discover as you browse the website more. Some of this includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/&quot;&gt;Search feature&lt;/a&gt; using &lt;kbd class=&quot;modifier control-key&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;K&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Ability to surface keyboard commands with &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;L&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Design modes, including surfacing the layout grid, color blind mode, invert mode, and low vision mode to aid design work.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/2023/supporting-dark-mode-on-your-website/#changing-mode-based-on-user-preference&quot;&gt;Ability to quickly copy contents&lt;/a&gt; of the code examples using a single copy button.&lt;/li&gt;
&lt;li&gt;Tiny but fun animations on the &lt;a href=&quot;https://arielsalminen.com/accessibility/&quot;&gt;accessibility&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/error/&quot;&gt;error&lt;/a&gt;, and &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;home pages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/webrings/&quot;&gt;Webrings&lt;/a&gt; that this website is now part of.&lt;/li&gt;
&lt;li&gt;Sticky year indicators on the &lt;a href=&quot;https://arielsalminen.com/writing/&quot;&gt;writings page&lt;/a&gt; when you scroll it down.&lt;/li&gt;
&lt;li&gt;It’s a progressive web app with &lt;a href=&quot;https://arielsalminen.com/offline/&quot;&gt;offline support&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;There’s an archive of old versions of this website on the &lt;a href=&quot;https://arielsalminen.com/faq/#archive&quot;&gt;FAQ page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Uses &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values&quot;&gt;logical properties&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/::view-transition&quot;&gt;view transitions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Focus on making the website more accessible for everyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/grid.png&quot; loading=&quot;lazy&quot; width=&quot;3164&quot; height=&quot;2060&quot; class=&quot;image-padding&quot; alt=&quot;Layout grid design mode on arielsalminen.com&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Layout grid mode that can be triggered with &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;A&lt;/kbd&gt;.&lt;/span&gt;
&lt;h2 id=&quot;keyboard-shortcuts&quot;&gt;Keyboard Shortcuts &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#keyboard-shortcuts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The new website includes some functionality that can be accessed via keyboard shortcuts. These can be found from the footer of the website or by pressing &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;L&lt;/kbd&gt;. Mainly this is me having fun with some experimental features such as the design modes. The full set of shortcuts include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press &lt;kbd class=&quot;modifier control-key&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;K&lt;/kbd&gt; to open the search.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;modifier&quot;&gt;⏎&lt;/kbd&gt; to select a search result.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;modifier&quot;&gt;↓&lt;/kbd&gt; to navigate to the next search result.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;modifier&quot;&gt;↑&lt;/kbd&gt; to navigate to the previous search result.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd&gt;Esc&lt;/kbd&gt; to dismiss the search or a modal.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd&gt;⇥&lt;/kbd&gt; to navigate forward on the page.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd&gt;⇧&lt;/kbd&gt;+&lt;kbd&gt;⇥&lt;/kbd&gt; to navigate backward on the page.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;A&lt;/kbd&gt; to toggle the layout grid.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;R&lt;/kbd&gt; to toggle the color blind mode.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;I&lt;/kbd&gt; to toggle the invert mode.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;E&lt;/kbd&gt; to toggle the low vision mode.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd class=&quot;option-key&quot;&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;L&lt;/kbd&gt; to open the shortcuts modal.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/shortcuts.jpg&quot; width=&quot;1458&quot; height=&quot;1408&quot; loading=&quot;lazy&quot; alt=&quot;Screenshot of the keyboard shortcuts modal.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Screenshot of the keyboard shortcuts modal.&lt;/span&gt;
&lt;h2 id=&quot;focus-on-accessibility&quot;&gt;Focus on Accessibility &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#focus-on-accessibility&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Universality is in the core of the World Wide Web, so we should embrace it and build experiences that are available to, and accessible by, everyone.&lt;/p&gt;
&lt;p&gt;Because of this, I’ve put a lot of effort on trying to build an experience that would be accessible by all people, regard­less of their abilities or tech­nology used. I’m also con­tin­u­ously trying to work towards improving the &lt;a href=&quot;https://arielsalminen.com/accessibility/&quot;&gt;accessibility&lt;/a&gt; of this website to ensure I provide equal access to everyone.&lt;/p&gt;
&lt;p&gt;This work is ongoing and I know there’re still some issues to iron out, especially with the &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/combobox/&quot;&gt;Combobox Pattern&lt;/a&gt; used for the search. But I’m fairly happy with how much more inclusive the experience is already compared to my previous website.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/lighthouse.png&quot; width=&quot;996&quot; height=&quot;376&quot; loading=&quot;lazy&quot; alt=&quot;Lighthouse results for arielsalminen.com.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Lighthouse results for &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;arielsalminen.com&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;delight-with-animations&quot;&gt;Delight with Animations &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#delight-with-animations&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I like to keep things rather simple when it comes to my personal website, but that doesn’t mean one can’t have some fun as well. When you browse this website, you may stumble upon a few small but delightful animations that I’ve created. Some examples of this include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The stamp animation on the &lt;a href=&quot;https://arielsalminen.com/accessibility/&quot;&gt;Accessibility Page&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The galaxy animation on the &lt;a href=&quot;https://arielsalminen.com/error/&quot;&gt;404 Error&lt;/a&gt; / &lt;a href=&quot;https://arielsalminen.com/offline/&quot;&gt;Offline Error&lt;/a&gt; pages.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The subtle floating animation on the &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;Home Page&lt;/a&gt; photograph.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The very basic view transitions as you switch between the pages using the main navigation.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://arielsalminen.com/error/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/error.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; loading=&quot;lazy&quot; class=&quot;image-padding&quot; alt=&quot;Galaxy animation used on the error pages.&quot; /&gt;&lt;/a&gt;
&lt;span class=&quot;desc&quot;&gt;Galaxy animation used on the &lt;a href=&quot;https://arielsalminen.com/error/&quot;&gt;error pages&lt;/a&gt;.&lt;/span&gt;
&lt;h2 id=&quot;the-final-outcome&quot;&gt;The Final Outcome &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#the-final-outcome&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is what the final outcome looks like. Feel free to explore yourself, the new website is available here: &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;https://arielsalminen.com&lt;/a&gt; ❤️&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;
&lt;a href=&quot;https://arielsalminen.com/&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/website.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;A screenshot of Ariel Salminen’s new website and its home page at https://arielsalminen.com/.&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://arielsalminen.com/services/&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/services.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;A screenshot of Ariel Salminen’s new website and its services page at https://arielsalminen.com/services/.&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://arielsalminen.com/writing/&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/writing.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;A screenshot of Ariel Salminen’s new website and its blog archives page at https://arielsalminen.com/writing/.&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://arielsalminen.com/contact/&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/10th-version/contact.png&quot; width=&quot;3164&quot; height=&quot;2060&quot; alt=&quot;A screenshot of Ariel Salminen’s new website and its contact page at https://arielsalminen.com/contact/.&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further Reading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#further-reading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While writing this post some of the sections started to grow to such magnitudes that I felt like they would work better as completely separate posts. So I did just that and published &lt;del&gt;two&lt;/del&gt; three more posts for you to read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://arielsalminen.com/2025/building-search-index-with-eleventy/&quot;&gt;Building Search Index with Eleventy&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://arielsalminen.com/2025/optimizing-webfont-performance/&quot;&gt;Optimizing Webfont Performance&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://arielsalminen.com/2025/view-transitions-for-any-website/&quot;&gt;View Transitions for Any Website&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;website-wishlist&quot;&gt;Website Wishlist &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-10th-edition-of-arielsalminen.com/#website-wishlist&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There’re a few things on my wishlist that I would still like to do around here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finish dark mode support. I have a draft PR open for this, but haven’t found the energy to finish it yet.&lt;/li&gt;
&lt;li&gt;Create proper case studies for the client projects.&lt;/li&gt;
&lt;li&gt;Potentially bring some of my open source projects here.&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Improve keyboard accessibility of the &lt;em&gt;Combobox Pattern&lt;/em&gt; used in search.&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Improve screen reader accessibility of the &lt;em&gt;Combobox Pattern&lt;/em&gt; used in search.&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hope you enjoy it!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Remember Webrings?</title>
      <link href="https://arielsalminen.com/2025/remember-webrings/"/>
      <updated>2025-04-25T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/remember-webrings/</id>
      <content type="html">&lt;p&gt;Sometimes I find vintage technology fascinating and since I couldn’t find a &lt;a href=&quot;https://arielsalminen.com/webrings/&quot;&gt;Design Systems Webring&lt;/a&gt; (remember those things from the 90s?!), I just created one. Feel free to join if you’re into design systems and want to add some 90s vibes onto your website: &lt;a href=&quot;https://design-system.club/&quot;&gt;https://design-system.club&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you don’t know what a &lt;a href=&quot;https://en.wikipedia.org/wiki/Webring&quot;&gt;Webring&lt;/a&gt; is, here’s a short explanation: Webring is human-curated list of websites organized around a specific topic. The one I’ve set up is dedicated to people interested in design systems. It ships with a modern twist as it allows you to embed it as a Web Component:&lt;/p&gt;
&lt;design-systems-webring&gt;
  &lt;p&gt;
    This site is part of &lt;a href=&quot;https://design-system.club/&quot;&gt;Design Systems Webring&lt;/a&gt;
  &lt;/p&gt;
  &lt;a rel=&quot;external&quot; referrerpolicy=&quot;strict-origin&quot; href=&quot;https://design-system.club/prev&quot;&gt;Previous&lt;/a&gt;
  &lt;a rel=&quot;external&quot; referrerpolicy=&quot;strict-origin&quot; href=&quot;https://design-system.club/random&quot;&gt;Random&lt;/a&gt;
  &lt;a rel=&quot;external&quot; referrerpolicy=&quot;strict-origin&quot; href=&quot;https://design-system.club/next&quot;&gt;Next&lt;/a&gt;
&lt;/design-systems-webring&gt;
&lt;script async=&quot;&quot; src=&quot;https://design-system.club/embed.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
&lt;p&gt;…here’s how I’ve implemented this newly founded Webring among others on my own website: &lt;a href=&quot;https://arielsalminen.com/webrings/&quot;&gt;arielsalminen.com/webrings/&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The Blog Questions Challenge</title>
      <link href="https://arielsalminen.com/2025/the-blog-questions-challenge/"/>
      <updated>2025-04-25T00:00:00Z</updated>
      <id>https://arielsalminen.com/2025/the-blog-questions-challenge/</id>
      <content type="html">&lt;p&gt;This challenge has been recently making rounds on the Internet and as I’ve seen a lot of my friends and people I follow in the tech industry take part, I figured that I want to, as well. So this is me answering a set of questions about how and why I blog on this website.&lt;/p&gt;
&lt;h2 id=&quot;why-did-you-start-blogging-in-the-first-place&quot;&gt;Why did you start blogging in the first place? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#why-did-you-start-blogging-in-the-first-place&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve learned most of what I know now about building for the web by following people on the web; design sites, blogs and studying other people’s markup and CSS. One of the sites that made a big influence on me on my early days was &lt;a href=&quot;https://alistapart.com/&quot;&gt;A List Apart&lt;/a&gt; in 2001 and &lt;a href=&quot;https://www.csszengarden.com/&quot;&gt;CSS Zen Garden&lt;/a&gt; in 2003.&lt;/p&gt;
&lt;p&gt;So I think the answer to this question lies there; mainly because I saw a lot of the people who I looked up to at the time do it. People such as &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy Keith&lt;/a&gt;, &lt;a href=&quot;https://zeldman.com/&quot;&gt;Jeffrey Zeldman&lt;/a&gt;, &lt;a href=&quot;https://trentwalton.com/&quot;&gt;Trent Walton&lt;/a&gt;, &lt;a href=&quot;https://ethanmarcotte.com/&quot;&gt;Ethan Marcotte&lt;/a&gt;, &lt;a href=&quot;https://clagnut.com/&quot;&gt;Richard Rutter&lt;/a&gt;, &lt;a href=&quot;https://scottjehl.com/&quot;&gt;Scott Jehl&lt;/a&gt;, &lt;a href=&quot;https://stuffandnonsense.co.uk/&quot;&gt;Andy Clarke&lt;/a&gt;, &lt;a href=&quot;https://markboulton.co.uk/&quot;&gt;Mark Boulton&lt;/a&gt;, &lt;a href=&quot;https://chriscoyier.net/&quot;&gt;Chris Coyier&lt;/a&gt; and &lt;a href=&quot;https://simplebits.com/about/&quot;&gt;Dan Cederholm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Being part of this movement, for me, felt like being a part of a larger community of nice people who are sharing their knowledge for others to learn from. It still does.&lt;/p&gt;
&lt;h2 id=&quot;what-platform-are-you-using-to-manage-your-blog-and-why-did-you-choose-it&quot;&gt;What platform are you using to manage your blog and why did you choose it? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#what-platform-are-you-using-to-manage-your-blog-and-why-did-you-choose-it&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This website is handcrafted with vanilla HTML, CSS and JavaScript, built with &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, and hosted on &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;. The designs and pages were created in &lt;a href=&quot;https://www.apple.com/safari/&quot;&gt;Safari&lt;/a&gt; using its developer tools and the &lt;a href=&quot;https://www.cursor.com/&quot;&gt;Cursor&lt;/a&gt; code editor. Content was written in &lt;a href=&quot;https://ia.net/writer&quot;&gt;iA Writer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I chose Eleventy because it’s fast, simple, and extremely flexible to work with. So much so, that I’m actually using it for all my projects at the moment. Even the &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt;’s much more complex architecture is built using the same tool.&lt;/p&gt;
&lt;h2 id=&quot;have-you-blogged-on-other-platforms-before&quot;&gt;Have you blogged on other platforms before? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#have-you-blogged-on-other-platforms-before&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was using &lt;a href=&quot;https://middlemanapp.com/&quot;&gt;Middleman&lt;/a&gt; previously and migrated this website in 2018 to use Eleventy, shortly after &lt;a href=&quot;https://www.zachleat.com/&quot;&gt;Zach Leatherman&lt;/a&gt; published it. Before Middleman become a thing in 2011, I was using Wordpress to power the blog.&lt;/p&gt;
&lt;h2 id=&quot;how-do-you-write-your-posts&quot;&gt;How do you write your posts? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#how-do-you-write-your-posts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I usually write my posts in &lt;a href=&quot;https://ia.net/writer&quot;&gt;iA Writer&lt;/a&gt; if it’s a longer article. For more technical articles, I may draft them out directly in &lt;a href=&quot;https://www.cursor.com/&quot;&gt;Cursor&lt;/a&gt; because it allows me to more easily work with interactive code blocks and such, and immediately preview the changes on my live website.&lt;/p&gt;
&lt;h2 id=&quot;when-do-you-feel-most-inspired-to-write&quot;&gt;When do you feel most inspired to write? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#when-do-you-feel-most-inspired-to-write&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/&quot;&gt;My design studio&lt;/a&gt; is probably quite different compared to most designers out there. It’s a combination of a home recording studio and a work­station that I built inside an old walk-in closet on the 3rd floor of our house. The space itself isn’t enormous by any means, around 30 ft², but this dedicated quiet space gives me the luxury to feel inspired, find focus, and get a lot of things done.&lt;/p&gt;
&lt;p&gt;This is also where I feel the most inspired to write. Especially if I have a cup of coffee and some soul or &lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/&quot;&gt;jazz playing in the background&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;do-you-publish-immediately-after-writing%2C-or-do-you-let-it-simmer-a-bit-as-a-draft&quot;&gt;Do you publish immediately after writing, or do you let it simmer a bit as a draft? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#do-you-publish-immediately-after-writing%2C-or-do-you-let-it-simmer-a-bit-as-a-draft&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It depends. If it’s just a simple post such as this or something technical, I will almost always publish it immediately. For more complex thought pieces though, &lt;a href=&quot;https://arielsalminen.com/2017/design-tools-processes/&quot;&gt;such as this&lt;/a&gt;, I will let it simmer first, come back to it later, and edit it in iterations until I feel comfortable to publish it.&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-your-favourite-post-on-your-blog&quot;&gt;What&#39;s your favourite post on your blog? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#what&#39;s-your-favourite-post-on-your-blog&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I would say either &lt;a href=&quot;https://arielsalminen.com/2017/design-tools-processes/&quot;&gt;On Design Tools and Processes&lt;/a&gt; or &lt;a href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/&quot;&gt;Typography for User Interfaces&lt;/a&gt;. Both of these are also loosely based on talks that I did while still living in San Francisco, CA, so there’s much more background research that went into them compared to a lot of other posts in this blog.&lt;/p&gt;
&lt;h2 id=&quot;any-future-plans-for-your-blog&quot;&gt;Any future plans for your blog? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#any-future-plans-for-your-blog&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recently re-designed this website. Mainly, because I wanted to better showcase what I do and have a future home for experiments I may want to tinker with. So I’m hoping to post about those experiments and other thoughts onto this blog in the future:&lt;/p&gt;
&lt;blockquote class=&quot;bluesky-embed&quot; data-bluesky-uri=&quot;at://did:plc:qpsx3s2etvh52nmox2l6so5a/app.bsky.feed.post/3ll6w3pyxbc2b&quot; data-bluesky-cid=&quot;bafyreicjaeq6hjvlfgzoolnwsopueft7qlofj7ttdbjvet7gqngknjtytu&quot; data-bluesky-embed-color-mode=&quot;system&quot;&gt;&lt;p lang=&quot;en&quot;&gt;New website launch day! 📮
&lt;/p&gt;&lt;p&gt;I handcrafted a super simple new site for myself to better showcase what I do and have a future home for experiments I may want to tinker with.&lt;/p&gt;
&lt;p&gt;Designed in the browser using HTML, CSS, and a tiny bit of plain JavaScript. Powered by @11ty.dev as usual:&lt;/p&gt;
&lt;p&gt;arielsalminen.com&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://bsky.app/profile/did:plc:qpsx3s2etvh52nmox2l6so5a/post/3ll6w3pyxbc2b?ref_src=embed&quot;&gt;[image or embed]&lt;/a&gt;&lt;/p&gt;— Ariel Salminen (&lt;a href=&quot;https://bsky.app/profile/did:plc:qpsx3s2etvh52nmox2l6so5a?ref_src=embed&quot;&gt;@arielsalminen.com&lt;/a&gt;) &lt;a href=&quot;https://bsky.app/profile/did:plc:qpsx3s2etvh52nmox2l6so5a/post/3ll6w3pyxbc2b?ref_src=embed&quot;&gt;March 25, 2025 at 11:04 AM&lt;/a&gt;&lt;/blockquote&gt;&lt;script async=&quot;&quot; src=&quot;https://embed.bsky.app/static/embed.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;who%E2%80%99s-next&quot;&gt;Who’s next? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2025/the-blog-questions-challenge/#who%E2%80%99s-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I would love to see some of my closest friends and colleagues take up this challenge and write a similar post. Tagging &lt;a href=&quot;https://darn.es/&quot;&gt;David Darnes&lt;/a&gt; and &lt;a href=&quot;https://elwinvaneede.com/&quot;&gt;Elwin van Eede&lt;/a&gt; here.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>A Love Letter</title>
      <link href="https://arielsalminen.com/2024/a-love-letter/"/>
      <updated>2024-12-11T00:00:00Z</updated>
      <id>https://arielsalminen.com/2024/a-love-letter/</id>
      <content type="html">&lt;p&gt;On the terrace of my old home, I ponder in silence the fairy tale I now live in. The love that was born when I met you. In that beautiful part of Helsinki, surrounded by those adorable little shops that sell the most exquisite pastries and merchandise.&lt;/p&gt;
&lt;p&gt;You’ve given my life countless new meanings. You, who lift me above this frozen city. And I, watching the sun gleaming through the mist, hovering above the sea, smile at you.&lt;/p&gt;
&lt;p&gt;You make this girl daydream. Turning the surroundings into a beautiful song. And I’m swiveling. Vague as a fog, barely visible. Hauling through the zephyr. Snowflakes falling on my thighs. Embracing everything around me, leaving me speechless. Asking nothing in return. Softly, anonymously, touching, melting, altering their shape. Cushioning this small garden.&lt;/p&gt;
&lt;p&gt;And you’re here, always in my heart. You’ve given me so much to feel and be delighted about. And I don’t know how to express it, except by jotting down these words onto this piece of paper. Because the writing, for me, turns my feelings concrete.&lt;/p&gt;
&lt;p&gt;And it’s quiet, except where the snowploughs clear the roads.&lt;/p&gt;
&lt;p&gt;I love you,&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Interview with Design System Guide</title>
      <link href="https://arielsalminen.com/2024/interview-with-design-system-guide/"/>
      <updated>2024-02-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2024/interview-with-design-system-guide/</id>
      <content type="html">&lt;p&gt;I recently sat down with the team behind the &lt;a href=&quot;https://thedesignsystem.guide/interview-ariel-salminen&quot;&gt;Design System Guide&lt;/a&gt; to talk about &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt; and how it’s been shaping our work at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt;. We discussed the challenges of building a design system in a fast-paced environment, the importance of collaboration, and the impact design systems have on the organization and people involved.&lt;/p&gt;
&lt;p&gt;I also shared some of the lessons we’ve learned along the way and how we’ve been able to overcome some of the challenges we’ve faced. I hope you find &lt;a href=&quot;https://thedesignsystem.guide/interview-ariel-salminen&quot;&gt;the interview&lt;/a&gt; insightful and that it provides you with some valuable takeaways for your own design system journey.&lt;/p&gt;
&lt;p&gt;If you have any questions or thoughts, or just want to chat, please feel free to reach out to me on &lt;a href=&quot;https://bsky.app/profile/arielsalminen.com&quot;&gt;social media&lt;/a&gt;. I’d love to hear from you!&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://thedesignsystem.guide/interview-ariel-salminen&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>My Song</title>
      <link href="https://arielsalminen.com/2024/my-song/"/>
      <updated>2024-01-21T00:00:00Z</updated>
      <id>https://arielsalminen.com/2024/my-song/</id>
      <content type="html">&lt;p&gt;A frozen lake, stars gazing above&lt;br /&gt;
I can hear them play my song&lt;br /&gt;
And I’m swiveling.&lt;/p&gt;
&lt;p&gt;Vague as a fog, barely visible&lt;br /&gt;
Hauling through the zephyr&lt;br /&gt;
Snowflakes falling on my thighs.&lt;/p&gt;
&lt;p&gt;Touching, melting&lt;br /&gt;
Altering their shape&lt;br /&gt;
As I once were.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Finalist for the Best Design System Award</title>
      <link href="https://arielsalminen.com/2023/finalist-for-the-best-design-system-award/"/>
      <updated>2023-05-22T00:00:00Z</updated>
      <id>https://arielsalminen.com/2023/finalist-for-the-best-design-system-award/</id>
      <content type="html">&lt;p&gt;Nord Design System was recently nominated for the Best Design System award at &lt;a href=&quot;https://grandone.fi/kilpailutyot/?palkinto=voittajat&amp;amp;kategoria=paras-design-system&quot;&gt;Grand One competition&lt;/a&gt; and won an honorable mention for the best developer experience.&lt;/p&gt;
&lt;a href=&quot;https://grandone.fi/kilpailutyot/?palkinto=voittajat&amp;kategoria=paras-design-system&quot;&gt;
  &lt;img src=&quot;https://arielsalminen.com/img/blog/best-design-system.jpg&quot; width=&quot;3024&quot; height=&quot;4032&quot; alt=&quot;Best Design System award&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://grandone.fi/kilpailutyot/?palkinto=voittajat&amp;kategoria=paras-design-system&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Leading Successful Product Teams</title>
      <link href="https://arielsalminen.com/2023/leading-successful-product-teams/"/>
      <updated>2023-03-09T00:00:00Z</updated>
      <id>https://arielsalminen.com/2023/leading-successful-product-teams/</id>
      <content type="html">&lt;p&gt;I’ve been leading various successful &lt;a href=&quot;https://nordhealth.design/about/&quot;&gt;design systems teams&lt;/a&gt; over the past years and in this post I wanted to share a simple set of fundamental rules we’ve followed. These rules have allowed those teams to get to the highest level of productivity while benefiting both the company and the team members.&lt;/p&gt;
&lt;p&gt;Running a design systems team has some minor differences compared to a more traditional product team setup, but there’s still enough overlap that all of these rules can be considered universal and applied to almost any product team out there.&lt;/p&gt;
&lt;p&gt;As a caveat though, what might’ve worked for my team in the past, might not work for every team out there. We’ve been operating in a remote first culture so these rules apply in that context.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Avoid meetings as much as possible. Instead of having them, communicate asynchronous to each other via tools such as &lt;a href=&quot;https://linear.app/&quot;&gt;Linear&lt;/a&gt;, &lt;a href=&quot;https://github.com/arielsalminen&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://www.figma.com/@ariels&quot;&gt;Figma&lt;/a&gt;, &lt;a href=&quot;https://slack.com/&quot;&gt;Slack&lt;/a&gt;, and &lt;a href=&quot;https://nordhealth.design/faq/#what-tools-do-you-use&quot;&gt;similar&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide at least three days of focus time per week for designers and developers in the team. There should be no interruptions whatsoever during this time. Let them do their work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trust your team to make decisions, they’re the experts. Your job is to make sure they know where they’re heading, clear any roadblocks from the way, and protect them from external cruft.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Default to openness. The team should be sharing what they’re doing whenever they can. Building things transparently increases visibility and accountability and makes them push towards higher quality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define just the right amount of process. Too much process and it will slow down your team and their performance, while not enough will create inconsistency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t do team wide standups or sync meetings, except one meeting at the start of every week. Here you can walk through the tasks and discuss how the team feels, what motivates them right now, and if there are any blockers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use as few tools and platforms as possible to get the work done and stay focused throughout the week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate everything you can. The team should value the time of their colleagues, users, and their future selves. Always be proactively looking for ways to automate repetitive tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Care for the people who use the product. The whole team is there to make their day-to-day work better and more pleasant through great user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most collaboration and discussion should happen asynchronously, using the previously mentioned tools. This requires clear and thoughtful communication from everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When useful, have the team members pair up to solve tough problems. Make sure all decisions are documented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide weekly updates to the rest of the organization about progress. What has been worked on, what is being worked on, and what happens next.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a public roadmap that holds the whole team accountable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Focus on persistent iteration over flashy launches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t be afraid to throw things away.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shipped is better than perfect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be kind.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://medium.com/dribbble/what-i-learned-co-founding-dribbble-8680f6816e3d&quot;&gt;Dan Cederholm&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Supporting Dark Mode on Your Website</title>
      <link href="https://arielsalminen.com/2023/supporting-dark-mode-on-your-website/"/>
      <updated>2023-03-01T00:00:00Z</updated>
      <id>https://arielsalminen.com/2023/supporting-dark-mode-on-your-website/</id>
      <content type="html">&lt;p&gt;Dark mode is an user interface mode that displays light text on a dark background. Dark mode is helpful for those viewing device screens at night, in dark environments, or otherwise find darker UI more accessible. The reduced brightness can reduce eye strain in low light conditions.&lt;/p&gt;
&lt;p&gt;A typical scenario is that we already have a light theme on a website, and want to build support for a darker counterpart. When building this support, one of the themes has to be defined as the default that users get on their first visit. This should always be the light theme, although we can let the user’s browser make that choice for us.&lt;/p&gt;
&lt;p&gt;When building dark mode support, we should always provide a manual way for the user to switch to the other theme in the website’s settings. This setting should include at least the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Light theme&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dark theme&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto (system preference)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changing-mode-based-on-user-preference&quot;&gt;Changing mode based on user preference &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2023/supporting-dark-mode-on-your-website/#changing-mode-based-on-user-preference&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If your website offers its themes as separate stylesheets, we can toggle between these stylesheets for each mode. By default, we should have the light stylesheet in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of the website:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Nord Design System themes as examples --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://nordcdn.net/ds/css/3.4.0/nord.min.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://nordcdn.net/ds/themes/8.1.1/nord-dark.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;theme&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Interface theme&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;select&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;theme&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;light&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Light theme&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dark&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Dark theme&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;auto&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Auto (system preference)&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the user switches the mode, we can toggle between these stylesheets:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Select the menu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; menu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;select&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Listen for a change event on the menu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;menu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;change&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// If the selected mode is dark, change to dark theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Otherwise, change to light theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to light&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;building-support-for-os-dark-mode&quot;&gt;Building support for OS dark mode &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2023/supporting-dark-mode-on-your-website/#building-support-for-os-dark-mode&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many operating systems let users choose between light and dark mode directly in the system settings. The goal of &lt;code&gt;&#39;Auto (system preference)&#39;&lt;/code&gt; is to allow this type of usage. To support this, we can use a little bit of JavaScript to detect the user’s preference:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Detect operating system dark mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; darkMode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(prefers-color-scheme: dark)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// If the OS uses dark mode currently, change to dark theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;darkMode&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Otherwise, change to light theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to light&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;storing-user%E2%80%99s-preference&quot;&gt;Storing user’s preference &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2023/supporting-dark-mode-on-your-website/#storing-user%E2%80%99s-preference&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ultimately, we also need to carry over this functionality when the user either visits another page on your website or reloads the current page. To achieve this, we need to save the user’s preference so that it will be applied consistently throughout the website and on subsequent visits. To do that, we can save the preference to &lt;code&gt;localStorage&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Get current mode from localStorage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; currentMode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// If current mode is &quot;dark&quot;, change to dark theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentMode &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Listen for a change event on the mode menu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;menu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;change&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; mode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;light&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// If the selected mode is dark, change to dark theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    mode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Otherwise, change to light theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Change theme to light&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Finally, save the choice into localStorage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it! Now you have a dark mode on your website that will correctly persist across pages and reloads.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What’s a Design Systems Lead</title>
      <link href="https://arielsalminen.com/2023/whats-a-design-systems-lead/"/>
      <updated>2023-02-21T00:00:00Z</updated>
      <id>https://arielsalminen.com/2023/whats-a-design-systems-lead/</id>
      <content type="html">&lt;p&gt;A Design Systems Lead role includes driving the vision, strategy, roadmap, build and implementation of a design system. This person has a systems-mindset to build and integrate consistent, efficient components across the product portfolio with emphasis on the complete systems life-cycle, from establishing a practice and vision that endures to design, build, document, and maintain a library used by many product teams.&lt;/p&gt;
&lt;p&gt;A Design System Lead has also experience contributing to lower-level decision making, direct broader strategy, and observing when narrower efforts conflict with or distract from broader goals.&lt;/p&gt;
&lt;h3 id=&quot;responsibilities-of-this-role-include%3A&quot;&gt;Responsibilities of this role include: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2023/whats-a-design-systems-lead/#responsibilities-of-this-role-include%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lead the design and implementation of a design system.&lt;/li&gt;
&lt;li&gt;Identify, prioritize, and monitor tasks, progress of design, development, and documentation across team members.&lt;/li&gt;
&lt;li&gt;Maintain and improve the contribution model to streamline the process of multiple autonomous product teams contributing to the design system.&lt;/li&gt;
&lt;li&gt;Present the system’s mission, library, and process to other groups, including product managers, designers and developers throughout the company.&lt;/li&gt;
&lt;li&gt;Report team and system progress regularly to key stakeholders and the rest of the organization.&lt;/li&gt;
&lt;li&gt;Provide leadership and guidance to teams around using shared patterns, and identify opportunities to create new patterns and components within their workstreams.&lt;/li&gt;
&lt;li&gt;Conduct regular one-on-one reviews with team members to identify successes, challenges, perspectives and preferences.&lt;/li&gt;
&lt;li&gt;Mentoring and building others.&lt;/li&gt;
&lt;li&gt;Help maintain a culture of empathy, safety and belonging where all voices are heard.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>What’s a Product Design Architect</title>
      <link href="https://arielsalminen.com/2023/whats-a-product-design-architect/"/>
      <updated>2023-02-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2023/whats-a-product-design-architect/</id>
      <content type="html">&lt;p&gt;In the context of design systems, a Product Design Architect provides strategic and creative direction for the design system. This person partners with executives and other cross functional leadership to scale a design system across a family of products by defining adoption, contribution, governance, quality, and partnership programs.&lt;/p&gt;
&lt;p&gt;A Product Design Architect is a systems thinker; designing for the whole rather than the individual parts. They collaborate with design, product, and engineering teams on the tactical and strategic direction.&lt;/p&gt;
&lt;h3 id=&quot;responsibilities-of-this-role-include%3A&quot;&gt;Responsibilities of this role include: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2023/whats-a-product-design-architect/#responsibilities-of-this-role-include%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Strategic and creative direction of Design System.&lt;/li&gt;
&lt;li&gt;Strategic and creative direction of Design Language.&lt;/li&gt;
&lt;li&gt;Partnership with design, product, and engineering.&lt;/li&gt;
&lt;li&gt;Collaboration with designers and engineers to create portable and reusable platform solutions that power our products.&lt;/li&gt;
&lt;li&gt;Distilling research learnings and business problems into client journeys and experience narratives.&lt;/li&gt;
&lt;li&gt;Optimizing and evolving design processes and systems that are accessible and valuable to non-designers as well.&lt;/li&gt;
&lt;li&gt;Doing hands-on user research, design, documentation and frontend architecture work.&lt;/li&gt;
&lt;li&gt;Incorporating UX/UI best practices across our products.&lt;/li&gt;
&lt;li&gt;Mentoring and building others.&lt;/li&gt;
&lt;li&gt;Helping to maintain a culture of empathy, safety and belonging where all voices are heard.&lt;/li&gt;
&lt;li&gt;Making it possible for great designs to happen everywhere in the organization.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Where Do We Belong</title>
      <link href="https://arielsalminen.com/2022/where-do-we-belong/"/>
      <updated>2022-12-28T00:00:00Z</updated>
      <id>https://arielsalminen.com/2022/where-do-we-belong/</id>
      <content type="html">&lt;p&gt;I’ve been years watching everyone around me change. Seasons coming and going. People growing roots. Building houses. Giving birth to their babies. Becoming stable parents. And I’ve tried hard to change as well. Become that, understand it. I’ve been through these things, but I feel like I’m still the same scrawny kid full of dreams and restlessness.&lt;/p&gt;
&lt;p&gt;Eventually, I’ve started becoming part of everything I’ve seen around the world, if nothing else. And when I’ve travelled forward, a small part of me is always left out there somewhere. On the deserts, mountains, forests, oceans, and the cities around the world. It’s a little bittersweet. It’s the same with people. I ain’t got roots and I don’t know where I belong.&lt;/p&gt;
&lt;p&gt;I have this dream where I’m sitting on top of Mt. Tamalpais East Peak gazing over San Francisco city lights across the bay. Warm autumn breeze blowing from the Pacific Ocean. Misty mountains around me, swaying fields in the moonlight, colors of the autumn, and music that fills our souls.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Finalist for the Jamstack Conf Jammies</title>
      <link href="https://arielsalminen.com/2022/finalist-for-the-jamstack-conf-jammies/"/>
      <updated>2022-10-25T00:00:00Z</updated>
      <id>https://arielsalminen.com/2022/finalist-for-the-jamstack-conf-jammies/</id>
      <content type="html">&lt;p&gt;Nord Design System was recently nominated for the Jamstack Conf Jammies award in “Project of the Year” category. Winners will be announced live at &lt;a href=&quot;https://jamstack.org/conf/jammies/&quot;&gt;Jamstack Conf&lt;/a&gt; on November 7 – 8.&lt;/p&gt;
&lt;p&gt;Nord was nominated for outstanding achievement in delivering best-in-class experiences to customers through innovative use of technologies across the Jamstack and its ecosystem. You can read more &lt;a href=&quot;https://jamstack.org/conf/jammies/&quot;&gt;about the award on the official website&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;https://jamstack.org/conf/jammies/&quot;&gt;
  &lt;img src=&quot;https://arielsalminen.com/img/updates/jammies.jpg&quot; width=&quot;2027&quot; height=&quot;1536&quot; alt=&quot;Jammies award&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://jamstack.org/conf/jammies/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Interview with Ariel Salminen</title>
      <link href="https://arielsalminen.com/2022/interview-with-ariel-salminen/"/>
      <updated>2022-09-02T00:00:00Z</updated>
      <id>https://arielsalminen.com/2022/interview-with-ariel-salminen/</id>
      <content type="html">&lt;p&gt;I was recently interviewed by Lovers Magazine about what led me into design and what type of things inspire me as a designer. I think it was refreshing to answer their questions and really dive into the deep end of what ultimately took me where I am today.&lt;/p&gt;
&lt;p&gt;I sometimes tend to forget that I’ve been working in this profession for two decades and many of the people I meet inside and outside of work are just starting their careers. I’m not really saying that I’d be offering any kind of career advice in this particular interview, but it’s still a brief look into one person’s journey to become a systems oriented designer.&lt;/p&gt;
&lt;p&gt;If you’re interested, you can &lt;a href=&quot;https://spaces.is/loversmagazine/interviews/ariel-salminen&quot;&gt;read the full interview here&lt;/a&gt;. I also created a small &lt;a href=&quot;https://open.spotify.com/playlist/6Y6JYEu48LlYRW9DmPdpk2&quot;&gt;Spotify playlist&lt;/a&gt; for the readers of the magazine. These are tracks that I often listen to while working. There’s an &lt;a href=&quot;https://music.apple.com/fi/playlist/ariel-salminen-designer-mix/pl.u-PDb42RAtLXaRXr&quot;&gt;Apple Music playlist&lt;/a&gt; available as well.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://spaces.is/loversmagazine/interviews/ariel-salminen&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Launching Nord Design System</title>
      <link href="https://arielsalminen.com/2022/launching-nord-design-system/"/>
      <updated>2022-04-05T00:00:00Z</updated>
      <id>https://arielsalminen.com/2022/launching-nord-design-system/</id>
      <content type="html">&lt;p&gt;We’re excited to announce the first major release of &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt;, &lt;code&gt;v1.0&lt;/code&gt;. With this release, our design systems team is shipping a number of new tools and features to improve the experience of designing, building, and shipping products at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Looking back in time, we started our design systems journey at the &lt;a href=&quot;https://nordhealth.design/roadmap/&quot;&gt;end of 2020&lt;/a&gt; with initial user research, but the concrete design and development work on the system didn’t start before the late summer 2021 when &lt;a href=&quot;https://www.linkedin.com/in/eric-habich-236484ab/&quot;&gt;Eric Habich&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/wickynilliams&quot;&gt;Nick Williams&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/daviddarnes&quot;&gt;David Darnes&lt;/a&gt; joined the team.&lt;/p&gt;
&lt;p&gt;Now, 8 months later, I’m excited that we’re launching &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt; and all of our tools for production usage! To learn more about the new features included, keep reading below. 🎉&lt;/p&gt;
&lt;h2 id=&quot;new-packages&quot;&gt;New Packages &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#new-packages&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord Design System is divided into &lt;a href=&quot;https://nordhealth.design/start/&quot;&gt;7 npm packages&lt;/a&gt; and a &lt;a href=&quot;https://nordhealth.design/figma/&quot;&gt;Figma Toolkit&lt;/a&gt;. All of the packages can be used together or separately depending on the product team’s needs and often developers might install several of them in order to use Nord Design System, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/components&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/react&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/themes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/css&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/icons&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@nordhealth/fonts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://nordhealth.design/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/packages.jpg&quot; alt=&quot;Nord Design System packages&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;figma-toolkit&quot;&gt;Figma Toolkit &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#figma-toolkit&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord’s &lt;a href=&quot;https://nordhealth.design/figma/&quot;&gt;Figma Toolkit&lt;/a&gt; is a resource for exploration and collaboration. It contains the building blocks for designing with Nord. Our goal was to create a toolkit that anyone at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; could use to prototype ideas. We’ve written more about the toolkit and our thinking behind it in one of our &lt;a href=&quot;https://nordhealth.design/updates/january-2022/&quot;&gt;monthly updates&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our plan is to open source parts of the library in the &lt;a href=&quot;https://www.figma.com/@nordhealth&quot;&gt;Figma Community&lt;/a&gt; soon so that anyone can learn how we use Figma and benefit from the work we’re doing. Take a sneak peek of our &lt;a href=&quot;https://www.figma.com/@nordhealth&quot;&gt;Figma Community page&lt;/a&gt; to follow us and stay up to date on what we’ll publish there.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/figma/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/figma.png&quot; alt=&quot;Nord Design System Figma Toolkit&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;theming&quot;&gt;Theming &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#theming&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord uses &lt;a href=&quot;https://nordhealth.design/themes/#creating-themes&quot;&gt;CSS Custom Properties&lt;/a&gt; &lt;em&gt;(sometimes referred to as CSS variables)&lt;/em&gt; to make its parts themable. CSS Custom Properties allow us to have our values stored in one place, then referenced in multiple other places.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/themes.png&quot; alt=&quot;Nord Design System Themes&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;A single &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;theme in Nord&lt;/a&gt; is basically a plain CSS file which contains a &lt;code&gt;:root&lt;/code&gt; CSS pseudo-class which declares global colors, gradients, box-shadows, and color aliases for the theme. Themes are usually referenced after our CSS Framework in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of an application:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* ACCENT COLOR */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-accent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* TEXT COLORS */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-link&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-weak&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-weaker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-weakest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-on-accent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* NAVIGATION COLORS */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-nav-surface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-nav-heading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-nav-hover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* BORDER COLORS */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-border-strong&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* SKIN COLORS */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-surface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-surface-raised&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* STATUS COLORS */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-status-warning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-status-highlight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-status-danger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-status-success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-status-info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* ETC… */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nord’s theming also comes with a concept called &lt;a href=&quot;https://nordhealth.design/themes/#accent-color&quot;&gt;Accent color&lt;/a&gt; which allows developers to provide a slightly branded experience for the users without having to build a full theme from scratch:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* CUSTOM ACCENT COLORS */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-accent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;accent-color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;--n-color-text-on-accent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text-on-accent-color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dark-mode&quot;&gt;Dark mode &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#dark-mode&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dark mode is a user interface mode that displays light text on a dark background. &lt;a href=&quot;https://nordhealth.design/themes/#dark-mode&quot;&gt;Dark mode&lt;/a&gt; is helpful for those viewing device screens at night, in dark environments, or find darker UI more accessible. The reduced brightness can reduce eye strain in low light conditions.&lt;/p&gt;
&lt;p&gt;CSS Custom Properties used in &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Nord’s theming&lt;/a&gt; make supporting dark mode incredibly quick and performant. A typical scenario here could be that we already have a light theme in an application, and want to build support for a darker counterpart. Nord now supports this out of the box so that we can provide a better experience for our users.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/themes/#dark-mode&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/dark-mode.png&quot; alt=&quot;Nord Design System Dark mode&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;theme-builder&quot;&gt;Theme Builder &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#theme-builder&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We’ve created a tool called &lt;a href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;theme builder&lt;/a&gt; that our teams can use to test out the existing themes and the provided theming options. This can be useful for demo­nstrating the theming capabilities to users.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/theme-builder.png&quot; alt=&quot;Nord Design System Theme Builder&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;&lt;a href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;Theme builder&lt;/a&gt; allows developers to try features such as &lt;code&gt;Accent color&lt;/code&gt; before implementing them into production environment and demo­nstrates how to programmatically pick the right text color based on the contrast ratio using our provided &lt;a href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#&quot;&gt;getTextColor function&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*!
&lt;span class=&quot;highlight-line&quot;&gt;  * Get Nord text color for chosen accent color.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  * Derived from work by Brian Suda and Chris Ferdinandi.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  * MIT License.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  *&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  * @param  {String} A hex color value&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  * @return {String} The contrasting color (#0c1a3d or #fff)&lt;/span&gt;
  */&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// If a leading # is provided, remove it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// If 3 character hex, convert to 6 character&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;hex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hex &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; hex&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Convert to RGB value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; r &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; g &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Get YIQ color space ratio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; yiq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;299&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; g &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;587&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;114&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Finally return contrasting text color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; yiq &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;160&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#0c1a3d&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#fff&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above function can be utilized with for example a color input. When the input value changes, we can set the new accent colors into a &lt;code&gt;:root&lt;/code&gt; CSS pseudo-class:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Accent color&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#3559c7&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; input &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#color&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; root &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; textColor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;--n-color-accent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;--n-color-text-on-accent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; textColor&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;design-tokens&quot;&gt;Design Tokens &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#design-tokens&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Design tokens&lt;/a&gt; are a central location to store design related information such as colors, fonts, sizes, and transitions. These raw values are automatically transformed to different formats like Sass, CSS, JSON, and more. Nord Design System uses design tokens instead of hard coded values to ensure a better UI consistency across different platforms &lt;em&gt;(hat tip to &lt;a href=&quot;https://twitter.com/jina&quot;&gt;Jina&lt;/a&gt;!).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Please note that in most cases developers don’t have to install our &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;design tokens package&lt;/a&gt; directly, they can use our &lt;a href=&quot;https://nordhealth.design/css/&quot;&gt;CSS framework&lt;/a&gt; instead as it imports this package internally and gives access to both the tokens and a wide range of shorthand utility classes to modify an element’s appearance in their application.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/tokens.png&quot; alt=&quot;Nord Design System Design Tokens&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;web-components&quot;&gt;Web Components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#web-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord makes it effortless to implement and use its components across any framework or no framework at all. We accomplish this by using standardized web platform APIs and &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’ve chosen to use &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt; because there is a strong requirement for Nord to be used in many different contexts and with varying technologies — from static HTML pages to server-rendered apps, through to single page applications authored with frameworks such as &lt;a href=&quot;https://nordhealth.design/web-components/#react&quot;&gt;React&lt;/a&gt; and &lt;a href=&quot;https://nordhealth.design/web-components/#vue&quot;&gt;Vue.js&lt;/a&gt;. Web Components work great for Nord, because they:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Are tech-agnostic instead of tech-specific&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future proof our system with Web Standards&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow us to use any framework or no framework at all&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provide great encapsulation for styles and functionality&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/components.png&quot; alt=&quot;Nord Design System web Components&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;react-components&quot;&gt;React Components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#react-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whilst &lt;a href=&quot;https://nordhealth.design/web-components/#react&quot;&gt;React&lt;/a&gt; supports Web Components, they are sligthly awkward to use as-is. For this reason, we provide &lt;a href=&quot;https://nordhealth.design/web-components/#react&quot;&gt;React-specific wrapper components&lt;/a&gt; in a package called &lt;code&gt;@nordhealth/react&lt;/code&gt;. This will allow developers to use the Nord components as you would any other React component.&lt;/p&gt;
&lt;p&gt;A planned future release of React will greatly improve support for Web Components, which will make the wrapper components unnecessary. But until then, we recommend their use.&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@nordhealth/css&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Button &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@nordhealth/react&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ReactDOM &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react-dom&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Hello world&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;ReactDOM&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;App&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#app&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;css-framework&quot;&gt;CSS Framework &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#css-framework&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord Design System’s &lt;a href=&quot;https://nordhealth.design/css/&quot;&gt;CSS Framework&lt;/a&gt; includes a wide range of shorthand utility classes to modify an element’s appearance in your application. The primary goal of this framework is to provide a method of styling elements with as little friction as possible.&lt;/p&gt;
&lt;p&gt;Our CSS Framework also makes it possible to use the &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;design tokens&lt;/a&gt; through memorable CSS based utility classes. Developers can either use this framework standalone, or with another CSS framework, as our CSS selectors are prefixed with &lt;code&gt;.n-&lt;/code&gt; to prevent collisions.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/css/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/css.svg&quot; style=&quot;max-width:80%&quot; alt=&quot;Nord Design System CSS Framework&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;rtl-support-and-logical-properties&quot;&gt;RTL Support and Logical Properties &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#rtl-support-and-logical-properties&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Historically in CSS, we used to apply properties such as &lt;code&gt;margin&lt;/code&gt; relative to the direction of their sides. For example, &lt;code&gt;margin-left&lt;/code&gt; was applied to the physical left side of an element. With logical properties, &lt;code&gt;margin-left&lt;/code&gt; becomes &lt;code&gt;margin-inline-start&lt;/code&gt;. This means that regardless of the language and text direction, the element will always have appropriate margin rules even in right-to-left languages.&lt;/p&gt;
&lt;p&gt;Supporting multilingual applications and websites was an important requirement for &lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt;. This is why we’ve made sure to use Logical Properties across all of our tools and also built test automation that warns us if we accidentally use the old style properties such as &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;, or &lt;code&gt;border&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2018/03/understanding-logical-properties-values/&quot;&gt;Rachel Andrew&lt;/a&gt; explaining the logic:&lt;/p&gt;
&lt;blockquote&gt;“… these values have moved away from the underlying assumption that content on the web maps to the physical dimensions of the screen, with the first word of a sentence being top left of the box it is in. The order of lines in grid-area makes complete sense if you had never encountered the existing way that we set these values in a shorthand.”&lt;/blockquote&gt;
&lt;h2 id=&quot;nordicons&quot;&gt;Nordicons &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#nordicons&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nordhealth.design/nordicons/&quot;&gt;Nordicons&lt;/a&gt; is our proprietary icon library. We use Nordicons to provide addi­tional meaning or in places where text label doesn’t fit. They communicate messages at a glance and draw attention to important information.&lt;/p&gt;
&lt;p&gt;The easiest and recommended way to use Nordicons is via our dedicated &lt;a href=&quot;https://nordhealth.design/components/icon/&quot;&gt;Icon component&lt;/a&gt; that allows developers at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; to use all our icons and set their size and color according to our design tokens. The icon component provides properties that allow developers to adjust the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name of the icon from Nordicons&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Size of the icon according to our icon sizing tokens&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Color of the icon according to our color tokens&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessible label for the icon&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://nordhealth.design/nordicons/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/nordicons.png&quot; alt=&quot;Nord Design System Nordicons&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;webfonts&quot;&gt;Webfonts &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#webfonts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt; provides a constrained, purposeful set of typographic styles that we use to present user interface and content as clearly and efficiently as possible.&lt;/p&gt;
&lt;p&gt;For digital products, we use a &lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;typeface called Inter&lt;/a&gt; which is carefully crafted and designed for computer screens specifically. It features a tall x-height to aid in readability of mixed-case and lower-case text. Several &lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;OpenType features&lt;/a&gt; are provided as well, like contextual alternates and slashed zero for when you need to disambiguate &lt;code&gt;0&lt;/code&gt; from &lt;code&gt;O&lt;/code&gt;.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/type.png&quot; alt=&quot;Nord Design System Webfonts&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;nord-cdn&quot;&gt;Nord CDN &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#nord-cdn&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord serves all of its packages via a &lt;a href=&quot;https://nordhealth.design/cdn/&quot;&gt;Content Delivery Network&lt;/a&gt; for better performance and stability. &lt;a href=&quot;https://nordhealth.design/cdn/&quot;&gt;Nord CDN&lt;/a&gt; also makes it fast to implement and use our packages for design work and prototyping user interface features. Some of the benefits of using Nord’s CDN include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster load times and better performance for all users&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN scales more rapidly during heavy traffic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimizes risk of traffic spikes at point of origin, ensuring stability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decreases infrastructure costs due to traffic offloading&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster to get up and running with development work&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://nordhealth.design/cdn/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/cdn.jpg&quot; style=&quot;max-width:80%&quot; alt=&quot;Nord Design System CDN&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;documentation&quot;&gt;Documentation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#documentation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Finally, but not the least, we’ve put a lot of effort into documenting the usage of different tools and decisions we’ve made along the way. For this, we’ve used a tool called &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; which generates everything from our &lt;a href=&quot;https://nordhealth.design/components/button/&quot;&gt;interactive component playgrounds&lt;/a&gt; to &lt;a href=&quot;https://nordhealth.design/colors/&quot;&gt;static documentation pages&lt;/a&gt; that you can see on &lt;a href=&quot;https://nordhealth.design/&quot;&gt;nordhealth.design&lt;/a&gt; website.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://nordhealth.design/&quot;&gt;documentation itself&lt;/a&gt; is public as it makes sharing and collaboration between different teams and third party vendors much easier as it increases the system’s visibility and accountability. This also makes us push towards higher quality and enables us to be more transparent. Finally, it serves as an amazing tool that we can leverage in recruiting.&lt;/p&gt;
&lt;a href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/nord/line-length.png&quot; alt=&quot;Nord Design System Documentation&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;what%E2%80%99s-coming-next&quot;&gt;What’s Coming Next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/launching-nord-design-system/#what%E2%80%99s-coming-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://nordhealth.design/about/&quot;&gt;Nord team&lt;/a&gt; is excited to finally bring these updates to everyone working at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt;!  🥳  All of our tools are out of beta phase starting today and ready for production usage. There’re obviously many items we wanted to see in version &lt;code&gt;1.0&lt;/code&gt; that didn’t quite make it. We’re excited to bring those to our users later this year. Next, we’ll be focusing on the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improved internationalization support for Web Components&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Product team support by setting up knowledge-sharing processes that promote collaboration, pairing, and training&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forming new Nordhealth wide contribution models&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improving our test and process automation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defining backlog prioritization model&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adding more features, components, and fixing bugs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/roadmap/&quot;&gt;And more…&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have questions or feedback for us, feel free to reach out to us via &lt;a href=&quot;https://nordhealth.design/help/#slack-channels&quot;&gt;Slack&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/help/#office-hours&quot;&gt;Office Hours&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/help/#monthly-meetups&quot;&gt;Monthly Meetups&lt;/a&gt;, and also the &lt;a href=&quot;https://nordhealth.design/faq/&quot;&gt;feedback functionality&lt;/a&gt; found from the bottom of each page. Hope to hear from you soon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; &lt;em&gt;&lt;a href=&quot;https://nordhealth.design/careers/&quot;&gt;We’re hiring for Nord team&lt;/a&gt;!&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;P.P.S.&lt;/strong&gt; &lt;em&gt;&lt;a href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/&quot;&gt;We’ve got interesting statistics about Nord here&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Nord Statistics For The First Year</title>
      <link href="https://arielsalminen.com/2022/nord-statistics-for-the-first-year/"/>
      <updated>2022-03-31T00:00:00Z</updated>
      <id>https://arielsalminen.com/2022/nord-statistics-for-the-first-year/</id>
      <content type="html">&lt;p&gt;You’re reading the ninth Nord Design System monthly update. During the past month we’ve been preparing the system for official launch and making sure we offer stable API and comprehensive docs.&lt;/p&gt;
&lt;p&gt;Looking back in time, we started our design system journey at the end of 2020 with initial user research. We did this because we wanted to first better understand the challenges we’re trying to solve at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; and how the design system might help.&lt;/p&gt;
&lt;p&gt;Back then, we interviewed around 60 different persons from different teams, with different backgrounds, and with different levels of experience. The result of this research was an organizational challenges heatmap that highlighted organization level problems.&lt;/p&gt;
&lt;p&gt;Once we had this data, we continued the research with a &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#figuring-out-challenges&quot;&gt;series of workshops&lt;/a&gt;. These workshops were meant to reveal a lack of alignment and personal biases across teams. The final output from these workshops was a set of prioritized actions that directly informed the backlog of the design system.&lt;/p&gt;
&lt;p&gt;Once we knew what the challenges were, it was a matter of creating fundamental &lt;a href=&quot;https://nordhealth.design/principles/&quot;&gt;principles&lt;/a&gt; and &lt;a href=&quot;https://nordhealth.design/about/#our-goals&quot;&gt;goals for the system&lt;/a&gt; that we should follow to start solving these issues. The concrete design and development work on the design system started in August 2021 when Eric and Nick joined the team.&lt;/p&gt;
&lt;p&gt;Now, 8 months later, we’re excited to launch Nord Design System and all of our tools for production usage! 🎉&lt;/p&gt;
&lt;h2 id=&quot;tools-you-can-use-today&quot;&gt;Tools you can use today &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#tools-you-can-use-today&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All of our tools are out of beta phase starting today and ready for production usage. &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt; have also reached release candidate (RC) status and we’ll publish &lt;code&gt;1.0.0&lt;/code&gt; next week unless significant bugs emerge.&lt;/p&gt;
&lt;p&gt;You can read more about each tool below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/figma/&quot;&gt;Figma Toolkit&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/css/&quot;&gt;CSS Framework&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Themes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/theme-builder/&quot;&gt;Theme Builder&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/nordicons/&quot;&gt;Nordicons&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Design Tokens&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://nordhealth.design/webfonts/&quot;&gt;Webfonts&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope you enjoy using Nord’s tools and help us improve them by providing feedback to us via &lt;a href=&quot;https://nordhealth.design/help/&quot;&gt;Slack&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/help/&quot;&gt;Office Hours&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/help/&quot;&gt;Monthly Meetups&lt;/a&gt;, and also the feedback functionality found from the bottom of each documentation page. Hope to hear from you soon!&lt;/p&gt;
&lt;h2 id=&quot;statistics-for-the-first-year&quot;&gt;Statistics for the first year &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#statistics-for-the-first-year&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We wanted to collect a few statistics here, so that we can better track the progress on Nord. We think some of these metrics are impressive for such a small team as for a long time the team was only one person, until we hired two more during summer 2021, and eventually by the end of the year the fourth person, &lt;a href=&quot;https://twitter.com/daviddarnes&quot;&gt;Dave&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here you go, the numbers:&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;team-has-grown-from-1-to-4&quot;&gt;Team has grown from 1 to 4 &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#team-has-grown-from-1-to-4&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nord team has grown from one to four persons and we’re &lt;a href=&quot;https://nordhealth.design/careers/&quot;&gt;currently hiring&lt;/a&gt; two more designers and developers for the team.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://arielsalminen.com/careers/&quot;&gt;View careers and apply&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;109%2C431-lines-of-code-written&quot;&gt;109,431 lines of code written &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#109%2C431-lines-of-code-written&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We had three people write a total of 109,431 lines of code that form the foundations of Nord Design System today.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/code.png&quot; class=&quot;image-padding&quot; alt=&quot;109,431 lines of code written&quot; /&gt;
&lt;h3 id=&quot;2%2C786-commits&quot;&gt;2,786 commits &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#2%2C786-commits&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We had three people make almost 3000 commits over the past year which are now merged to Main branch on &lt;a href=&quot;https://github.com/nordhealth&quot;&gt;Nordhealth GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/commits.png&quot; class=&quot;image-padding&quot; alt=&quot;2,786 commits commits to GitHub&quot; /&gt;
&lt;h3 id=&quot;1296-button-variations-and-states&quot;&gt;1296 button variations and states &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#1296-button-variations-and-states&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;!--alex disable simple--&gt;
&lt;p&gt;There are 1296 &lt;a href=&quot;https://nordhealth.design/components/button/&quot;&gt;button variations&lt;/a&gt; and states. This includes all &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;6 themes&lt;/a&gt; we have, but you shouldn’t ever underestimate a button and what a seemingly simple component can cost to an organization when it’s being reinvented by every single product team.&lt;/p&gt;
&lt;!--alex enable simple--&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/button.png&quot; class=&quot;image-padding&quot; alt=&quot;1296 button variations and states&quot; /&gt;
&lt;h3 id=&quot;3218-figma-frames&quot;&gt;3218 Figma frames &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#3218-figma-frames&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve worked through 49 &lt;a href=&quot;https://nordhealth.design/figma/&quot;&gt;Figma&lt;/a&gt; files which contain a total of 107 pages and 3218 frames that we’ve used for background research, design exploration, prototyping, and the components themselves.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/figma.png&quot; class=&quot;image-padding&quot; alt=&quot;3218 Figma frames&quot; /&gt;
&lt;h3 id=&quot;31-code-based-components&quot;&gt;31 code based components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#31-code-based-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;During the past 8 months we’ve designed and built a total of 31 code based Web Components. 27 of them &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;can be seen in the documentation&lt;/a&gt; already and 4 more are waiting behind existing pull requests on GitHub.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/components.png&quot; class=&quot;image-padding&quot; style=&quot;max-width: 600px;&quot; alt=&quot;31 code based components&quot; /&gt;
&lt;h3 id=&quot;32.96-kb-total-bundle-size&quot;&gt;32.96 kB total bundle size &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#32.96-kb-total-bundle-size&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://lit.dev/&quot;&gt;Lit&lt;/a&gt; has helped us to keep Nord’s bundle size small. All of our CSS and &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt; combined weigh around 33 kB (minified and compressed).&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/terminal.png&quot; style=&quot;max-width: 500px;&quot; alt=&quot;32.96 kB total bundle size&quot; /&gt;
&lt;h3 id=&quot;95.57-%25-code-coverage&quot;&gt;95.57 % code coverage &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#95.57-%25-code-coverage&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Our automated tests currently cover 95.57% of the code base. We use &lt;a href=&quot;https://modern-web.dev/docs/test-runner/overview/&quot;&gt;Web Test Runner&lt;/a&gt;, &lt;a href=&quot;https://mochajs.org/&quot;&gt;Mocha&lt;/a&gt;, and &lt;a href=&quot;https://pptr.dev/&quot;&gt;Puppeteer&lt;/a&gt; to automate E2E, unit, accessibility, and screenshot diff tests.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/tests.png&quot; class=&quot;image-padding&quot; alt=&quot;95.57% code coverage&quot; /&gt;
&lt;h3 id=&quot;256-design-tokens&quot;&gt;256 design tokens &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#256-design-tokens&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;256 design tokens&lt;/a&gt; that we use to store design variables like colors, font sizes and spacing information. These are used instead of hard coded values to ensure a better UI consistency across different platforms.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/tokens.png&quot; class=&quot;image-padding&quot; style=&quot;max-width: 70%&quot; alt=&quot;256 design tokens&quot; /&gt;
&lt;h3 id=&quot;200%2C000%2B-page-views&quot;&gt;200,000+ page views &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#200%2C000%2B-page-views&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We have had over 200K page views on &lt;a href=&quot;https://nordhealth.design/&quot;&gt;nordhealth.design&lt;/a&gt; documentation website since May, 2021 when we started measuring visits.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/pageviews.png&quot; class=&quot;image-padding&quot; alt=&quot;200,000+ page views&quot; /&gt;
&lt;h3 id=&quot;3373-hours-of-work&quot;&gt;3373 hours of work &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#3373-hours-of-work&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Our team of four persons has used a total of 3373 hours to design, build and maintain the system we have today.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/hours.png&quot; class=&quot;image-padding&quot; alt=&quot;3373 hours of work&quot; /&gt;
&lt;h3 id=&quot;282-versions-published&quot;&gt;282 versions published &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#282-versions-published&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;During the past year we’ve published 282 packages versions to &lt;a href=&quot;https://www.npmjs.com/org/nordhealth&quot;&gt;npm&lt;/a&gt; that have recently started getting more downloads as teams start utilizing these tools.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/packages.png&quot; class=&quot;image-padding&quot; alt=&quot;282 versions published&quot; /&gt;
&lt;h3 id=&quot;402-pages-of-documentation&quot;&gt;402 pages of documentation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#402-pages-of-documentation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve created over 400 pages of documentation and live code examples combined during the past year which are all live at &lt;a href=&quot;https://nordhealth.design/&quot;&gt;nordhealth.design&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/docs.png&quot; class=&quot;image-padding&quot; style=&quot;max-width: 650px;&quot; alt=&quot;402 pages of documentation&quot; /&gt;
&lt;h3 id=&quot;100%25-lighthouse-performance-score&quot;&gt;100% Lighthouse performance score &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#100%25-lighthouse-performance-score&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/lighthouse-load-performance/&quot;&gt;Lighthouse&lt;/a&gt;, a tool by Google that evaluates websites by their performance, accessibility, and other best practices, scores our application templates with 100% score.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/performance.png&quot; class=&quot;image-padding&quot; style=&quot;max-width: 650px;&quot; alt=&quot;100% Lighthouse performance score&quot; /&gt;
&lt;h3 id=&quot;309-completed-linear-issues&quot;&gt;309 completed Linear issues &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#309-completed-linear-issues&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve worked through a backlog of 385 tasks and completed 309 of them in a tool called &lt;a href=&quot;https://linear.app/&quot;&gt;Linear&lt;/a&gt; that we use for issue tracking and task prioritization.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/launch/linear.png&quot; class=&quot;image-padding&quot; style=&quot;max-width: 339px;&quot; alt=&quot;309 completed Linear issues &quot; /&gt;
&lt;h3 id=&quot;120-completed-roadmap-goals&quot;&gt;120 completed roadmap goals &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-statistics-for-the-first-year/#120-completed-roadmap-goals&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve completed 120 high level roadmap goals since we’ve started the work on Nord.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Bug reporting capabilities and enhanced support for design system.&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Improved documentation regarding getting started with Nord.&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Creating content guidelines for components.&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Web Components reaches stable 1.0 state.&lt;/del&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Badge component&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Button component&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Calendar component&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Card component&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Checkbox component&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Etc…&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Nord Design System Architecture</title>
      <link href="https://arielsalminen.com/2022/nord-design-system-architecture/"/>
      <updated>2022-02-21T00:00:00Z</updated>
      <id>https://arielsalminen.com/2022/nord-design-system-architecture/</id>
      <content type="html">&lt;p&gt;You’re reading the eigth Nord Design System monthly update. This month I wanted to give a little more insight into how we’ve architectured Nord’s packages and how they’re interconnected.&lt;/p&gt;
&lt;p&gt;One of the recent major changes in Nord is that we’ve re-designed the underlying package architecture. The reason why we decided to do such a big fundamental change this close to our official release, is that we felt like the original structure was too complex to use and that there were too many dependencies between the different packages overall.&lt;/p&gt;
&lt;p&gt;In early January we decided to do something about this and simplify the architecture. Originally, if you wanted to utilize any of the components, you had to first install and link our &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Design Tokens&lt;/a&gt;, then install and link &lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;Webfonts&lt;/a&gt;, then our &lt;a href=&quot;https://nordhealth.design/css/&quot;&gt;CSS Framework&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Themes&lt;/a&gt;, and finally the &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt; themself. That’s quite a few steps, huh?!&lt;/p&gt;
&lt;h3 id=&quot;in-the-re-designed-architecture-we-have-two-different-levels-to-the-packages%3A&quot;&gt;In the re-designed architecture we have two different levels to the packages: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2022/nord-design-system-architecture/#in-the-re-designed-architecture-we-have-two-different-levels-to-the-packages%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;On the first level, we have packages called &lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;Webfonts&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Design Tokens&lt;/a&gt;, and &lt;a href=&quot;https://nordhealth.design/nordicons/&quot;&gt;Nordicons&lt;/a&gt; (illustrated below). These packages are like atoms of the systems as they don’t have external or internal dependencies into any other packages in the system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the second level, we have &lt;a href=&quot;https://nordhealth.design/css/&quot;&gt;CSS Framework&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/components/&quot;&gt;Web Components&lt;/a&gt;, and &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Themes&lt;/a&gt; (illustrated below). These packages internally depend on the first level packages, but we wanted to hide these dependencies for the end user, Frontend Developer in this case, meaning that you’d more or less always install one or more of the second level packages only into your app to consume parts of the system:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/architecture/1.jpg&quot; alt=&quot;Nord Design System architecture overview&quot; /&gt;
&lt;p&gt;As an example, if you would like to use our &lt;strong&gt;CSS Framework,&lt;/strong&gt; you would only install that specific NPM package and that’s really it. You don’t have to care, as a user, that internally this package also also uses our &lt;strong&gt;Webfonts&lt;/strong&gt; and &lt;strong&gt;Design Token&lt;/strong&gt; packages:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/architecture/2.jpg&quot; alt=&quot;Dependencies for utilizing CSS Framework&quot; /&gt;
&lt;p&gt;Another example could be that if you’d want to skin your application with one of our themes, you’d also add the &lt;strong&gt;Themes&lt;/strong&gt; package and choose a theme to use from it. Again, internally, we still use both &lt;strong&gt;Webfonts&lt;/strong&gt; and &lt;strong&gt;Design Token&lt;/strong&gt; packages, but as a user, you don’t have to care about those:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/architecture/3.jpg&quot; alt=&quot;Dependencies for utilizing Nord Themes&quot; /&gt;
&lt;p&gt;Finally, in the below example, we show all three first level packages being used internally (Webfonts, Design Tokens and Nordicons), but for the end user, only &lt;strong&gt;CSS Framework&lt;/strong&gt; and &lt;strong&gt;Web Components&lt;/strong&gt; will be relevant in this case:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/architecture/4.jpg&quot; alt=&quot;Dependencies for utilizing Web Components&quot; /&gt;
&lt;p&gt;You could also directly utilize one of the first level packages, like the &lt;strong&gt;Design Tokens&lt;/strong&gt; if you’re working on a native iOS application and want to pull in the base colors and similar styles in XML format:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/architecture/5.jpg&quot; alt=&quot;Dependencies for utilizing Design Tokens on iOS&quot; /&gt;
&lt;p&gt;While the above is still possible, we wanted to avoid the user having to install a lot of different dependencies to be able to use a utility class from the CSS Framework, or a component from the Web Components package.&lt;/p&gt;
&lt;p&gt;All of this seems quite evident in hindsight, but our original thinking was to strive for modularity to reduce the complexity and improve our system’s reusability by breaking it into small, easier to consume parts.&lt;/p&gt;
&lt;p&gt;This modularity eventually increased the complexity for the users because we didn’t consider the API carefully enough, especially when it comes to CSS Custom Properties and the complex theming system we’ve got.&lt;/p&gt;
&lt;p&gt;In the new architecture we’ve still kept the same level of modularity inside the system, but simplified it for our users and now offer a better and simpler API. These changes also nicely align with one of our key &lt;a href=&quot;https://nordhealth.design/principles/&quot;&gt;design principles&lt;/a&gt; which states that &lt;strong&gt;“developers should be able to start using our tools in minutes, not hours, days or weeks.”&lt;/strong&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Nord Design System October 2021 Update</title>
      <link href="https://arielsalminen.com/2021/nord-design-system-october-2021-update/"/>
      <updated>2021-10-14T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/nord-design-system-october-2021-update/</id>
      <content type="html">&lt;p&gt;You’re reading the fifth Nord Design System monthly update. This month we’ve gained great momentum and have published four new packages, and made many improvements to Nord documentation.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;Nord Design System&lt;/a&gt; is still quite young, we feel like it’s a good idea to once in a while repeat why we are building these tools and what’s really the scope of our work. To us, a “design system” is a collection of reusable components and tools, guided by clear standards, that can be assembled together to build digital products and experiences.&lt;/p&gt;
&lt;p&gt;What this means, is that we aren’t really designing the workflows and features of each product. Instead, our goal is to provide the best possible tools, components, and guidelines for our designers and developers working in each product team to be able to build more consistent products at scale, faster, and with better outcomes.&lt;/p&gt;
&lt;p&gt;The ultimate end goal for us is to provide tools that allow us, &lt;a href=&quot;https://nordhealth.com/&quot;&gt;as a company&lt;/a&gt;, to better serve our end users and that is really at the center of everything we do. We want to transform our culture, processes, and practices to support this mission and the design system is an important tool to help us with this transformation.&lt;/p&gt;
&lt;p&gt;The fundamental purpose of Nord is to elevate our design and frontend development practices in-house, bring those disciplines closer together, improve the consistency between products, and also improve the working efficiency for everyone in the long run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We’re here to make your life easier, &lt;a href=&quot;https://nordhealth.design/help/&quot;&gt;let us know how we can help&lt;/a&gt; your team.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As mentioned earlier, we’ve published quite a few &lt;a href=&quot;https://nordhealth.design/changelog/&quot;&gt;new packages&lt;/a&gt; and features this month, so we’re listing all of them below and linking to their respective documentation pages for detailed information about usage and such.&lt;/p&gt;
&lt;h2 id=&quot;nord-design-tokens-1.0.0&quot;&gt;Nord Design Tokens &lt;span class=&quot;n-badge n-badge-l&quot;&gt;1.0.0&lt;/span&gt; &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#nord-design-tokens-1.0.0&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Design tokens are a tech-agnostic way to store variables. We use tokens instead of hard coded values to ensure a better UI consistency across different platforms. Design tokens reached stable state this week and they’re now ready for production usage.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/design-tokens.png&quot; alt=&quot;Nord Design Tokens&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;nord-themes-2.0.0&quot;&gt;Nord Themes &lt;span class=&quot;n-badge n-badge-l&quot;&gt;2.0.0&lt;/span&gt; &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#nord-themes-2.0.0&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord’s parts are themable using CSS Custom Properties. We ship pre-made themes for Nordhealth, Veterinary and Healthcare. You can utilize these themes through our Themes package which reached stable state this week and is now ready for production usage.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/themes.svg&quot; alt=&quot;Nord Themes&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;nordicons-1.0.0&quot;&gt;Nordicons &lt;span class=&quot;n-badge n-badge-l&quot;&gt;1.0.0&lt;/span&gt; &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#nordicons-1.0.0&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nordicons are used to provide additional meaning or in places where text label doesn’t fit. They communicate messages at a glance and draw attention to important information. Nordicons package reached stable state this week and is now ready for production usage.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/nordicons/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/nordicons.png&quot; alt=&quot;Nordicons&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;nord-webfonts-2.0.0&quot;&gt;Nord Webfonts &lt;span class=&quot;n-badge n-badge-l&quot;&gt;2.0.0&lt;/span&gt; &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#nord-webfonts-2.0.0&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nord Design System provides an npm package that makes it straightforward to use our webfonts. This package ships with all the necessary font files in addition to Sass, Less, and CSS for self-hosting. Nord’s Webfonts package reached stable state this week and is now ready for production usage.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/inter.svg&quot; alt=&quot;Nord Webfonts&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;nord-cdn&quot;&gt;Nord CDN &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#nord-cdn&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We now serve all of Nord’s packages via a new Content Delivery Network for better performance and stability. Nord CDN also makes it faster to implement and use our packages in production.&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/cdn/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/cdn.jpg&quot; alt=&quot;Nord CDN&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;improved-documentation&quot;&gt;Improved documentation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-october-2021-update/#improved-documentation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We’ve worked on improving our documentation platform and added a handful of new features to make the daily usage nicer for everyone. The biggest changes include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We’ve moved from global theming into a local theming. You can see this in action above and on e.g. our &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Design Tokens documentation&lt;/a&gt; or on &lt;a href=&quot;https://nordhealth.design/components/stack/&quot;&gt;Stack component page&lt;/a&gt;. No more hiding of content per theme, so all content is easier to discover.&lt;/li&gt;
&lt;li&gt;All code examples now include “copy to clipboard” functionality. You can see this in action above and on e.g. &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Themes documentation&lt;/a&gt;. Additionally, we’ve also added this functionality to the &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;Design Tokens&lt;/a&gt; documentation.&lt;/li&gt;
&lt;li&gt;The search in the docs has been improved and it should now work much more reliably to make it quicker to find and discover content. Please note that when you search you can use arrow up/down keys and enter to select a result you want to open.&lt;/li&gt;
&lt;li&gt;We’ve added a new visual style to highlight specific content from the rest when needed. There’s an example shown above this list.&lt;/li&gt;
&lt;li&gt;The documentation itself is now using Nord Web Components so in a way we’re dog fooding ourselves with our own product to find issues and make it more robust.&lt;/li&gt;
&lt;li&gt;There’s a lot of new content, including usage guidelines for &lt;a href=&quot;https://nordhealth.design/tokens/#usage&quot;&gt;Design Tokens&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;Themes&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;Webfonts&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/nordicons/&quot;&gt;Nordicons&lt;/a&gt;, &lt;a href=&quot;https://nordhealth.design/cdn/&quot;&gt;Nord CDN&lt;/a&gt; and &lt;a href=&quot;https://nordhealth.design/start/&quot;&gt;more…&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
    </entry>
    
    <entry>
      <title>Nord Design System September 2021 Update</title>
      <link href="https://arielsalminen.com/2021/nord-design-system-september-2021-update/"/>
      <updated>2021-09-07T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/nord-design-system-september-2021-update/</id>
      <content type="html">&lt;p&gt;You’re reading the fourth Nord Design System monthly update. This month we’ve been working on making sure that everyone at Nordhealth understands how and why we’re building a design system.&lt;/p&gt;
&lt;p&gt;We started the design systems work at &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; in late 2020. The way I usually recommend starting this work is via user research, which helps us to figure out what are the challenges on organization, team, and people level that we should be solving. We do this because all companies are different and there isn’t one solution that fits everyone when it comes to design systems.&lt;/p&gt;
&lt;p&gt;Back then we interviewed ~60 different persons from different teams, with different backgrounds, and with different levels of experience. The result of this research was an organizational challenges heatmap that highlighted organization level problems.&lt;/p&gt;
&lt;p&gt;Now that we had a clear list of challenges that we wanted to start solving, it was a matter of creating fundamental principles and goals for the system that we should follow to start solving these issues. We came up with these four goals for Nord:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/goals.jpg&quot; alt=&quot;Nord goals&quot; /&gt;
&lt;p&gt;At the same time, we also created design principles for the design systems work that would form the foundations for Nord and guide our team when working on the different parts of the system and help us do better and more informed decisions. These are the six design principles we created for Nord:&lt;/p&gt;
&lt;h3 id=&quot;1.-put-user-needs-first&quot;&gt;1. Put user needs first &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#1.-put-user-needs-first&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We care for the people who use our products. We’re here to make their day-to-day and long-term work better and more pleasant through great user experience.&lt;/p&gt;
&lt;h3 id=&quot;2.-strive-for-consistency%2C-not-uniformity&quot;&gt;2. Strive for consistency, not uniformity &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#2.-strive-for-consistency%2C-not-uniformity&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We should use the same language and design patterns wherever possible. This helps people get familiar with our services. Same holds true for the system and its developer experience.&lt;/p&gt;
&lt;h3 id=&quot;3.-default-to-openness&quot;&gt;3. Default to openness &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#3.-default-to-openness&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We should share what we’re doing whenever we can. Building our services transparently increases their visibility and accountability and makes us push towards higher quality.&lt;/p&gt;
&lt;h3 id=&quot;4.-make-it-accessible&quot;&gt;4. Make it accessible &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#4.-make-it-accessible&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Our services are for everyone. We make sure people with different needs can use our products and that they meet the accessibility standards outlined in WCAG 2.1.&lt;/p&gt;
&lt;h3 id=&quot;5.-provide-a-good-developer-experience&quot;&gt;5. Provide a good developer experience &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#5.-provide-a-good-developer-experience&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Providing a good developer experience is very important to us. Developers should be able to start using our tools in minutes, not hours, days or weeks.&lt;/p&gt;
&lt;h3 id=&quot;6.-automate-everything-you-can&quot;&gt;6. Automate everything you can &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#6.-automate-everything-you-can&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We value the time of our colleagues, users, and our future selves over our own. We are always proactively looking for ways to automate repetitive tasks and testing.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/agnostic.jpg&quot; alt=&quot;Nord has tech-agnostic components&quot; /&gt;
&lt;p&gt;Whenever I talk about Nord Design System, one of the first things that I like to mention is that we’re building a system that is &lt;strong&gt;tech agnostic, not tech specific.&lt;/strong&gt; Meaning that you can take any component from Nord and use it with any framework. That could be Angular, React, Preact, Vue.js, plain HTML, your old PHP application, or any future framework.&lt;/p&gt;
&lt;p&gt;We achieve this by building on top of existing web standards (&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components&quot;&gt;Web Components&lt;/a&gt; to be exact), instead of choosing a specific framework to go with. This is really important for us for a few reasons;&lt;/p&gt;
&lt;h3 id=&quot;tech-agnostic-instead-of-tech-specific&quot;&gt;Tech-Agnostic Instead Of Tech-Specific &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#tech-agnostic-instead-of-tech-specific&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In order to create modular interfaces, a design system needs to be technology-agnostic instead of technology-specific. Web Components offer this benefit and make it easier to reduce our design system’s complexity and improve its reusability.&lt;/p&gt;
&lt;h3 id=&quot;future-proofing-with-web-standards&quot;&gt;Future Proofing With Web Standards &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#future-proofing-with-web-standards&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Web_standards&quot;&gt;Web Standards&lt;/a&gt; are more future proof than any given JavaScript framework. I’ve seen different frameworks come and go during my almost two decade long career on the web, but Web Standards keep thriving and evolving.&lt;/p&gt;
&lt;h3 id=&quot;any-framework-or-no-framework&quot;&gt;Any Framework Or No Framework &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#any-framework-or-no-framework&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Web Components can be used with &lt;a href=&quot;https://custom-elements-everywhere.com/&quot;&gt;any JavaScript framework&lt;/a&gt; or no framework at all. This means we’re able to support all our product teams from a single codebase. This makes it possible for our small design system team to be very efficient.&lt;/p&gt;
&lt;h3 id=&quot;full-encapsulation&quot;&gt;Full Encapsulation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-september-2021-update/#full-encapsulation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM&quot;&gt;Shadow DOM&lt;/a&gt; allows components to have their own DOM tree that can’t be accidentally accessed from the main document. For us this means that “everything just works” when the components are implemented onto different environments and platforms. Most styles cannot penetrate a component from the outside, and styles inside a component won’t bleed out.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/agnostic-2.jpg&quot; alt=&quot;Nord has tech-agnostic styles as well&quot; /&gt;
&lt;p&gt;Nord’s tech-agnostic thinking isn’t limited to only components either, all our styles are agnostic as well. We use &lt;a href=&quot;https://arielsalminen.com/tokens/&quot;&gt;design tokens&lt;/a&gt; instead of hard coded values to ensure a better UI consistency across different platforms. Be that a web application, a native application, a mobile application, a VR solution, or something new that doesn’t even exist today.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/structure.jpg&quot; alt=&quot;Nord’s technical architecture&quot; /&gt;
&lt;p&gt;Looking at the way &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;Nord&lt;/a&gt; itself is structured, looks somewhat like shown in the picture above. The most important thing about the architecture is that we aren’t really talking about one gigantic design system, but multiple small modular systems that can be used either standalone or together depending on specific team’s needs.&lt;/p&gt;
&lt;p&gt;So on a high-level we have design tokens which are the base building blocks of our design language. There we define things like colors, fonts, spacing, shadows, and other properties that create the visual look. Then on the second level we have packages such as Nord’s CSS Framework, Theme system, Web Components, and Figma components.&lt;/p&gt;
&lt;p&gt;What ties it all together is our documentation and guidelines at &lt;a href=&quot;https://nordhealth.design/&quot;&gt;nordhealth.design&lt;/a&gt; which is getting more and more automated as we move along.&lt;/p&gt;
&lt;a href=&quot;https://arielsalminen.com/work/nordhealth-pay/&quot; target=&quot;_blank&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/prototype.jpg&quot; alt=&quot;Nord UI prototype&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;The last thing I perhaps want to share in this update, is an &lt;a href=&quot;https://arielsalminen.com/work/nordhealth-pay/&quot; target=&quot;_blank&quot;&gt;early prototype&lt;/a&gt; of Nord’s UI components (there’s also an even older version which I did when I was the only person in the team: &lt;a href=&quot;https://arielsalminen.com/work/nordhealth-pay-old/&quot; target=&quot;_blank&quot;&gt;view that here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;We’ve been moving back and forth between Figma and HTML prototypes to be able adjust the micro interactions and how the UI feels in real use in real environment, which is the web browser. Things will definitely still change quite a lot as we’re rapidly iterating on the design and theming, but &lt;a href=&quot;https://arielsalminen.com/work/nordhealth-pay/&quot; target=&quot;_blank&quot;&gt;take a peek of what’s under work&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Nord Design System June 2021 Update</title>
      <link href="https://arielsalminen.com/2021/nord-design-system-june-2021-update/"/>
      <updated>2021-06-30T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/nord-design-system-june-2021-update/</id>
      <content type="html">&lt;p&gt;You’re reading the third Nord Design System monthly update. This month we’ve been focusing on onboarding new team members and also rolling out the new brand guidelines into the documentation.&lt;/p&gt;
&lt;p&gt;In the beginning of the month, &lt;a href=&quot;https://www.linkedin.com/in/eric-habich-236484ab/&quot;&gt;Eric Habich&lt;/a&gt;, our new product designer, joined Nord Design System team. I’ve personally worked with Eric in the past with various clients when I was still living in the San Francisco Bay Area and knew beforehand how talented addition he’d be for our small team. As the first task to get more familiar with Nord, Eric illustrated &lt;a href=&quot;https://nordhealth.design/&quot;&gt;our home page&lt;/a&gt; and the different tools we offer with these nifty drawings:&lt;/p&gt;
&lt;a href=&quot;https://arielsalminen.com/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/illustrations.png&quot; style=&quot;max-width:738px&quot; alt=&quot;Nord illustrations&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;The interesting bit with these illustrations is that they’re all themed with CSS Custom Properties and use Nord’s &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;theming feature&lt;/a&gt;. This means that each illustration variant in the documentation is actually the same SVG which gets its colors from the &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;design tokens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In late May, we also published &lt;a href=&quot;https://nordhealth.design/brand/&quot;&gt;Nordhealth brand guidelines&lt;/a&gt;. This is a result of the brand work we’ve been working on since February and which I shared a little about in the &lt;a href=&quot;https://nordhealth.design/updates/may-2021/&quot;&gt;last monthly update&lt;/a&gt;:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/brand/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/brand-guidelines.png&quot; loading=&quot;lazy&quot; alt=&quot;Nordhealth brand guidelines&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;Together with the above update, we’ve been also improving our &lt;a href=&quot;https://nordhealth.design/downloads/&quot;&gt;downloads section&lt;/a&gt; throughout the month to make sure all the brand assets would be available there for downloading and usage:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/downloads/&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/downloads.png&quot; loading=&quot;lazy&quot; alt=&quot;Nord downloads&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;Later during June, we started moving our focus more into product design and started doing both background research and competitive research to help us start designing the system’s parts. We currently have various related Figma documents under the Nord project, like for example the below Interface Audit:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/interface-audit.png&quot; loading=&quot;lazy&quot; alt=&quot;Nord User Interface Audit&quot; /&gt;
&lt;p&gt;…or this document where we’ve started collecting user flows, screens, and information architectures…&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/research.png&quot; loading=&quot;lazy&quot; alt=&quot;Nord design system background research&quot; /&gt;
&lt;p&gt;…or this document with typeface tests and visual directions to work with…&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/typography.png&quot; loading=&quot;lazy&quot; alt=&quot;Nord typography&quot; /&gt;
&lt;p&gt;…and eventually also documents where we’ve started to draft out the actual interface concepts:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/drafts.png&quot; loading=&quot;lazy&quot; alt=&quot;Nord drafts&quot; /&gt;
&lt;p&gt;Finally, while we’ve moved things forward in Figma, we’ve also started researching on how to sync Figma, our different &lt;a href=&quot;https://nordhealth.design/themes/&quot;&gt;color themes&lt;/a&gt;, and the code based &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;design tokens&lt;/a&gt; and built this prototype Figma plugin that fetches the tokens from Nord Design Tokens Node.js package and generates color libraries for Figma usage and syncing:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/figma.gif&quot; loading=&quot;lazy&quot; style=&quot;max-width:579px&quot; alt=&quot;Nord Design System Figma plugin&quot; /&gt;
&lt;p&gt;June has been busy, and there’re quite a few things under work behind the scenes which aren’t yet visible in the live system, but which will later start surfacing here in the form of components and larger user interface patterns. Right now though, as it is the end of the month, our whole team would like to wish you all wonderful summer holidays! We’ll catch up again with you in August.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Nord Design System May 2021 Update</title>
      <link href="https://arielsalminen.com/2021/nord-design-system-may-2021-update/"/>
      <updated>2021-05-16T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/nord-design-system-may-2021-update/</id>
      <content type="html">&lt;p&gt;You’re reading the second Nord Design System monthly update. Since February, we’ve been busy rethinking our design processes and brand identity that was launched a few weeks ago.&lt;/p&gt;
&lt;p&gt;During the past months our team has been busy rethinking our brand identity from the ground up. We wanted to go through this effort to mirror the growth and transformation of our company into the leading cloud-based provider of healthcare and veterinary software. As a result, “Three Plus Group” and “Finnish Net Solutions” now have a new name and corporate identity and are now all called &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our new logo represents “togetherness.” Two sides working as one. So, on a business level, it represents a key driver for us, acquisition. For our customers and end users, it expresses the seamless use of our products to improve productivity and communication. We bring healthcare professionals closer to their patients. Our new logo also defines how our teams work as a strong unshakable unit. On a deeper level, the logo also illustrates a bigger idea, change and innovation in the global healthcare market.&lt;/p&gt;
&lt;p&gt;This rebranding is a start of a bigger design transformation at Nordhealth. Our plan isn’t to merely rethink the corporate brand. The goal is to continue this work and rethink our design processes and digital products from the ground up and improve their user experience and user interfaces vastly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is where Nord Design System steps in. Nord is our platform for driving the design transformation.&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/brand.svg&quot; class=&quot;image-padding&quot; alt=&quot;New Nordhealth brand&quot; /&gt;
</content>
    </entry>
    
    <entry>
      <title>Nordhealth Rebranding</title>
      <link href="https://arielsalminen.com/2021/nordhealth-rebranding/"/>
      <updated>2021-04-15T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/nordhealth-rebranding/</id>
      <content type="html">&lt;p&gt;I’m happy to announce Three Plus Group’s and Finnish Net Solutions’ new name and corporate identity, &lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt;. The name change is a result of a rebranding that I did for the company earlier this year.&lt;/p&gt;
&lt;p&gt;It’s designed to mirror the growth and transformation of the company into the leading cloud-based provider of software for &lt;a href=&quot;https://nordhealth.com/products/&quot;&gt;therapy clinics&lt;/a&gt; in the Nordics and &lt;a href=&quot;https://nordhealth.com/products/&quot;&gt;veterinary clinics&lt;/a&gt; globally.&lt;/p&gt;
&lt;p&gt;Charles MacBain, Chief Executive Officer at Nordhealth, commented the rebranding:&lt;/p&gt;
&lt;blockquote&gt;“As we near our 20th anniversary, we decided to rebrand our company to reflect our updated vision, mission and values. Although we have a global footprint, we wanted to pay tribute to our Nordic values which include innovation, creativity, design, sustainability, and equality, which our company strives to embody across the world.”&lt;/blockquote&gt;
&lt;p&gt;I personally commented the redesign in a recent press release:&lt;/p&gt;
&lt;blockquote&gt;“Our new brand represents ‘togetherness.’ Two sides working as one. So, on a business level it represents a key driver for us, acquisition. For our customers and end users, it expresses the seamless use of our products to improve productivity and communication.“
&lt;br /&gt;&lt;br /&gt;  
“We bring healthcare professionals closer to their patients. Our brand also defines how our teams work as a strong unshakable unit. On a deeper level, the brand also illustrates a bigger idea, change and innovation in the global healthcare market.”&lt;/blockquote&gt;
&lt;p&gt;The company rebranding is a start of a bigger design transformation at Nordhealth. Our plan isn’t just to rethink the global brand. The goal is to continue this work and also rethink the design processes and digital products from the ground up and improve their user experience vastly.&lt;/p&gt;
&lt;p&gt;The rebranding I did included a full redesign of the company’s logo, website, graphics, communications and correspondence. Nordhealth’s new brand assets also included a simplified two color logo, along with &lt;a href=&quot;https://nordhealth.com/&quot;&gt;a new website&lt;/a&gt; that I designed and developed, among with other visual communications tools that utilize simple, bold graphics to convey complex solutions in an understandable way.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/brand.svg&quot; width=&quot;808&quot; height=&quot;539&quot; class=&quot;image-padding&quot; style=&quot;min-width: 100%;&quot; alt=&quot;&quot; /&gt;</content>
    </entry>
    
    <entry>
      <title>Nord Design System February 2021 Update</title>
      <link href="https://arielsalminen.com/2021/nord-design-system-february-2021-update/"/>
      <updated>2021-02-17T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/nord-design-system-february-2021-update/</id>
      <content type="html">&lt;p&gt;You’re reading the first ever Nord Design System monthly update. We’re just starting our design systems journey at Nordhealth and have created this documentation platform to support these efforts.&lt;/p&gt;
&lt;p&gt;The aim of this platform is to serve as a hub for &lt;a href=&quot;http://nordhealth.com/&quot;&gt;Nordhealth’s&lt;/a&gt; user interface design and frontend development work in the future. We’re pushing towards automating most parts of the documentation creation, but you should also expect to see manually crafted design guidelines, development tutorials, and similar here in the future.&lt;/p&gt;
&lt;p&gt;To stay up to date with the latest &lt;a href=&quot;https://nordhealth.design/changelog/&quot;&gt;releases&lt;/a&gt; and &lt;a href=&quot;https://nordhealth.design/updates/&quot;&gt;updates&lt;/a&gt; from our design systems team, you can follow the &lt;a href=&quot;https://nordhealth.design/new/&quot;&gt;what’s new&lt;/a&gt; section that includes our current roadmap and any future updates we might release.&lt;/p&gt;
&lt;p&gt;Currently, our main focus has been on brand refresh, exploring the overall visual direction, how the theming system works, and also creating the underlying technical architecture to support the work that follows.&lt;/p&gt;
&lt;p&gt;Our draft style guide looks like this:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/styleguide-provet.svg&quot; class=&quot;provet&quot; alt=&quot;Provet Cloud style guide&quot; /&gt;
&lt;img src=&quot;https://arielsalminen.com/img/styleguide-diarium.svg&quot; class=&quot;diarium&quot; alt=&quot;Diarium style guide&quot; /&gt;
&lt;p&gt;We’ve also started exploring components a little and how they could behave and look like. Here’s a concept on navigation that we’ve also tested on the documentation itself:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/component-navigation.png&quot; alt=&quot;Navigation component concept&quot; /&gt;
&lt;p&gt;Last week, we also published the very first production ready design systems package, &lt;a href=&quot;https://arielsalminen.com/changelog/&quot;&gt;Nord Webfonts&lt;/a&gt;, which includes our UI typefaces and related tools to utilize them:&lt;/p&gt;
&lt;h3 id=&quot;nord-webfonts-1.0.1&quot;&gt;Nord Webfonts 1.0.1 &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/nord-design-system-february-2021-update/#nord-webfonts-1.0.1&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Initial release of &lt;code&gt;@nordhealth/fonts&lt;/code&gt; which includes &lt;em&gt;Nordhealth Sans&lt;/em&gt; and &lt;em&gt;Nordhealth Mono.&lt;/em&gt; For documentation and usage guidelines, please see &lt;a href=&quot;https://nordhealth.design/typography/&quot;&gt;Webfonts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Makes &lt;code&gt;@nordhealth/fonts&lt;/code&gt; package completely independent from &lt;code&gt;@nordhealth/tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Can now be used standalone without any other package from Nord.&lt;/li&gt;
&lt;li&gt;Release date 11.2.2021.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ve also started drafting Nord Design Tokens which you can &lt;a href=&quot;https://nordhealth.design/tokens/&quot;&gt;browse here&lt;/a&gt;. Make sure to try out the theme switcher on the top left corner of the browser window:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/view-tokens-provet.png&quot; class=&quot;provet&quot; alt=&quot;Provet Design Tokens&quot; /&gt;
&lt;img src=&quot;https://arielsalminen.com/img/view-tokens-diarium.png&quot; class=&quot;diarium&quot; alt=&quot;Diarium Design Tokens&quot; /&gt;
&lt;p&gt;Finally, you can also view slidedeck for this month’s update below:&lt;/p&gt;
&lt;a href=&quot;https://nordhealth.design/assets/presentations/nord-update-12-02-2021/&quot; target=&quot;_blank&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/slidedeck-1.png&quot; alt=&quot;February update slidedeck&quot; style=&quot;max-width:760px;&quot; /&gt;
&lt;/a&gt;</content>
    </entry>
    
    <entry>
      <title>Design Principles of Nord Design System</title>
      <link href="https://arielsalminen.com/2021/design-principles-of-nord-design-system/"/>
      <updated>2021-01-15T00:00:00Z</updated>
      <id>https://arielsalminen.com/2021/design-principles-of-nord-design-system/</id>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://nordhealth.com/&quot;&gt;Nordhealth&lt;/a&gt; hired me in 2020 to help reimagine what the company’s approach to designing, building and shipping digital products at scale should look like. I started this work by conducting a series of user research activities and workshops to reveal a lack of alignment and personal biases across business units, products and teams to understand how the design system could help them.&lt;/p&gt;
&lt;p&gt;When we had a clear view of the challenges that we wanted to solve, it was a matter of creating fundamental principles and goals for the system that we could follow as a team. We came up with &lt;a href=&quot;https://nordhealth.design/about/#our-goals&quot;&gt;four primary goals&lt;/a&gt; for Nord. At the same time, I also created design principles for the design systems work that would form the foundations for Nord and help us do better and more informed decisions. I’ve listed them below.&lt;/p&gt;
&lt;h2 id=&quot;1.-put-user-needs-first&quot;&gt;1. Put user needs first &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/#1.-put-user-needs-first&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We care for the people who use our products. We’re here to make their day-to-day and long-term work better and more pleasant through great user experience.&lt;/p&gt;
&lt;h2 id=&quot;2.-strive-for-consistency%2C-not-uniformity&quot;&gt;2. Strive for consistency, not uniformity &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/#2.-strive-for-consistency%2C-not-uniformity&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We should use the same language and design patterns wherever possible. This helps people get familiar with our services. Same holds true for the system and its developer experience.&lt;/p&gt;
&lt;h2 id=&quot;3.-default-to-openness&quot;&gt;3. Default to openness &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/#3.-default-to-openness&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We should share what we’re doing whenever we can. Building our services transparently increases their visibility and accountability and makes us push towards higher quality.&lt;/p&gt;
&lt;h2 id=&quot;4.-make-it-accessible&quot;&gt;4. Make it accessible &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/#4.-make-it-accessible&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our services are for everyone. We make sure people with different needs can use our products and that they meet the accessibility standards outlined in WCAG 2.1.&lt;/p&gt;
&lt;h2 id=&quot;5.-provide-a-good-developer-experience&quot;&gt;5. Provide a good developer experience &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/#5.-provide-a-good-developer-experience&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Providing a good developer experience is very important to us. Developers should be able to start using our tools in minutes, not hours, days or weeks.&lt;/p&gt;
&lt;h2 id=&quot;6.-automate-everything-you-can&quot;&gt;6. Automate everything you can &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2021/design-principles-of-nord-design-system/#6.-automate-everything-you-can&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We value the time of our colleagues, users, and our future selves over our own. We are always proactively looking for ways to automate repetitive tasks and testing.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>A Missed Opportunity</title>
      <link href="https://arielsalminen.com/2020/a-missed-opportunity/"/>
      <updated>2020-12-09T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/a-missed-opportunity/</id>
      <content type="html">&lt;p&gt;Why does it feel like the devices we use are getting slower over time? A smartphone I bought a few years ago seems to be losing its edge when browsing websites. My computer struggles to play audio. Even my car’s interface can’t keep up anymore after all the updates. Am I just imagining or were they always like this?&lt;/p&gt;
&lt;p&gt;No, these devices aren’t actually getting slower, it’s the software that is &lt;a href=&quot;https://en.wikipedia.org/wiki/Andy_and_Bill%27s_law&quot;&gt;getting more bloated&lt;/a&gt;. Whenever new hardware is released out in the wild, it takes only a few months until it becomes the benchmark for software developers. Because hell, why not. We have all these resources to utilize, why wouldn’t we. Why give a fuck about the needs of users.&lt;/p&gt;
&lt;p&gt;If you’ve observed this too, it’s not just your imagination. Software is becoming increasingly complex and requires more resources than ever before. As CPU power increases, software is expanded to consume that extra performance. We live in the era of disposability.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fabiensanglard.net/silicone/&quot;&gt;Fabien Sanglard&lt;/a&gt; recently wrote a fantastic &lt;a href=&quot;https://fabiensanglard.net/silicone/&quot;&gt;article on this subject&lt;/a&gt; which triggered me to share his thoughts here. Fabien writes:&lt;/p&gt;
&lt;blockquote&gt;“For a few months, those who will buy M1 machines will enjoy great responsiveness and blazing start-up time. Some once bloated applications will again behave like most tools should. But soon these metrics will start to degrade. Responsiveness and start-up time will progressively revert to what they used to be and old ‘non-M1’ machines will become even slower than they used to.”&lt;/blockquote&gt;
&lt;p&gt;Fabien &lt;a href=&quot;https://fabiensanglard.net/silicone/&quot;&gt;then continues&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;“Doing the same thing should never become slower. Starting up an application should never take longer than it used to. If a feature is going to cost start-up time, I would rather not have it. Is it that we don&#39;t care about start-up time? Or is it that we don&#39;t have the choice?”&lt;/blockquote&gt;
&lt;p&gt;And I think there’s wisdom in Fabien’s words. As an industry, we aren’t paying attention. We don’t care, or we don’t have the choice. Either way, we forget the user, the performance, and that there’s more hardware than ours, and that not every­one on this planet has the latest and greatest devices or the connection speeds that we, ourself, might have. &lt;a href=&quot;https://arielsalminen.com/2015/the-many-faces-of-the-web/&quot;&gt;I wrote about this in 2015&lt;/a&gt;, but the situation is now even worse.&lt;/p&gt;
&lt;p&gt;Fabien also shares &lt;a href=&quot;https://blog.chromium.org/2008/10/io-in-google-chrome.html&quot;&gt;ideas from Brett Wilson&lt;/a&gt;, a Software Engineer in the Chrome team. The principle their team follows is:&lt;/p&gt;
&lt;blockquote&gt;“We carefully monitor startup performance using an automated test that runs for almost every change to the code. This test was created very early in the project, when Google Chrome did almost nothing, and we have always followed a very simple rule: this test can never get any slower. Because it’s much easier to address performance problems as they are created than fixing them later, we are quick to fix or revert any regressions. As a result, our very large application starts as fast today as the very lightweight application we started out with.”&lt;/blockquote&gt;
&lt;p&gt;And I think more teams should do this. Don’t just trust your gut feeling. Maybe there isn’t much a single person can do on a large scale, but by putting my thoughts onto this post I am at least sharing this forward and making sure we’re implementing this practise with all my clients.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>CodePen as a Component Editor</title>
      <link href="https://arielsalminen.com/2020/codepen-as-a-component-editor/"/>
      <updated>2020-12-01T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/codepen-as-a-component-editor/</id>
      <content type="html">&lt;p&gt;When we started working on &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt; early last year, one of our goals was to create similar component playgrounds as I had previously built for &lt;a href=&quot;https://vueds.com/&quot; aria-label=&quot;Vue Design System Documentation&quot;&gt;Vue Design System&lt;/a&gt;. While this seemed like an obvious decision at first, we soon realized that maintaining a code editor of our own required far too much effort, especially since Duet’s documentation is a custom built platform created for a specific organization’s needs.&lt;/p&gt;
&lt;p&gt;We figured there must be a simpler approach. Maybe all of it didn’t have to be a part of the &lt;a href=&quot;https://www.duetds.com/&quot;&gt;documentation&lt;/a&gt; itself. The most important goal was to have a code playground which would enable quick prototyping and testing.&lt;/p&gt;
&lt;p&gt;This got us thinking. We were already using &lt;a href=&quot;https://codepen.io/&quot;&gt;CodePen&lt;/a&gt; when we needed to quickly prototype or design something in the browser. Could we utilize the same tool for the public website as well to make the component documentation more interactive?&lt;/p&gt;
&lt;h2 id=&quot;introducing-codepen-api&quot;&gt;Introducing CodePen API &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/codepen-as-a-component-editor/#introducing-codepen-api&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turns out &lt;a href=&quot;https://blog.codepen.io/documentation/prefill/&quot;&gt;CodePen has a nice API&lt;/a&gt; for this which allows you to start a new Pen with code and settings that you send across programmatically. To pre-fill a Pen with your own code and options, you post a form with &lt;code&gt;data&lt;/code&gt; in JSON format to &lt;a href=&quot;https://codepen.io/pen/define/&quot;&gt;https://codepen.io/pen/define&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A simple example looks like this, try it out by clicking the “Edit on CodePen” button:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://codepen.io/pen/define&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;{&quot;title&quot;: &quot;Button&quot;, &quot;html&quot;: &quot;&amp;lt;button&gt;Click me&amp;lt;/button&gt;&quot;}&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;submit&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Edit on CodePen&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;form action=&quot;https://codepen.io/pen/define&quot; method=&quot;POST&quot; target=&quot;_blank&quot;&gt;
  &lt;input type=&quot;hidden&quot; name=&quot;data&quot; value=&#39;{&quot;title&quot;: &quot;Button&quot;, &quot;html&quot;: &quot;&lt;button&gt;Click me&lt;/button&gt;&quot;}&#39; /&gt;
  &lt;input type=&quot;submit&quot; class=&quot;btn btn-edit&quot; value=&quot;Edit on CodePen&quot; /&gt;
&lt;/form&gt;
&lt;p&gt;If you observe the example above, you might notice that I have added a hidden input inside the form. This input has the &lt;code&gt;data&lt;/code&gt; I want to be editable set as its value:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;{
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;title&quot;: &quot;Button&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;html&quot;: &quot;&amp;lt;button&gt;Click me&amp;lt;/button&gt;&quot;&lt;/span&gt;
  }&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, in reality, we usually want a little more than this. CodePen’s API provides a &lt;a href=&quot;https://blog.codepen.io/documentation/prefill/#all-the-json-options-0&quot;&gt;set of options&lt;/a&gt; you can include in the JSON. In &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;, we are utilizing the following options:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;{
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;title&quot;: &quot;Generated title&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;html&quot;: &quot;&amp;lt;button&gt;Code that you want to be editable&amp;lt;/button&gt;&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;css_external&quot;: &quot;url-to-stylesheet.css;url-to-stylesheet.css&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;js_external&quot;: &quot;url-to-web-components.js&quot;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;layout&quot;: &quot;left&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &quot;editors&quot;: &quot;100&quot;&lt;/span&gt;
  }&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With &lt;code&gt;css_external&lt;/code&gt; option we are first of all linking to the necessary stylesheets on &lt;a href=&quot;https://www.duetds.com/cdn/&quot;&gt;Duet’s content delivery network&lt;/a&gt;. &lt;code&gt;js_external&lt;/code&gt; option does the same, but for JavaScript. &lt;code&gt;layout&lt;/code&gt; and &lt;code&gt;editors&lt;/code&gt; define what the CodePen editor itself will look like. With the above settings the code editor will live on the left side and only HTML editor will be open by default.&lt;/p&gt;
&lt;p&gt;In case you’re using a static website generator like i.e. &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; or &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt; to document your design system, you could programmatically generate all of the contents for this form.&lt;/p&gt;
&lt;p&gt;In Duet the automation works roughly so that we first generate &lt;a href=&quot;https://www.markdownguide.org/&quot;&gt;Markdown&lt;/a&gt; files based on &lt;a href=&quot;https://jsdoc.app/&quot;&gt;JS Doc&lt;/a&gt; style comments in the components. These Markdown files are then transformed using Eleventy and its templating features into user editable static webpages, by looping through all the components and adding the necessary bits programmatically:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;{%- for example in examples -%}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://codepen.io/pen/define&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;{
&lt;span class=&quot;highlight-line&quot;&gt;        &quot;title&quot;: &quot;Duet — {{ example.name | capitalize }}&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &quot;html&quot;: &quot;{{ example.code | safe }}&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &quot;css_external&quot;: &quot;{% duet_css_assets %}&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &quot;js_external&quot;: &quot;{% duet_component_assets %}&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &quot;layout&quot;: &quot;left&quot;,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &quot;editors&quot;: &quot;100&quot;&lt;/span&gt;
      }&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;submit&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Edit in CodePen&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{%- endfor -%}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;escaping-quotes-and-new-lines&quot;&gt;Escaping quotes and new lines &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/codepen-as-a-component-editor/#escaping-quotes-and-new-lines&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you try to utilize the above example on your own website, you might quickly notice that it produces invalid JSON when you have e.g. &lt;code&gt;&amp;quot;&lt;/code&gt;, &lt;code&gt;&#39;&lt;/code&gt;, or new lines in the HTML inside the JSON object. To escape all quotes in JSON, you could use something like:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; processedHtml &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;originalHtml&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;​quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;apos;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In case you’re using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;  with &lt;a href=&quot;https://mozilla.github.io/nunjucks/&quot;&gt;Nunjucks&lt;/a&gt; &lt;em&gt;(like we are),&lt;/em&gt; you could instead use something like this which replaces all quotes and makes sure new lines won’t break JSON:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;value&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&#39;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token string-property property&quot;&gt;&quot;html&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ your_html | safe | replace(&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;, &#39;&lt;/span&gt;&#92;&#92;&lt;span class=&quot;token string&quot;&gt;&quot;&#39;) | replace(&#39;&#92;&#39;&#39;, &#39;&amp;amp;#39;&#39;) | replace(&#39;&#92;n&#39;, &#39;&#92;&#92;n&#39;) }}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&#39;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CodePen’s &lt;a href=&quot;https://blog.codepen.io/documentation/prefill/&quot;&gt;own documentation&lt;/a&gt; also includes clear guidelines on how to achieve this with the help of jQuery on the client side.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/codepen-as-a-component-editor/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our industry has a tendency to over-engineer things &lt;em&gt;(yes, I am guilty too)&lt;/em&gt;, so I’m happy that we found a solution that has vastly simplified things. What’s lovely as well, is that this feature has got some of our &lt;a href=&quot;https://arielsalminen.com/2017/on-design-tools-and-processes/&quot;&gt;designers to start utilizing CodePen&lt;/a&gt; as their tool of choice for prototyping.&lt;/p&gt;
&lt;p&gt;Today, Duet Design System has this functionality implemented for &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;all of its component&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/templates/&quot;&gt;template examples&lt;/a&gt;. Take a look of the &lt;a href=&quot;https://www.duetds.com/components/button/&quot;&gt;Button component&lt;/a&gt; for example  and hit the “Edit on CodePen” button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; If you have a small team and you’re looking for a simple way to have editable component examples in your design system documentation, &lt;a href=&quot;https://blog.codepen.io/documentation/prefill/&quot;&gt;CodePen’s API&lt;/a&gt; might be an option worth considering.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System September 2020 Update</title>
      <link href="https://arielsalminen.com/2020/duet-design-system-september-2020-update/"/>
      <updated>2020-09-22T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/duet-design-system-september-2020-update/</id>
      <content type="html">&lt;p&gt;You’re reading the ninth Duet monthly update. During the past month we’ve been busy improving the existing features, fixing bugs, and open sourcing &lt;a href=&quot;https://github.com/duetds/date-picker&quot;&gt;Duet Date Picker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As our team working on Duet Design System couldn’t find an existing date picker that would’ve ticked all the requirements we had for accessibility and performance, we decided to build one and &lt;a href=&quot;https://github.com/duetds/date-picker&quot;&gt;open source&lt;/a&gt; it so that others could benefit from this work as well.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/duetds/date-picker&quot;&gt;Duet Date Picker&lt;/a&gt; is an open source version of Duet Design System’s WCAG 2.1 compliant date picker. Duet Date Picker can be implemented and used across any JavaScript framework or no framework at all. We accomplish this by using standardized web platform APIs and Web Components.&lt;/p&gt;
&lt;h3 id=&quot;features&quot;&gt;Features &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#features&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Can be used with any JavaScript framework.&lt;/li&gt;
&lt;li&gt;No external dependencies.&lt;/li&gt;
&lt;li&gt;Themable with CSS variables.&lt;/li&gt;
&lt;li&gt;Weighs only 10kb minified and Gzip’ed (this includes all styles and icons).&lt;/li&gt;
&lt;li&gt;Built with accessibility in mind to support WCAG 2.1.&lt;/li&gt;
&lt;li&gt;Supports all modern browsers and screen readers.&lt;/li&gt;
&lt;li&gt;Support for localization.&lt;/li&gt;
&lt;li&gt;Customizable date parsing and formatting.&lt;/li&gt;
&lt;li&gt;Comes with modified interface for mobile devices to provide better user experience.&lt;/li&gt;
&lt;li&gt;Supports touch gestures for changing months and closing the picker.&lt;/li&gt;
&lt;li&gt;Free to use under the MIT license.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;discussion-on-twitter&quot;&gt;Discussion on Twitter &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#discussion-on-twitter&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Today we open sourced Duet date picker:&lt;br /&gt;&lt;br /&gt;✨ Built for the modern web&lt;br /&gt;⌨️ Keyboard and screen reader accessible&lt;br /&gt;🗺️ Supports localisation&lt;br /&gt;🎨 Themable with CSS variables&lt;br /&gt;📱 Mobile friendly&lt;br /&gt;⚡ Only 10kb gzipped (including all styles and icons!)&lt;a href=&quot;https://t.co/B38UMdCFVT&quot;&gt;https://t.co/B38UMdCFVT&lt;/a&gt; &lt;a href=&quot;https://t.co/43UTfpT02H&quot;&gt;pic.twitter.com/43UTfpT02H&lt;/a&gt;&lt;/p&gt;&amp;mdash; Nick Williams (@WickyNilliams) &lt;a href=&quot;https://twitter.com/WickyNilliams/status/1306637276026462208?ref_src=twsrc%5Etfw&quot;&gt;September 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Duet Date Picker, an accessible, WCAG 2.1 compliant date picker that can be implemented and used across any JavaScript framework or no framework at all. via &lt;a href=&quot;https://twitter.com/viljamis?ref_src=twsrc%5Etfw&quot;&gt;@arielsalminen&lt;/a&gt; &lt;a href=&quot;https://t.co/Frl8VdjzQh&quot;&gt;https://t.co/Frl8VdjzQh&lt;/a&gt; &lt;a href=&quot;https://t.co/3ZcHFLRb4Z&quot;&gt;pic.twitter.com/3ZcHFLRb4Z&lt;/a&gt;&lt;/p&gt;&amp;mdash; Smashing Magazine (@smashingmag) &lt;a href=&quot;https://twitter.com/smashingmag/status/1306891966039220224?ref_src=twsrc%5Etfw&quot;&gt;September 18, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Our team working on Duet Design System couldn’t find an existing date picker that would’ve ticked all the requirements we had for bundle size and accessibility (WCAG 2.1), so we decided to build one and open source it: &lt;a href=&quot;https://t.co/As1KL1NWFM&quot;&gt;https://t.co/As1KL1NWFM&lt;/a&gt; &lt;a href=&quot;https://t.co/HXuBPQNBaQ&quot;&gt;pic.twitter.com/HXuBPQNBaQ&lt;/a&gt;&lt;/p&gt;&amp;mdash;  (@arielsalminen) &lt;a href=&quot;https://twitter.com/viljamis/status/1306500643264385025?ref_src=twsrc%5Etfw&quot;&gt;September 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;duet-date-picker&quot;&gt;Duet Date Picker &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#duet-date-picker&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As our team couldn’t find an existing date picker that would’ve ticked all the requirements we had for accessibility, we decided to build one and &lt;a href=&quot;https://github.com/duetds/date-picker&quot;&gt;open source&lt;/a&gt; it so that others could benefit from this work as well.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/date-picker.png&quot; alt=&quot;Duet Date Picker&quot; /&gt;
&lt;h3 id=&quot;usage-documentation&quot;&gt;Usage documentation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#usage-documentation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve added new usage docs for each component that explain how and when the component should be used. There’re also better accessibility docs and further considerations to take into account on each component page.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/usage.png&quot; alt=&quot;Usage documentation&quot; /&gt;
&lt;h3 id=&quot;ios-and-android-support&quot;&gt;iOS and Android support &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#ios-and-android-support&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve added a new template demonstrating how to build a native view for iOS that utilizes Components, Design Tokens and CSS Framework. Similar techniques inside a native wrapper app could be used for Android as well.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/native.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;iOS and Android support&quot; /&gt;
&lt;h3 id=&quot;angular-and-react-examples&quot;&gt;Angular and React examples &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#angular-and-react-examples&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In addition to improved Angular and React support, we’ve also created example projects that you can utilize. Both our &lt;a href=&quot;https://github.com/duetds&quot;&gt;GitHub account&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/cli/&quot;&gt;CLI Tool&lt;/a&gt; now come with Angular and React specific templates that you can utilize.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/angular-react.png&quot; alt=&quot;Angular and React examples&quot; /&gt;
&lt;h3 id=&quot;duet-markdown-renderer&quot;&gt;Duet Markdown renderer &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-september-2020-update/#duet-markdown-renderer&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet now offers a custom renderer for the most popular JavaScript Markdown library &lt;a href=&quot;https://marked.js.org/&quot;&gt;marked.js&lt;/a&gt;, so that it outputs Duet components like &lt;code&gt;&amp;lt;duet-paragraph&amp;gt;&lt;/code&gt; rather than standard HTML tags like &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/markdown.png&quot; alt=&quot;Duet Markdown renderer&quot; /&gt;
&lt;p&gt;Until October!&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;</content>
    </entry>
    
    <entry>
      <title>Building Layouts with Duet Design System</title>
      <link href="https://arielsalminen.com/2020/building-layouts-with-duet-design-system/"/>
      <updated>2020-06-18T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/building-layouts-with-duet-design-system/</id>
      <content type="html">&lt;p&gt;Following this tutorial you will learn how to build simple page layouts using Duet’s Design Tokens, CSS Framework, Web Components and other features.&lt;/p&gt;
&lt;p&gt;For the sake of simplicity, this tutorial is framework agnostic and imports the different parts of Duet directly from &lt;a href=&quot;https://www.jsdelivr.com/&quot;&gt;JSDelivr&lt;/a&gt;. For production usage we recommend that you install the &lt;a href=&quot;https://www.duetds.com/developers/&quot;&gt;packages&lt;/a&gt; using NPM and host the different parts yourself.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting started &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/building-layouts-with-duet-design-system/#getting-started&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As the first step, you will want to create a basic HTML page that can be used for building the layout. There are no explicit requirements on what the HTML markup should look like, so let’s just go ahead and create a simple page with the correct &lt;code&gt;lang&lt;/code&gt; attribute and a placeholder &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width,initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Ota yhteyttä | LähiTapiola&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, you need to import the necessary packages from Duet Design System in order to utilize them. For this particular layout, we want to use &lt;a href=&quot;https://www.duetds.com/typography/&quot;&gt;Fonts&lt;/a&gt;, &lt;a href=&quot;https://www.duetds.com/css-framework/&quot;&gt;CSS Framework&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;Web Components&lt;/a&gt;. To import these packages, add the following tags onto your page’s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Fonts --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/fonts/3.0.51/lib/localtapiola.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-5JYmtSD7nykpUvSmTW1CHMoBDkBZUpUmG0vuh+NUVtZag3F75Kr7+/JU3J7JV6Wq&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- CSS Framework --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/css/4.0.54/lib/duet.min.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-UoMJnpXiN8f7fKVnTzfKfyi7LzQlApQ+WTS9O3PXlYr6CO9yzou4glfsHV747f3v&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Components --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/components/9.1.0/lib/duet/duet.esm.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-bF+OBRaBhnoFC6ZeoybdILqDBpmydfNBcN5yNX8fh04nmMVxk4W8M0eYjA/PvFWq&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;nomodule&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/components/9.1.0/lib/duet/duet.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-n4xTNHGQg3FSzz+2wZW8XgoYYKDMF0D2oxxD7i4rfuxMF1qPvaBbl1fyyYtEKygw&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you’ve added each package shown above, the markup for the HTML page should look about like this:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width,initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Ota yhteyttä | LähiTapiola&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/fonts/3.0.51/lib/localtapiola.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-5JYmtSD7nykpUvSmTW1CHMoBDkBZUpUmG0vuh+NUVtZag3F75Kr7+/JU3J7JV6Wq&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/css/4.0.54/lib/duet.min.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-UoMJnpXiN8f7fKVnTzfKfyi7LzQlApQ+WTS9O3PXlYr6CO9yzou4glfsHV747f3v&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/components/9.1.0/lib/duet/duet.esm.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-bF+OBRaBhnoFC6ZeoybdILqDBpmydfNBcN5yNX8fh04nmMVxk4W8M0eYjA/PvFWq&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;nomodule&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/components/9.1.0/lib/duet/duet.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-n4xTNHGQg3FSzz+2wZW8XgoYYKDMF0D2oxxD7i4rfuxMF1qPvaBbl1fyyYtEKygw&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s all that’s required to start building completele layouts with Duet. In the next chapter we’ll cover the basics of Duet’s layout components and how to create the foundations for the rest of the content.&lt;/p&gt;
&lt;h2 id=&quot;laying-foundations&quot;&gt;Laying foundations &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/building-layouts-with-duet-design-system/#laying-foundations&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Duet Design System contains certain components that should be used on most page layouts. One of those components is called &lt;a href=&quot;https://www.duetds.com/components/layout/&quot;&gt;Layout&lt;/a&gt;. Layout component, while not visible in the user interface itself, provides a structure for other components using a one or two column layout system.&lt;/p&gt;
&lt;p&gt;To get started using Layout, add it inside your page’s &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;duet-layout&amp;gt;&lt;/code&gt; has three content areas which are called &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt; and &lt;code&gt;sidebar&lt;/code&gt;. To place content inside the &lt;code&gt;main&lt;/code&gt; content area you need to first create a new element and tell it which area you want to render it in:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content…&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above example renders “Some content…” text inside the Layout component’s &lt;code&gt;main&lt;/code&gt; content area. In &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;Web Component&lt;/a&gt; terms content areas are called “slots” which is where the attribute name also comes from.&lt;/p&gt;
&lt;p&gt;Most of the time we also want our page to contain &lt;a href=&quot;https://www.duetds.com/components/header/&quot;&gt;a header&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/components/footer/&quot;&gt;a footer&lt;/a&gt;. You can add them, together with a few additional menu links like so:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-sticky-footer&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content…&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-footer&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;menu&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;      { &quot;label&quot;: &quot;Turvallisuus ja käyttöehdot&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      { &quot;label&quot;: &quot;Evästeet&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      { &quot;label&quot;: &quot;Henkilötietojen käsittely&quot;, &quot;href&quot;: &quot;#&quot; }&lt;/span&gt;
    ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice how we’ve also added &lt;code&gt;.duet-sticky-footer&lt;/code&gt; class to &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element. This makes sure our &lt;a href=&quot;https://www.duetds.com/components/footer/&quot;&gt;Footer&lt;/a&gt; always stays sticky at the bottom of the page, no matter how little content there might be before it.&lt;/p&gt;
&lt;p&gt;At this point our page looks like this:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/layouts/1.png&quot; width=&quot;2974&quot; height=&quot;2222&quot; alt=&quot;Creating page layouts with Duet&quot; /&gt;
&lt;p&gt;To make it a little nicer, let’s split the main content into two columns, add a background gradient from Duet’s CSS Framework, and use &lt;a href=&quot;https://www.duetds.com/components/card/&quot;&gt;Card component&lt;/a&gt; to wrap our content:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-sticky-footer duet-bg-gradient&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-paragraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Main content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-paragraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sidebar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sidebar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Sidebar content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-footer&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;menu&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;      { &quot;label&quot;: &quot;Turvallisuus ja käyttöehdot&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      { &quot;label&quot;: &quot;Evästeet&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      { &quot;label&quot;: &quot;Henkilötietojen käsittely&quot;, &quot;href&quot;: &quot;#&quot; }&lt;/span&gt;
    ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With the above markup we’ve now created a basic page layout to build upon:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/layouts/2.png&quot; width=&quot;2974&quot; height=&quot;2222&quot; alt=&quot;Creating page layouts with Duet&quot; /&gt;
&lt;h2 id=&quot;working-with-components&quot;&gt;Working with components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/building-layouts-with-duet-design-system/#working-with-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The underlying idea with &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Duet’s Components&lt;/a&gt; is that a developer can simply lay them on a page and the components themselves will take care of the surrounding space. This means that most of the time there shoudn’t be a need to use custom, application specific margins or paddings, for anything that’s coming from Duet.&lt;/p&gt;
&lt;p&gt;In cases when you do need to adjust the spacing or margins, you can use Duet’s &lt;a href=&quot;https://www.duetds.com/components/spacer/&quot;&gt;Spacer component&lt;/a&gt; and the provided &lt;a href=&quot;https://www.duetds.com/tokens/#space&quot;&gt;Space Design Tokens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As the next step, let’s create a simple contact form on the page we just did. This will help you understand how Duet’s components automatically handle the spacing in-between components and how the &lt;a href=&quot;https://www.duetds.com/components/spacer/&quot;&gt;Spacer&lt;/a&gt; component can be used.&lt;/p&gt;
&lt;p&gt;Modify your previous markup to include a form in the &lt;a href=&quot;https://www.duetds.com/components/layout/&quot;&gt;Layout&lt;/a&gt; component’s main content area:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;novalidate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, let’s add in some form elements, including &lt;a href=&quot;https://www.duetds.com/components/input/&quot;&gt;two inputs&lt;/a&gt;, &lt;a href=&quot;https://www.duetds.com/components/textarea/&quot;&gt;a textarea&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/components/button/&quot;&gt;a submit button&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;novalidate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Nimi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Matti Meikäläinen&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sähköposti&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nimi@email.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-textarea&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Viesti asiakaspalveluun&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Kirjoita tähän&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-textarea&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;submit&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;variation&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Lähetä&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, we’ll also add a little bit of text content and adjust the spacing slightly by adding two &lt;code&gt;&amp;lt;duet-spacer/&amp;gt;&lt;/code&gt; components after the first paragraph and just before the submit button:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;novalidate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-heading&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Ota yhteyttä&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-heading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-paragraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          Lähetä meille viesti kun haluat antaa palautetta tai pyytää&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          yhteydenottoa. Jos olet jo asiakkaamme, asiasi hoituu parhaiten,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          kun kirjaudut verkkopalveluun.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-paragraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-spacer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-spacer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Nimi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Matti Meikäläinen&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sähköposti&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nimi@email.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-textarea&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Viesti asiakaspalveluun&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Kirjoita tähän&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-textarea&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-spacer&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;x-large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-spacer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;submit&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;variation&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Lähetä&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sidebar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sivupalsta&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      Sivupalstaa voidaan käyttää pääsisältöön liittyvän tiedon näyttämiseen&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      tai vaihtoehtoisesti nostamaan esiin aiheeseen liittyvää muuta sisältöä.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above markup produces now the following results:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/layouts/3.png&quot; width=&quot;2974&quot; height=&quot;2764&quot; alt=&quot;Creating page layouts with Duet&quot; /&gt;
&lt;p&gt;As you can see the above webpage looks already pretty balanced without the need to add any custom CSS styles or elements onto the page.&lt;/p&gt;
&lt;p&gt;Next, we could add a little more content to our Footer component. To achieve this, we can pass an array of items through a property called &lt;code&gt;items&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-footer&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Hae korvausta&quot;, &quot;href&quot;: &quot;#&quot;, &quot;icon&quot;: &quot;navigation-make-claim&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Osta vakuutus&quot;, &quot;href&quot;: &quot;#&quot;, &quot;icon&quot;: &quot;action-buy-insurance&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Yhteystiedot&quot;, &quot;href&quot;: &quot;#&quot;, &quot;icon&quot;: &quot;form-tel&quot; }&lt;/span&gt;
  ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;menu&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Turvallisuus ja käyttöehdot&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Evästeet&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Henkilötietojen käsittely&quot;, &quot;href&quot;: &quot;#&quot; }&lt;/span&gt;
  ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above markup produces an additional menu for the footer:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/layouts/4.png&quot; width=&quot;2974&quot; height=&quot;2828&quot; alt=&quot;Creating page layouts with Duet&quot; /&gt;
&lt;p&gt;To make our page layout ready, let’s add the rest of the header functionality:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-header&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token attr-name&quot;&gt;current-href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/yhteystiedot/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token attr-name&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;{ &quot;label&quot;: &quot;Kirjaudu sisään&quot;, &quot;href&quot;: &quot;/?login&quot;, &quot;type&quot;: &quot;login&quot; }&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Etusivu&quot;,&quot;href&quot;: &quot;/&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Vakuutukset&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Vahinkoasiat&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Säästöt ja sijoitukset&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Laskut&quot;, &quot;href&quot;: &quot;#&quot;, &quot;badge&quot;: &quot;true&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    { &quot;label&quot;: &quot;Viestit&quot;, &quot;href&quot;: &quot;#&quot; }&lt;/span&gt;
  ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ..&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With these final changes, we’ve finished our first page layout.&lt;/p&gt;
&lt;h3 id=&quot;ready-page-layout%3A&quot;&gt;Ready page layout: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/building-layouts-with-duet-design-system/#ready-page-layout%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/layouts/5.png&quot; width=&quot;2974&quot; height=&quot;2924&quot; alt=&quot;Creating page layouts with Duet&quot; /&gt;
&lt;h3 id=&quot;ready-page-markup%3A&quot;&gt;Ready page markup: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/building-layouts-with-duet-design-system/#ready-page-markup%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-sticky-footer duet-bg-gradient&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width,initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Ota yhteyttä | LähiTapiola&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/fonts/3.0.51/lib/localtapiola.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-5JYmtSD7nykpUvSmTW1CHMoBDkBZUpUmG0vuh+NUVtZag3F75Kr7+/JU3J7JV6Wq&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/css/4.0.54/lib/duet.min.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-UoMJnpXiN8f7fKVnTzfKfyi7LzQlApQ+WTS9O3PXlYr6CO9yzou4glfsHV747f3v&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/components/9.1.0/lib/duet/duet.esm.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-bF+OBRaBhnoFC6ZeoybdILqDBpmydfNBcN5yNX8fh04nmMVxk4W8M0eYjA/PvFWq&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;nomodule&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.duetds.com/api/components/9.1.0/lib/duet/duet.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;integrity&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sha384-n4xTNHGQg3FSzz+2wZW8XgoYYKDMF0D2oxxD7i4rfuxMF1qPvaBbl1fyyYtEKygw&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;anonymous&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-header&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token attr-name&quot;&gt;current-href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/yhteystiedot/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token attr-name&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;{ &quot;label&quot;: &quot;Kirjaudu sisään&quot;, &quot;href&quot;: &quot;/?login&quot;, &quot;type&quot;: &quot;login&quot; }&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Etusivu&quot;,&quot;href&quot;: &quot;/&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Vakuutukset&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Vahinkoasiat&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Säästöt ja sijoitukset&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Laskut&quot;, &quot;href&quot;: &quot;#&quot;, &quot;badge&quot;: &quot;true&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Viestit&quot;, &quot;href&quot;: &quot;#&quot; }&lt;/span&gt;
      ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;novalidate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-heading&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Ota yhteyttä&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-heading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-paragraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;              Lähetä meille viesti kun haluat antaa palautetta tai pyytää&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;              yhteydenottoa. Jos olet jo asiakkaamme, asiasi hoituu parhaiten,&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;              kun kirjaudut verkkopalveluun.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-paragraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-spacer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-spacer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Nimi&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Matti Meikäläinen&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sähköposti&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nimi@email.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-textarea&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Viesti asiakaspalveluun&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Kirjoita tähän&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-textarea&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-spacer&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;x-large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-spacer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;submit&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;variation&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Lähetä&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sidebar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-card&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sivupalsta&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          Sivupalstaa voidaan käyttää pääsisältöön liittyvän tiedon näyttämiseen&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          tai vaihtoehtoisesti nostamaan esiin aiheeseen liittyvää muuta sisältöä.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-card&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;duet-footer&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Hae korvausta&quot;, &quot;href&quot;: &quot;#&quot;, &quot;icon&quot;: &quot;navigation-make-claim&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Osta vakuutus&quot;, &quot;href&quot;: &quot;#&quot;, &quot;icon&quot;: &quot;action-buy-insurance&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Yhteystiedot&quot;, &quot;href&quot;: &quot;#&quot;, &quot;icon&quot;: &quot;form-tel&quot; }&lt;/span&gt;
      ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;menu&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;[
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Turvallisuus ja käyttöehdot&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Evästeet&quot;, &quot;href&quot;: &quot;#&quot; },&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        { &quot;label&quot;: &quot;Henkilötietojen käsittely&quot;, &quot;href&quot;: &quot;#&quot; }&lt;/span&gt;
      ]&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;duet-footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System June 2020 Update</title>
      <link href="https://arielsalminen.com/2020/duet-design-system-june-2020-update/"/>
      <updated>2020-06-15T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/duet-design-system-june-2020-update/</id>
      <content type="html">&lt;p&gt;You’re reading the eighth Duet monthly update. Last month we asked from our users how we’re doing and what we could improve. We’ll share some of the results in this post.&lt;/p&gt;
&lt;p&gt;In the beginning of May we sent out a user research survey to 106 Duet users. Roughly 55% of the people we reached out to answered our survey, which we consider a pretty solid number. We used Duet’s existing &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Web Components&lt;/a&gt; to build the survey and made the form save results onto a sheet file on submit.&lt;/p&gt;
&lt;p&gt;100% of the people who answered told us that Duet has improved their work efficiency compared to the past. We’re thrilled about this, since it’s been our &lt;a href=&quot;https://www.duetds.com/about/#our-goals&quot;&gt;number one goal&lt;/a&gt; since day one. Secondly, 95.7% said that Duet has improved the accessibility of their product. Finally, 76.1% said that they use Duet either every week or every day at work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Research data summarized:&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/research-duet.png&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;&lt;strong&gt;Combining the answers into an easy to digest charts:&lt;/strong&gt;&lt;/p&gt;
&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQTligaNhSeazk2L3ch1-7uHSpm8V8A5YIKAXRkkNEoE4S42jY5-jAhcnGirgImwUF5YGvOgHq818NJ/pubchart?oid=721647888&amp;amp;format=interactive&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQTligaNhSeazk2L3ch1-7uHSpm8V8A5YIKAXRkkNEoE4S42jY5-jAhcnGirgImwUF5YGvOgHq818NJ/pubchart?oid=638222012&amp;amp;format=interactive&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQTligaNhSeazk2L3ch1-7uHSpm8V8A5YIKAXRkkNEoE4S42jY5-jAhcnGirgImwUF5YGvOgHq818NJ/pubchart?oid=1157426667&amp;amp;format=interactive&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQTligaNhSeazk2L3ch1-7uHSpm8V8A5YIKAXRkkNEoE4S42jY5-jAhcnGirgImwUF5YGvOgHq818NJ/pubchart?oid=466567551&amp;amp;format=interactive&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQTligaNhSeazk2L3ch1-7uHSpm8V8A5YIKAXRkkNEoE4S42jY5-jAhcnGirgImwUF5YGvOgHq818NJ/pubchart?oid=260883663&amp;amp;format=interactive&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQTligaNhSeazk2L3ch1-7uHSpm8V8A5YIKAXRkkNEoE4S42jY5-jAhcnGirgImwUF5YGvOgHq818NJ/pubchart?oid=1702621287&amp;amp;format=interactive&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;Verbal feedback:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;“I think Duet is one of the best and most comprehensive (still not being bloated) design systems out there. Personally I&#39;m not a fan of using t-shirt sizes in spacing or font size scale, but I also see the reasons behind using those. Naming is always hard.”&lt;/blockquote&gt;
&lt;blockquote&gt;“The whole system really is wonderful and helpful, and am very happy with it. Since we have lot of projects and developers working, maybe the support system can be increased with a resource or so. Suppose if we have critical issues having dependency with duet fixes in multiple projects and a&amp;nbsp;release nearing, it becomes a bit difficult.”&lt;/blockquote&gt;
&lt;blockquote&gt;“Components should have more slotted contents rather than too many properties. This makes components more versatile and interfaces simpler.”&lt;/blockquote&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-june-2020-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;content-delivery-network&quot;&gt;Content Delivery Network &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-june-2020-update/#content-delivery-network&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet now has a production ready &lt;a href=&quot;https://www.duetds.com/cdn/&quot;&gt;Content Delivery Network&lt;/a&gt;. Some of the benefits of our CDN include: better performance for users, better scaling during heavy traffic, decrease of infrastructure costs due to offloading.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/network.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;cookie-consent-component&quot;&gt;Cookie Consent component &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-june-2020-update/#cookie-consent-component&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.duetds.com/components/cookie-consent/&quot;&gt;Cookie consent&lt;/a&gt; informs users about cookie usage. This banner can be shown to users when they visit a website or an application for the first time.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/cookie.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;tray-component&quot;&gt;Tray component &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-june-2020-update/#tray-component&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.duetds.com/components/tray/&quot;&gt;Tray component&lt;/a&gt; can be used to reveal additional information to an user on a small viewport, that would normally be shown in the sticky sidebar of the &lt;a href=&quot;https://www.duetds.com/components/layout/&quot;&gt;Layout component&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/tray.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;Until August!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System April 2020 Update</title>
      <link href="https://arielsalminen.com/2020/duet-design-system-april-2020-update/"/>
      <updated>2020-04-23T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/duet-design-system-april-2020-update/</id>
      <content type="html">&lt;p&gt;You’re reading the seventh Duet Design System monthly update. This time last year we published our first Web Components package, version &lt;code&gt;0.0.1-alpha.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As our &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Web Components&lt;/a&gt; turn one year old today, it’s a good time to reflect back and see what we’ve accomplished so far. The road here hasn’t always been straight nor without obstacles. When we started last year there were more open questions than answers. Our main technical concerns were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can we make Web Components accessible for everyone?&lt;/li&gt;
&lt;li&gt;How do we support basic form submissions?&lt;/li&gt;
&lt;li&gt;Can we make them work without JavaScript?&lt;/li&gt;
&lt;li&gt;Can we make them work with React.js?&lt;/li&gt;
&lt;li&gt;Can we support search engines?&lt;/li&gt;
&lt;li&gt;Is the technology ready for production?&lt;/li&gt;
&lt;li&gt;What about Internet Explorer 11?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Turns out each of the above challenges can be solved. While we aren’t able to explain each one in detail in this short update, it was &lt;a href=&quot;https://stenciljs.com/&quot;&gt;Stencil.js&lt;/a&gt; that helped us solve &lt;a href=&quot;https://www.duetds.com/server-side-rendering/&quot;&gt;Server Side Rendering&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/using-components/#usage-with-react&quot;&gt;React.js support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At the time of writing we now have 45 accessible Web Components that can be used in production applications. Last month we also published production ready &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;React components&lt;/a&gt;, and this week we’re coming out with updated &lt;a href=&quot;https://arielsalminen.com/using-components/&quot;&gt;Angular components&lt;/a&gt;, also ready for production usage.&lt;/p&gt;
&lt;p&gt;During the past month we’ve been also testing our code based components in a design tool called &lt;a href=&quot;https://www.framer.com/&quot;&gt;Framer X&lt;/a&gt;. Framer allows designers to use the same Web Components that developers use, drag and drop them onto the canvas, and adjust their properties through Framer’s layout panel.&lt;/p&gt;
&lt;p&gt;We’re excited about this direction, but it also requires us to do more validation with the different product teams to understand whether or not this is something we’re going to officially support. Big thanks to the Framer team, Dave and Iain, for helpful comments and allowing us to trial &lt;a href=&quot;https://www.framer.com/web/&quot;&gt;their Web Beta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, we published &lt;a href=&quot;https://www.duetds.com/changelog/#components&quot;&gt;Web Components v4.0&lt;/a&gt; with some major improvements this month. Our bundle size is 267Kb smaller now (non-gzipped) if counting all 45+ Web Components, and rendering also became 0.5× faster compared to previous generations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here are quick statistics of the first year:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From zero to 23+ customer facing services utilizing Duet in one year.&lt;/li&gt;
&lt;li&gt;Developer productivity with &lt;a href=&quot;https://www.duetds.com/css-framework/&quot;&gt;CSS&lt;/a&gt; has improved 4.91×.&lt;/li&gt;
&lt;li&gt;450 000 page views from 70+ countries on &lt;a href=&quot;https://www.duetds.com/&quot;&gt;duetds.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;45 ready to use &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;React&lt;/a&gt;, and &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;Web Components&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;4 000+ component instances in use in different products.&lt;/li&gt;
&lt;li&gt;4 000+ feature updates and bug fixes to the design system.&lt;/li&gt;
&lt;li&gt;1 000+ design system &lt;a href=&quot;https://www.npmjs.com/org/duetds&quot;&gt;package versions&lt;/a&gt; published.&lt;/li&gt;
&lt;li&gt;600+ automated deploys of &lt;a href=&quot;https://www.duetds.com/&quot;&gt;documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;400+ pages of documentation written.&lt;/li&gt;
&lt;li&gt;500+ automated tests running.&lt;/li&gt;
&lt;li&gt;12 &lt;a href=&quot;https://www.npmjs.com/org/duetds&quot;&gt;Node.js packages&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-april-2020-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;angular-components&quot;&gt;Angular Components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-april-2020-update/#angular-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet’s Angular components are now out of experimental status and officially supported, meaning they can be used in production apps! This change simplifies work for teams working with &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Web Components&lt;/a&gt;, &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/templates/form-components/&quot;&gt;forms&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/angular.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;framer-x-beta&quot;&gt;Framer X Beta &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-april-2020-update/#framer-x-beta&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;During the past month we’ve been testing our code based components in a design tool called &lt;a href=&quot;https://www.framer.com/&quot;&gt;Framer X&lt;/a&gt;. Framer allows designers to use the same Web Components that developers use, drag and drop them onto the canvas, and adjust their properties through Framer’s layout panel.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/framer.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;web-components-reach-4.0&quot;&gt;Web Components reach 4.0 &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-april-2020-update/#web-components-reach-4.0&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet Web Components 4.0 is out with some major improvements. Our bundle size is 267Kb smaller (non-gzipped) if counting all 45+ components, and rendering also becomes 0.5× faster compared to previous generations.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/components.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;table-component&quot;&gt;Table component &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-april-2020-update/#table-component&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Newly introduced &lt;a href=&quot;https://arielsalminen.com/components/table/&quot;&gt;Table component&lt;/a&gt; is a lightweight and un-opinionated component for enhancing tabular data. In addition to data tables, it can also be used for &lt;a href=&quot;https://www.duetds.com/components/examples/comparison-table/&quot; data-turbolinks=&quot;false&quot;&gt;comparison tables&lt;/a&gt; in the context of products.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/table.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;Until June!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Using Duet Design System’s CLI Tools</title>
      <link href="https://arielsalminen.com/2020/using-duet-design-systems-cli-tools/"/>
      <updated>2020-03-23T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/using-duet-design-systems-cli-tools/</id>
      <content type="html">&lt;p&gt;Following this tutorial you will learn how to utilize Duet’s Command Line Interface to create simple websites that can be shared via GitHub Pages, Amazon S3, and Azure Storage.&lt;/p&gt;
&lt;p&gt;Before moving further, please make sure you have &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;Node.js&lt;/a&gt; 12.x or newer installed. You can install the latest version through their website.&lt;/p&gt;
&lt;p&gt;For guidance on deploying prototypes created with the Duet CLI to Github pages, please refer to &lt;a href=&quot;https://www.duetds.com/sharing-prototypes&quot;&gt;Sharing Prototypes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting started &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/using-duet-design-systems-cli-tools/#getting-started&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As the first step, you will want to install Duet’s Command Line Interface globally on your machine using Node Package Manager. To do so, run the following command in your terminal:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; @duetds/cli&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you’ve installed the CLI package, you can open up any directory in your terminal and run Duet’s “create” command. Create command allows you to quickly set up a development environment with everything you might need from Duet preconfigured:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;create-duet-app&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alternatively, you can run the CLI without having to install by using &lt;code&gt;npx&lt;/code&gt;, which is included with npm:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;npx @duetds/cli&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running either of the above commands will next ask you to choose the template that you want to use in your project:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;Please choose &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; Duet template to use &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Use arrow keys&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ❯ Eleventy&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    Eleventy-SSR&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    HTML&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    Angular&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    React&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Picking &lt;code&gt;Eleventy&lt;/code&gt; or &lt;code&gt;Eleventy-SSR&lt;/code&gt; generates a multi-page project with features like global navigation and footer (SSR in this context means “Server Side Rendered”).&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;HTML&lt;/code&gt; option generates a simple one page project that has fonts, components, and CSS Framework preloaded.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Angular&lt;/code&gt; option generates an angular project configured to use the &lt;code&gt;@duetds/angular&lt;/code&gt; package, fonts, CSS framework, and a basic router/multi-page setup.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;React&lt;/code&gt; option generates a react project derived from &lt;code&gt;create-react-app&lt;/code&gt;, which comes configured to use the &lt;code&gt;@duetds/react&lt;/code&gt; package, fonts, and CSS framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The full feature set for both &lt;code&gt;Eleventy&lt;/code&gt; templates include:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preconfigured &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; project starter with commands for developing, testing, and building the project.&lt;/li&gt;
&lt;li&gt;Everything you need to create a simple production ready static website: Header and Footer partials, global navigation, LocalTapiola favicons, Manifest files, Robots.txt, and HTML/CSS/JS minification.&lt;/li&gt;
&lt;li&gt;SSR (Server Side Rendering) for &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Duet Web Components&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&quot;https://www.duetds.com/tokens/&quot;&gt;Duet Design Tokens&lt;/a&gt; in SCSS without configuration.&lt;/li&gt;
&lt;li&gt;Additionally comes with &lt;a href=&quot;https://www.duetds.com/typography/&quot;&gt;Duet Fonts&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/css-framework/&quot;&gt;Duet CSS Framework&lt;/a&gt; preconfigured.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you’ve picked the template, you will be next asked to enter a name for the project. This is also the name of the directory that will be generated. By default, if you just hit enter, the project will be called “duet-prototype”:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;Enter a name &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; this project &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;duet-prototype&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, the last step asks whether you want to initialize a GIT repository or not. This defaults to “No”:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;Initialize a &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; repository? &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y/N&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After this Duet’s Command Line Interface will generate a project for you and show step by step what’s happening:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;Initialize a &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; repository? Yes&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ✔ Create project directory&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ✔ Copy project files&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ✔ Create build and deploy automation&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ✔ Configure .gitignore&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ✔ Initialize &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  ✔ Install dependencies&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once finished, run &lt;code&gt;cd [project-name]&lt;/code&gt; and refer to the &lt;code&gt;README.md&lt;/code&gt; file inside this directory for further template specific usage instructions.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System March 2020 Update</title>
      <link href="https://arielsalminen.com/2020/duet-design-system-march-2020-update/"/>
      <updated>2020-03-03T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/duet-design-system-march-2020-update/</id>
      <content type="html">&lt;p&gt;You’re reading the sixth Duet Design System monthly update. This time the update covers both February and March as it looks like we forgot to push an update out last month.&lt;/p&gt;
&lt;p&gt;At the time of writing, Duet is now being utilized in 23 different web applications at LocalTapiola and Turva. This number is almost twice as high now compared to last &lt;a href=&quot;https://www.duetds.com/updates/november-2019/&quot;&gt;November&lt;/a&gt;. As a result of this quick adoption rate, we’ve had to rethink some of the processes and introduce more transparency towards the product teams.&lt;/p&gt;
&lt;p&gt;An example of this is our new bi-weekly gathering for Frontend Developers. The aim is to walk through new and upcoming features of Duet Design System and also address any questions developers might have about them. Similarly, we’ve also had weekly gatherings for designers and third party design partners for quite some time now.&lt;/p&gt;
&lt;p&gt;During the last month the biggest change for Duet was the introduction of &lt;a href=&quot;https://www.duetds.com/cli/&quot;&gt;Command Line Interface&lt;/a&gt;. CLI helps developers and frontend oriented designers to quickly set up a development environment that has all our packages preconfigured. This makes prototyping and creating simple websites using Duet much quicker.&lt;/p&gt;
&lt;p&gt;We’ve been also setting up new prototyping environments and process automations into &lt;a href=&quot;https://github.com/duetds&quot;&gt;GitHub&lt;/a&gt;. These will soon be used together with the new CLI tools introduced.&lt;/p&gt;
&lt;p&gt;Finally, we’re right now in the progress of moving away from Sketch app towards using Duet’s code based components as a design tool instead. This is an exciting new direction we’ll be sharing more about in a few months.&lt;/p&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-march-2020-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;react-components-v3.0-released&quot;&gt;React components v3.0 released &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-march-2020-update/#react-components-v3.0-released&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet’s React library is now out of experimental status and officially supported by us. This means that it can be used in production apps and doesn’t anymore require complex configuration to make things work with e.g. &lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/react.png&quot; alt=&quot;&quot; /&gt;
&lt;h3 id=&quot;command-line-interface&quot;&gt;Command line interface &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-march-2020-update/#command-line-interface&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet now comes with a &lt;a href=&quot;https://www.duetds.com/cli/&quot;&gt;Command Line Interface&lt;/a&gt; (CLI) that helps you to quickly set up a development environment that has all our packages preconfigured. This makes prototyping and creating simple websites much quicker.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/cli.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;stepper-component&quot;&gt;Stepper component &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-march-2020-update/#stepper-component&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Newly introduced &lt;a href=&quot;https://www.duetds.com/components/stepper/&quot;&gt;Stepper component&lt;/a&gt; can be used to create wizard-like workflows by dividing content into logical steps. The user can then navigate backwards by clicking on the header of a completed step.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/stepper.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;updated-list-component&quot;&gt;Updated List component &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-march-2020-update/#updated-list-component&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.duetds.com/components/list/&quot;&gt;List component&lt;/a&gt; replaces Duet’s old &lt;a href=&quot;https://www.duetds.com/components/definition-list/&quot;&gt;Definition List&lt;/a&gt; that is now deprecated. This new component allows developers to put any type of content inside the slots of the List and also adds a long waited &lt;a href=&quot;https://www.duetds.com/server-side-rendering/&quot;&gt;server side rendering&lt;/a&gt; support.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/list.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h2 id=&quot;on-the-roadmap-next&quot;&gt;On the roadmap next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-march-2020-update/#on-the-roadmap-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Table component is under work right now and will be published soon.&lt;/li&gt;
&lt;li&gt;Prototyping environments and related automation is under work and ready for usage next week.&lt;/li&gt;
&lt;li&gt;Finally, we’re focusing onto making it possible to use Duet’s code based Web Components directly inside design tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until April!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System January 2020 Update</title>
      <link href="https://arielsalminen.com/2020/duet-design-system-january-2020-update/"/>
      <updated>2020-01-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/duet-design-system-january-2020-update/</id>
      <content type="html">&lt;p&gt;You’re reading the fifth Duet Design System monthly update. This update focuses on new feature and component improvements we’ve been working on.&lt;/p&gt;
&lt;p&gt;The past month has kept us rather busy. We’ve spent most of our time helping developers working in the different product teams to get their applications production ready, while also improving the accessibility of Duet Design System’s &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Web Components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Compared to the beginning of December, we’re now down from roughly 30 accessibility issues to just 4 non-critical ones. This means that our components now fully support all the common screen reader and OS combinations like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.apple.com/accessibility/mac/vision/&quot;&gt;VoiceOver&lt;/a&gt; on macOS and iOS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/accessibility/android/answer/6283677?hl=en&amp;amp;ref_topic=3529932&quot;&gt;TalkBack&lt;/a&gt; on Android&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nvaccess.org/&quot;&gt;NVDA&lt;/a&gt; on Windows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freedomscientific.com/products/software/jaws/&quot;&gt;Jaws&lt;/a&gt; on Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition to &lt;a href=&quot;https://www.duetds.com/accessibility/&quot;&gt;accessibility improvements&lt;/a&gt;, we’ve also worked on new components. For some time one of the most requested component has been a modal, so we’re happy to tell that &lt;a href=&quot;https://www.duetds.com/components/modal/&quot;&gt;Modal&lt;/a&gt; is finally out of prototype status and ready for production use.&lt;/p&gt;
&lt;p&gt;We’ve also improved the overall automation for &lt;a href=&quot;https://www.duetds.com/iconography/&quot;&gt;Duet’s icon library&lt;/a&gt;. Its generation doesn’t include manual steps anymore, which means we’re able to add new icons or edit existing ones much more effortlessly.&lt;/p&gt;
&lt;p&gt;Finally, we’re happy to announce that we have a new frontend developer, &lt;a href=&quot;https://github.com/WickyNilliams&quot;&gt;Nick Williams&lt;/a&gt;, starting to work with us to help make Duet Design System even more robust for the teams consuming it. Welcome Nick!&lt;/p&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-january-2020-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;server-side-rendering&quot;&gt;Server side rendering &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-january-2020-update/#server-side-rendering&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Server Side Rendering refers to JavaScript application’s ability to render on the server rather than in the user’s browser. Duet’s components now support this and can be rendered on a &lt;a href=&quot;https://duckduckgo.com/?q=nodejs&amp;amp;t=osx&quot;&gt;Node.js server&lt;/a&gt; for better performance.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hydrate &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@duetds/components/hydrate&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;hydrate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;renderToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;clientHydrateAnnotations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;removeScripts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;removeUnusedStyles&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;updated-components-view&quot;&gt;Updated components view &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-january-2020-update/#updated-components-view&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve been working on improving the &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;components listing&lt;/a&gt; and created preview images for each component. Additionally Duet’s global search has been improved to make it easier to find a specific component.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/components.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;introducing-tutorials&quot;&gt;Introducing tutorials &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-january-2020-update/#introducing-tutorials&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To make it easier to learn how to build applications using Duet Design System, we’ve started writing tutorials that currently cover topics like &lt;a href=&quot;https://www.duetds.com/building-layouts/&quot;&gt;layout creation&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/server-side-rendering/&quot;&gt;server side rendering&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/tutorials.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h2 id=&quot;on-the-roadmap-next&quot;&gt;On the roadmap next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/duet-design-system-january-2020-update/#on-the-roadmap-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Our first priority is to onboard new team members and determine together how we want to continue developing features in 2020.&lt;/li&gt;
&lt;li&gt;The next priority is to focus on a new drag and drop browser based interface builder for Duet’s Web Components.&lt;/li&gt;
&lt;li&gt;Finally, we’re also focusing on getting the last missing components ready for production usage. For an up-to-date list on progress and what’s under work, &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;view component statuses&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until February!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>SSR with Duet Web Components</title>
      <link href="https://arielsalminen.com/2020/ssr-with-duet-web-components/"/>
      <updated>2020-01-18T00:00:00Z</updated>
      <id>https://arielsalminen.com/2020/ssr-with-duet-web-components/</id>
      <content type="html">&lt;p&gt;Following this tutorial you will learn how to server side render Duet Design System’s Web Components using Eleventy and other static site generators.&lt;/p&gt;
&lt;p&gt;For this particular tutorial we’re assuming you already have a working &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy website&lt;/a&gt; up and running with Duet’s &lt;a href=&quot;https://www.duetds.com/typography/&quot;&gt;Fonts&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/css-framework/&quot;&gt;CSS Framework&lt;/a&gt;. If you aren’t familiar with Eleventy, its documentation provides easy to follow &lt;a href=&quot;https://www.11ty.dev/docs/starter/&quot;&gt;getting started instructions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting started &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/ssr-with-duet-web-components/#getting-started&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get started with server side rendering, install &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Duet’s Web Components&lt;/a&gt; and &lt;a href=&quot;https://www.npmjs.com/package/ncp&quot;&gt;NCP&lt;/a&gt; into your own project by running:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @duetds/components ncp --save-dev&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once installed, add a script to your package.json that copies the component library from &lt;a href=&quot;https://www.npmjs.com/org/duetds&quot;&gt;Duet’s package&lt;/a&gt; into a location you’ve specified:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;copy:components&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ncp ./node_modules/@duetds/components/lib ./src/js/components&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the above example we’re copying the components into &lt;code&gt;src/js/components&lt;/code&gt; directory. You can now call this script while starting up your app or build process to make sure you’ve always got the latest components copied over:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;copy:components &amp;amp; dev&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you have a copy task in place and have copied the component library over, you can put script tags similar to these in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of your page:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/js/components/duet/duet.esm.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;nomodule&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/js/components/duet/duet.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above scripts will take care of client side hydration of the server side rendered components, nothing else is required.&lt;/p&gt;
&lt;h2 id=&quot;ssr-configuration&quot;&gt;SSR configuration &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2020/ssr-with-duet-web-components/#ssr-configuration&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that we’re done with the client side hydration, it’s time to configure Eleventy to render our Web Components on server.&lt;/p&gt;
&lt;p&gt;Duet’s Web Components package includes a hydrate app for this usage. The hydrate app is a bundle of the same components, but compiled so that they can be hydrated on a Node.js server and generate static HTML and CSS.&lt;/p&gt;
&lt;p&gt;To get started, import the hydrate app into your &lt;code&gt;.eleventy.js&lt;/code&gt; configuration:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hydrate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@duetds/components/hydrate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, add the following transform into your &lt;code&gt;.eleventy.js&lt;/code&gt; configuration file that takes content as an input and processes it using Duet’s hydrate app:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hydrate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@duetds/components/hydrate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTransform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hydrate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputPath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hydrate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;renderToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token literal-property property&quot;&gt;clientHydrateAnnotations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token literal-property property&quot;&gt;removeScripts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token literal-property property&quot;&gt;removeUnusedStyles&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; error&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; content&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most of the time you probably only want to do the rendering in production environment, so you could modify the above to include a check for that:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hydrate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@duetds/components/hydrate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTransform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hydrate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ELEVENTY_ENV&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputPath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hydrate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;renderToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token literal-property property&quot;&gt;clientHydrateAnnotations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token literal-property property&quot;&gt;removeScripts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;            &lt;span class=&quot;token literal-property property&quot;&gt;removeUnusedStyles&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; error&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; content&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above transform now gives you server side rendered components that function without JavaScript. Please note that you need to separately pre-render the content for each theme you want to support.&lt;/p&gt;
&lt;p&gt;One thing to also keep in mind is that if you’re doing HTML minification, you should configure it so that it won’t remove comments from HTML as the client side hydration relies on them to be available. If you’re using &lt;code&gt;html-minifier&lt;/code&gt; with Eleventy, you can configure it like this:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; htmlmin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;html-minifier&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTransform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;htmlmin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ELEVENTY_ENV&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputPath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; minified &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; htmlmin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;minify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token comment&quot;&gt;// Client side hydration won’t work if comments are removed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;          &lt;span class=&quot;token literal-property property&quot;&gt;removeComments&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; minified&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; content&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    
    <entry>
      <title>Why We Use Web Components</title>
      <link href="https://arielsalminen.com/2019/why-we-use-web-components/"/>
      <updated>2019-12-28T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/why-we-use-web-components/</id>
      <content type="html">&lt;p&gt;It’s August, 2018. I’m at the office, sitting by the window staring rain pouring down from the sky. A warm cup of tea in my hand, about to sip it, but the phone suddenly rings. I don’t recognize the number. I hesitate for a moment whether to pick it up or not. Maybe it’s again a tele­mar­keter trying to sell me something?&lt;/p&gt;
&lt;p&gt;Thinking of this particular autumn evening today, a year and a half later, I’m delighted I picked up the phone. This one phone call ended up having a major impact, as the end result was the biggest &lt;a href=&quot;https://arielsalminen.com/about/#projects&quot;&gt;personal project&lt;/a&gt; I have worked on so far.&lt;/p&gt;
&lt;p&gt;While I used to work with bigger clients and projects when we &lt;a href=&quot;https://arielsalminen.com/2015/san-francisco/&quot;&gt;lived in United States&lt;/a&gt;, this felt different. I personally sold the project and were responsible for most of the things from &lt;a href=&quot;https://www.duetds.com/updates/september-2019/&quot;&gt;initial research&lt;/a&gt; all the way to the design system’s &lt;a href=&quot;https://www.duetds.com/about/&quot;&gt;overall architecture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A few months went by after our first call. I went to see the client during a couple of occasions to plan the possible collaboration. After some back and forth negotiation we ultimately started working together in the beginning of January, 2019.&lt;/p&gt;
&lt;p&gt;And so &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt; was born.&lt;/p&gt;
&lt;h2 id=&quot;controversial-opinions&quot;&gt;Controversial opinions &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#controversial-opinions&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you might have guessed based on the title, &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt; has something to do with &lt;a href=&quot;https://en.wikipedia.org/wiki/Web_Components&quot;&gt;Web Components&lt;/a&gt;. Quite a lot actually. Our whole frontend component architecture is based on Web Components. But how and why did we end up using them? Seems like a very controversial tech, at least if you solely base your opinion on &lt;a href=&quot;https://twitter.com/arielsalminen&quot;&gt;what’s happening on Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Well if anything, we didn’t actually start by choosing Web Components. It was more that they chose us. Truth speaking, we weren’t even considering them until only later on in the spring once the &lt;a href=&quot;https://www.duetds.com/updates/september-2019/&quot;&gt;research I was working on&lt;/a&gt; started suggesting us that they might be the most viable option.&lt;/p&gt;
&lt;p&gt;One of the biggest challenges for us turned out to be the number of different tech stacks in use. My client had applications built using &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt;, &lt;a href=&quot;https://emberjs.com/&quot;&gt;Ember&lt;/a&gt;, &lt;a href=&quot;https://stackoverflow.com/questions/20435653/what-is-vanillajs&quot;&gt;Vanilla JavaScript&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/HTML&quot;&gt;basic HTML&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Machine_code&quot;&gt;native code&lt;/a&gt;. And more.&lt;/p&gt;
&lt;p&gt;We couldn’t &lt;em&gt;just choose [a framework]&lt;/em&gt; because the different tech stacks were picked by different teams (or even different sub-companies) for different reasons and we would have never succeeded if we would have tried to force everyone to use a specific technology like React.&lt;/p&gt;
&lt;p&gt;Instead, we had the urge to create a technology-agnostic instead of technology-specific system. A system that is based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Web_standards&quot;&gt;Web Standards&lt;/a&gt; and would survive the births and deaths of JavaScript frameworks.&lt;/p&gt;
&lt;h2 id=&quot;what-are-web-components&quot;&gt;What are Web Components? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#what-are-web-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Web Components are a set of technologies that provide a standards based component model for the Web. They allow you to create reusable &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements&quot;&gt;Custom Elements&lt;/a&gt; with their functionality encapsulated away from the rest of the code. Primary technologies used to create them include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements&quot;&gt;Custom Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM&quot;&gt;Shadow DOM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots&quot;&gt;HTML Templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;best-parts-of-web-components&quot;&gt;Best parts of Web Components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#best-parts-of-web-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This past year has made me a big advocate for Web Components. What previously seemed like a distant black box that I tried to stay away from, has now become an important part of my toolset. If I would have to list the main reasons why Web Components work so greatly for &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;, it would be these four things:&lt;/p&gt;
&lt;h3 id=&quot;1.-tech-agnostic-instead-of-tech-specific&quot;&gt;1. Tech-agnostic instead of tech-specific &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#1.-tech-agnostic-instead-of-tech-specific&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In order to create modular interfaces, a design system needs to be technology-agnostic instead of technology-specific. Web Components offer this benefit and make it easier to reduce our design system’s complexity and improve its reusability.&lt;/p&gt;
&lt;h3 id=&quot;2.-future-proofing-with-web-standards&quot;&gt;2. Future proofing with Web Standards &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#2.-future-proofing-with-web-standards&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Web_standards&quot;&gt;Web Standards&lt;/a&gt; are more future proof than any given JavaScript framework. I’ve seen different frameworks come and go during my almost two decade long career on the web, but Web Standards keep thriving and evolving.&lt;/p&gt;
&lt;h3 id=&quot;3.-any-framework-or-no-framework&quot;&gt;3. Any framework or no framework &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#3.-any-framework-or-no-framework&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Web Components can be used with basically &lt;a href=&quot;https://custom-elements-everywhere.com/&quot;&gt;any JavaScript framework&lt;/a&gt; or no framework at all. This means we’re able to support all our product teams from a single codebase. This makes it possible for our small design system team to be very efficient. Currently we can offer support for all of the following with just one set of components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://emberjs.com/&quot;&gt;Ember&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/JavaScript&quot;&gt;Vanilla JavaScript&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/HTML&quot;&gt;Basic HTML&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4.-full-encapsulation&quot;&gt;4. Full Encapsulation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#4.-full-encapsulation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM&quot;&gt;Shadow DOM&lt;/a&gt; allows components to have their own DOM tree that can’t be accidentally accessed from the main document. For us this means that “everything just works” when the components are implemented onto different environments and platforms. Styles cannot penetrate a component from the outside, and styles inside a component won’t bleed out.&lt;/p&gt;
&lt;h2 id=&quot;debunking-myths&quot;&gt;Debunking Myths &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#debunking-myths&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I guess you really can’t talk about Web Components without also talking about their negative sides. They’re built on &lt;a href=&quot;https://www.w3.org/TR/&quot;&gt;evolving standards&lt;/a&gt; which have their flaws and limitations. I’ve seen a few myths go around though which I’d like to clear just a bit for anyone wondering:&lt;/p&gt;
&lt;h3 id=&quot;1.-shadow-dom-doesn%E2%80%99t-work-with-forms&quot;&gt;1. Shadow DOM doesn’t work with forms &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#1.-shadow-dom-doesn%E2%80%99t-work-with-forms&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is true to some extent and one of the drawbacks of &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM&quot;&gt;Shadow DOM&lt;/a&gt;. It makes sense though if you think about it. Shadow DOM isn’t a part of the normal DOM tree/document. Whether this is an issue for you or not depends on what you’re building.&lt;/p&gt;
&lt;p&gt;There’re a few approaches on how to get around this, but the easiest is to not use Shadow DOM for components that host form inputs. The other option would be to &lt;a href=&quot;https://www.hjorthhansen.dev/shadow-dom-and-forms/&quot;&gt;create an invisible input&lt;/a&gt; and append that with JavaScript to the parent document.&lt;/p&gt;
&lt;h3 id=&quot;2.-web-components-can%E2%80%99t-be-server-side-rendered&quot;&gt;2. Web components can’t be server side rendered &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#2.-web-components-can%E2%80%99t-be-server-side-rendered&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not true. We’ve built support for &lt;a href=&quot;https://www.duetds.com/using-components/#server-side-rendering&quot;&gt;server side rendering&lt;/a&gt; into our Web Components. While it might be hard to do if you would have to build a solution from scratch, there are tools like Stencil.js that solve this for you.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/org/duetds&quot;&gt;Duet’s Web Components package&lt;/a&gt; includes a hydrate app that is a bundle of the same components, but compiled so that they can be hydrated on a &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;Node.js server&lt;/a&gt; and generate static HTML and CSS.&lt;/p&gt;
&lt;h3 id=&quot;3.-using-web-components-means-duplicate-css&quot;&gt;3. Using web components means duplicate CSS &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#3.-using-web-components-means-duplicate-css&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It can if you don’t make your components modular enough. But if your frontend architecture is designed around reusability and modularity then this isn’t really an issue. Yes, you might have to set margin and padding once to zero for each Shadow DOM, but let’s not exaggerate the impact of this. We use one &lt;a href=&quot;https://sass-lang.com/guide&quot;&gt;Sass mixin&lt;/a&gt; for this in Duet.&lt;/p&gt;
&lt;h3 id=&quot;4.-web-components-aren%E2%80%99t-accessible&quot;&gt;4. Web components aren’t accessible &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#4.-web-components-aren%E2%80%99t-accessible&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not true at all. Of course you can construct them in a way which isn’t accessible. But so you can do by building things with &lt;em&gt;[insert a JavaScript framework]&lt;/em&gt; as well. We provide support for &lt;a href=&quot;https://www.w3.org/TR/WCAG21/&quot;&gt;WCAG 2.1 Spec&lt;/a&gt; and have tested our Web Components to work with all common screen reader and OS combinations like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.apple.com/accessibility/mac/vision/&quot;&gt;VoiceOver&lt;/a&gt; on macOS and iOS&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://support.google.com/accessibility/android/answer/6283677?hl=en&amp;amp;ref_topic=3529932&quot;&gt;TalkBack&lt;/a&gt; on Android&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.nvaccess.org/&quot;&gt;NVDA&lt;/a&gt; on Windows&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.freedomscientific.com/products/software/jaws/&quot;&gt;Jaws&lt;/a&gt; on Windows&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5.-web-components-don%E2%80%99t-work-with-react&quot;&gt;5. Web components don’t work with React &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#5.-web-components-don%E2%80%99t-work-with-react&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is both true and false. Web Components themselves work fine, but by default &lt;a href=&quot;https://custom-elements-everywhere.com/&quot;&gt;React passes all data&lt;/a&gt; to Custom Elements in the form of attributes, meaning you can’t pass objects or arrays without workarounds. Additionally, because React has its own synthetic event system, it cannot listen for DOM events coming from Custom Elements without the use of refs.&lt;/p&gt;
&lt;p&gt;Both of these issues can be fixed, but for some they might be showstoppers. For our team the benefits of Web Components far surpassed these and we decided to work our way around these issues by automatically wrapping our Web Components with React based wrappers.&lt;/p&gt;
&lt;h3 id=&quot;6.-web-components-aren%E2%80%99t-production-ready&quot;&gt;6. Web Components aren’t production ready &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#6.-web-components-aren%E2%80%99t-production-ready&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This last myth I probably hear the most often. People seem to assume that because Web Components are built on evolving standards they can’t be used for anything else except experiments. Well guess what, the whole World Wide Web is &lt;a href=&quot;https://www.w3.org/TR/&quot;&gt;a set of standards&lt;/a&gt; that are constantly transitioning and evolving.&lt;/p&gt;
&lt;p&gt;If you need to see some real life examples, take a look of Firefox’s user interface that is now &lt;a href=&quot;https://briangrinstead.com/blog/firefox-webcomponents/&quot;&gt;built with Web Components&lt;/a&gt;. Or Apple who uses Web Components in their new &lt;a href=&quot;https://dev.to/ionic/apple-just-shipped-web-components-to-production-and-you-probably-missed-it-57pf&quot;&gt;Apple Music service&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-future-is-bright&quot;&gt;The future is bright &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#the-future-is-bright&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is an incredibly exciting time to be a web developer. New standards&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#one&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; like the &lt;a href=&quot;https://github.com/w3c/webcomponents&quot;&gt;Web Components&lt;/a&gt; have made it so much easier to build systems that can support a range of platforms and frameworks via a single code base. To be completely honest; five years ago I would have probably laughed if someone would have claimed that all of this would be easy.&lt;/p&gt;
&lt;p&gt;Enthusiastic from our positive experiences, the next step is to expand towards native apps and create browser based tools around &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Duet’s Web Components&lt;/a&gt; that allow us to &lt;a href=&quot;https://arielsalminen.com/2017/design-tools-processes/&quot;&gt;move further from static design tools&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;web-components-out-in-the-wild&quot;&gt;Web Components out in the wild &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/why-we-use-web-components/#web-components-out-in-the-wild&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nordhealth.design/&quot;&gt;Nord Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/w3c/webcomponents&quot;&gt;Web Components specifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://custom-elements-everywhere.com/&quot;&gt;Custom Elements Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/ionic/apple-just-shipped-web-components-to-production-and-you-probably-missed-it-57pf&quot;&gt;Apple just shipped over 45 Web Components in Apple Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://briangrinstead.com/blog/firefox-webcomponents/&quot;&gt;Firefox’s whole UI is now built with Web Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/blogs/2018/12/introducing-lightning-web-components.html&quot;&gt;SalesForce’s Design System uses Web Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://design.mixpanel.com/&quot;&gt;Mixpanel Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.predix-ui.com/&quot;&gt;GE’s Predix Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://meetup.github.io/swarm-design-system/&quot;&gt;Meetup.com’s Swarm Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ni.github.io/design-system/&quot;&gt;Fuse Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patternfly.github.io/patternfly-elements/&quot;&gt;Red Hat’s PatternFly Elements System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sap.github.io/ui5-webcomponents/&quot;&gt;SAP Web Components System&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sup id=&quot;one&quot;&gt;[1]&lt;/sup&gt; If we can really consider something &lt;a href=&quot;https://fronteers.nl/congres/2011/sessions/web-components-and-model-driven-views-alex-russell&quot;&gt;introduced in 2011&lt;/a&gt; to be new anymore.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Design System Won’t Fix Your Problems</title>
      <link href="https://arielsalminen.com/2019/design-system-wont-fix-your-problems/"/>
      <updated>2019-12-27T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/design-system-wont-fix-your-problems/</id>
      <content type="html">&lt;p&gt;Ever read an article praising design systems and how they magically solve design and frontend challenges? I’ve sure seen this being repeated in one form or another. Maybe not with these exact exaggerated words, but the underlying message has been close. While there might be a spark of truth there somewhere, it can be quite misleading to make this kind of statements without explaining what’s really required.&lt;/p&gt;
&lt;p&gt;You might’ve seen or been on the other side as well, where organizations invest large sums of money to hire external agencies to create design systems for them. These agencies often work completely detached in their own silos and only claim to blend into the client’s organization. While this is a good business model for the agencies selling and creating these systems, it rarely works out for the client organization.&lt;/p&gt;
&lt;p&gt;Real life example of this behaviour: a manager at &lt;em&gt;Organization Y&lt;/em&gt; hears about design systems and how they solved the challenges of &lt;em&gt;Organization X.&lt;/em&gt; They want to get on the bandwagon as well. &lt;em&gt;Agency Z&lt;/em&gt; sees this as a money making opportunity and sells them a team of designers and developers who will design and build the system for &lt;em&gt;Organization Y.&lt;/em&gt; The starting price is over one million US dollars.&lt;/p&gt;
&lt;p&gt;While this works as a great marketing and produces a nice portfolio piece for the &lt;em&gt;Agency Z&lt;/em&gt; to sell even more expensive projects like this in the future, the &lt;em&gt;Organization Y&lt;/em&gt; is ultimately left with a product that isn’t utilized or serving a real purpose.&lt;/p&gt;
&lt;p&gt;This happens for a few reasons, but the main one being that the people working in-house don’t really believe in nor are part of the design system &lt;em&gt;Agency Z&lt;/em&gt; created. Why would they care or change their habits for someone who doesn’t even work in &lt;em&gt;Organization Y?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So begins the slow and painful death of the system.&lt;/p&gt;
&lt;p&gt;Eventually someone needs to be blamed, so &lt;em&gt;Organization Y&lt;/em&gt; fires the manager and stops further contracts with &lt;em&gt;Agency Z.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Everyone loses.&lt;/p&gt;
&lt;p&gt;At no point does &lt;em&gt;Organization Y&lt;/em&gt; consider, nor is told, that for the design system to actually work, it needs to be an internal product owned by the organization, not an outsourced project.&lt;/p&gt;
&lt;p&gt;You can’t just hire an agency to create a design system and expect that the system alone will solve something. It won’t do much before the people in the organization align on this idea as well, believe in it, invest in it, and create a culture of collaboration around it.&lt;/p&gt;
&lt;p&gt;Many agencies selling design systems as projects won’t explain this to you. I’ve had to witness this so many times that it lead me to write this post. I’m thinking the biggest reason being that they either don’t have enough experience on the matter, or that it’s against their core business model that relies on selling as many hours as they can.&lt;/p&gt;
&lt;p&gt;Imagine someone from an agency explaining in a sales meeting:&lt;/p&gt;
&lt;blockquote&gt;“We don’t think you should hire an agency to create your design system, but instead have an in-house team. The most we can do is to help you kick off the work while providing our expertise.”&lt;/blockquote&gt;
&lt;p&gt;There are exceptions of course. To both reasons why you might need an agency and the agencies themselves.&lt;/p&gt;
&lt;p&gt;We don’t live in a black and white world.&lt;/p&gt;
&lt;p&gt;So while it’s probably a bad idea to hire an external agency to create your whole system, it could be helpful to have someone external &lt;em&gt;from an agency&lt;/em&gt; to lead you towards the right direction if your organization lacks the necessary experience and expertise.&lt;/p&gt;
&lt;p&gt;Just stay away from folks who try to convince you that having a design system alone will solve something.&lt;/p&gt;
&lt;p&gt;It won’t.&lt;br /&gt;&lt;br /&gt;
It’s just the beginning.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System December 2019 Update</title>
      <link href="https://arielsalminen.com/2019/duet-design-system-december-2019-update/"/>
      <updated>2019-12-01T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/duet-design-system-december-2019-update/</id>
      <content type="html">&lt;p&gt;You’re reading the fourth Duet Design System monthly update. In this update we’ll share statistics and  feedback we’ve received regarding Duet’s public launch.&lt;/p&gt;
&lt;p&gt;Last month marked a major milestone for us as we launched Duet publicly. A little under a month has gone by, and we’ve seen more than 12.000 unique visitors from all over the globe.&lt;/p&gt;
&lt;p&gt;Most of the visitors are coming from United States, Finland, and the UK, but in total we’re seeing traffic from 72 different countries. A simplified overview of the past three+ weeks’ statistics looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;200.000 page views&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;12.000 unique visitors&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;72 countries represented&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;52.000 goal completions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100+ websites and blogs sharing Duet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 million files served via our CDN&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While a lot of the traffic has been coming from social media, Duet has also been shared on these websites, publications, and newsletters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://news.design.systems/issues/94#start&quot;&gt;Design Systems News: Issue 94&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-future-is-bright-because-the-future-is-static/&quot;&gt;CSS Tricks: The future is bright because the future is static&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://principles.design/examples/duet&quot;&gt;Design Principles: Duet’s Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdesignernews.com/comment/duet-design-system&quot;&gt;Web Designer News: The most upvoted post of the day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdesignerdepot.com/2019/11/popular-design-news-of-the-week-november-11-2019-november-17-2019/&quot;&gt;Web Designer Depot: Popular design news of the week&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://heydesigner.com/newsletter/daily-issues/2019-315/&quot;&gt;Hey Designer: November 11th newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Fuxplanet.org%2Fux-design-weekly-digest-issue-12-5e0ea40b4d7c&quot;&gt;UX Design Weekly: Issue 12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sidebar.io/?after=2019-11-12&amp;amp;before=2019-11-12&quot;&gt;Sidebar: November 12th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.evernote.design/post/duet-design-system/&quot;&gt;Evernote: Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adele.uxpin.com/&quot;&gt;UXPin: Adele&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://muz.li/&quot;&gt;InVision: Muzli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conversation has been fairly active on Twitter too. I personally tweeted this on November 6th and it ended up being the single biggest source of traffic for our documentation (thanks to all the retweets, people):&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Extremely happy to tell that we’ve finally made Duet Design System’s docs public. Features I’m personally proud about:&lt;br /&gt;&lt;br /&gt;— Can be used with any JS framework&lt;br /&gt;—  Supports WCAG 2.1&lt;br /&gt;— Comes in two themes&lt;br /&gt;— Minimal network footprint&lt;br /&gt;— Uses Web Components&lt;a href=&quot;https://t.co/v9PET3G8BS&quot;&gt;https://t.co/v9PET3G8BS&lt;/a&gt;&lt;/p&gt;&amp;mdash;  (@arielsalminen) &lt;a href=&quot;https://twitter.com/viljamis/status/1192042256737415170?ref_src=twsrc%5Etfw&quot;&gt;November 6, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/zachleat&quot;&gt;Zach Leatherman&lt;/a&gt;, who created the tool called &lt;a href=&quot;https://www.11ty.io/&quot;&gt;Eleventy&lt;/a&gt; that our documentation also uses, commented:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;fi&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I’ve been waiting eagerly for this launch—it really feels like a new gold standard for long-term framework independent design systems.&lt;br /&gt;&lt;br /&gt;“can be also used *without* any JS framework.” 🎉&lt;br /&gt;&lt;br /&gt;Amazing work &lt;a href=&quot;https://twitter.com/viljamis?ref_src=twsrc%5Etfw&quot;&gt;@arielsalminen&lt;/a&gt;!&lt;a href=&quot;https://t.co/PBHpli81cR&quot;&gt;https://t.co/PBHpli81cR&lt;/a&gt;&lt;/p&gt;&amp;mdash; Zach Leatherman (@zachleat) &lt;a href=&quot;https://twitter.com/zachleat/status/1192066015238279168?ref_src=twsrc%5Etfw&quot;&gt;6. marraskuuta 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/JadLimcaco&quot;&gt;Jad Limcaco&lt;/a&gt;, who’s working at Apple commented:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I really like how they simplified it so it can be used for prototyping really easily. All you do is add some script tags. Then you can use the components in HTML like so:&lt;br /&gt;&lt;br /&gt;&amp;lt;duet-button variation=&amp;quot;primary&amp;quot;&amp;gt;Send&amp;lt;/duet-button&amp;gt; &lt;a href=&quot;https://t.co/J3aQ5kL5Oq&quot;&gt;pic.twitter.com/J3aQ5kL5Oq&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jad Limcaco (@JadLimcaco) &lt;a href=&quot;https://twitter.com/JadLimcaco/status/1192151697562333184?ref_src=twsrc%5Etfw&quot;&gt;November 6, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://eightshapes.com/nathan-curtis.html&quot;&gt;Nathan Curtis&lt;/a&gt;, who co-founded EightShapes commented:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Duet design system roadmap, published on their site, full on with struckthrough completed items!&lt;a href=&quot;https://t.co/D5HwGLYGTm&quot;&gt;https://t.co/D5HwGLYGTm&lt;/a&gt;&lt;br /&gt;Per &lt;a href=&quot;https://twitter.com/viljamis?ref_src=twsrc%5Etfw&quot;&gt;@arielsalminen&lt;/a&gt; &lt;br /&gt;HT &lt;a href=&quot;https://twitter.com/jamesmelzer?ref_src=twsrc%5Etfw&quot;&gt;@jamesmelzer&lt;/a&gt; &lt;br /&gt;CC &lt;a href=&quot;https://twitter.com/ClayHero?ref_src=twsrc%5Etfw&quot;&gt;@ClayHero&lt;/a&gt;&lt;/p&gt;&amp;mdash; Nathan Curtis (@nathanacurtis) &lt;a href=&quot;https://twitter.com/nathanacurtis/status/1194246307092815873?ref_src=twsrc%5Etfw&quot;&gt;November 12, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/iamjdimitrov&quot;&gt;Jordam Dimitrov&lt;/a&gt; asked us:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/Lahi_Tapiola?ref_src=twsrc%5Etfw&quot;&gt;@Lahi_Tapiola&lt;/a&gt; I saw &lt;a href=&quot;https://t.co/Ia5fQpiLC7&quot;&gt;https://t.co/Ia5fQpiLC7&lt;/a&gt; and it&amp;#39;s awesome! We need to make a similar platform for our DS, did you use something ready or it&amp;#39;s custom-made? :)&lt;/p&gt;&amp;mdash; Jordan Dimitrov (@iamjdimitrov) &lt;a href=&quot;https://twitter.com/iamjdimitrov/status/1192113225606860803?ref_src=twsrc%5Etfw&quot;&gt;November 6, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/_karlisup&quot;&gt;Karlis Upitis&lt;/a&gt; commented:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Yet another great Design System &lt;a href=&quot;https://t.co/ffzrj0g4JK&quot;&gt;https://t.co/ffzrj0g4JK&lt;/a&gt;&lt;br /&gt;A lot of useful resources e.g. this diagram - &amp;quot;when to add a new component?&amp;quot; &lt;a href=&quot;https://t.co/1zTmkVl0g7&quot;&gt;pic.twitter.com/1zTmkVl0g7&lt;/a&gt;&lt;/p&gt;&amp;mdash; Karlis Upitis (@_karlisup) &lt;a href=&quot;https://twitter.com/_karlisup/status/1200338513234927618?ref_src=twsrc%5Etfw&quot;&gt;November 29, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/millonestarde&quot;&gt;Javier Cuello&lt;/a&gt; commented:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;This looks really good to see how a design system works and is documented *for real*. It includes components code, design tokens, naming conventions and more. &lt;a href=&quot;https://t.co/OswNYtWGTH&quot;&gt;https://t.co/OswNYtWGTH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Javier &amp;#39;Simón&amp;#39; Cuello (@millonestarde) &lt;a href=&quot;https://twitter.com/millonestarde/status/1192089546164449280?ref_src=twsrc%5Etfw&quot;&gt;November 6, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Similarly, Teppo Haste from our team &lt;a href=&quot;https://www.linkedin.com/posts/activity-6597802156156305408-CAES/&quot;&gt;shared Duet on LinkedIn&lt;/a&gt; which resulted in a bunch of new traffic and questions about the work we’ve done so far:&lt;/p&gt;
&lt;iframe class=&quot;iframe-linkedin&quot; src=&quot;https://www.linkedin.com/embed/feed/update/urn:li:share:6597802155455860737&quot; height=&quot;1080&quot; width=&quot;500&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; title=&quot;Embedded post&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;All in all, we’re really happy about the reception. This makes us want to push towards even higher quality content in the future for both our clients, and the design and development teams utilizing Duet.&lt;/p&gt;
&lt;p&gt;Now is also a good time to say thanks to all our partners that have been a part of this journey so far: &lt;a href=&quot;https://kuudes.com/&quot;&gt;Kuudes&lt;/a&gt;, &lt;a href=&quot;https://dka.io/&quot;&gt;Dunning, Kruger &amp;amp; Associates&lt;/a&gt;, &lt;a href=&quot;https://hiq.fi/en/&quot;&gt;HiQ Finland&lt;/a&gt;, &lt;a href=&quot;https://www.cgi.com/us/en-us&quot;&gt;CGI&lt;/a&gt;, &lt;a href=&quot;https://www.tcs.com/&quot;&gt;Tata Consultancy Services&lt;/a&gt;, and all in-house teams, a big thank you!&lt;/p&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-december-2019-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;desktop-application&quot;&gt;Desktop application &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-december-2019-update/#desktop-application&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet’s documentation is now available as a progressive web app with offline support. Using Chrome on Desktop and Android, or Safari on iOS lets you install Duet onto your device. &lt;a href=&quot;https://arielsalminen.com/faq/#how-do-i-install-duet%E2%80%99s-native-app&quot;&gt;Follow these instructions to get started&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;https://www.duetds.com/faq/#how-do-i-install-duet%E2%80%99s-native-app&quot;&gt;
  &lt;img src=&quot;https://arielsalminen.com/img/pwa.png&quot; alt=&quot;Duet is a progressive web app&quot; loading=&quot;lazy&quot; /&gt;
&lt;/a&gt;
&lt;h3 id=&quot;process-for-adding-components&quot;&gt;Process for adding components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-december-2019-update/#process-for-adding-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve completely reworked our &lt;a href=&quot;https://arielsalminen.com/contributing/&quot;&gt;contributing guidelines&lt;/a&gt; and have included a new flow diagram that helps you determine whether a component belongs to the design system or should be kept application specific instead.&lt;/p&gt;
&lt;a href=&quot;https://coggle.it/diagram/XaK6T5ZI9nGyofKv/t/process-for-adding-new-components-to-duet-design-system&quot; target=&quot;_blank&quot;&gt;
  &lt;img src=&quot;https://arielsalminen.com/img/adding-components.png&quot; loading=&quot;lazy&quot; alt=&quot;Process for adding new components to Duet&quot; /&gt;
&lt;/a&gt;
&lt;h3 id=&quot;new-layout-tools&quot;&gt;New layout tools &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-december-2019-update/#new-layout-tools&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;During the past month we’ve focused on improving Duet’s layout tools. We’ve introduced new components like &lt;a href=&quot;https://arielsalminen.com/components/layout/&quot;&gt;Layout&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/components/grid/&quot;&gt;Grid&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/components/grid-item/&quot;&gt;Grid Item&lt;/a&gt; and &lt;a href=&quot;https://arielsalminen.com/components/spacer/&quot;&gt;Spacer&lt;/a&gt;. The responsive capabilities of most components have been improved as well.&lt;/p&gt;
&lt;a href=&quot;https://www.duetds.com/components/card/&quot;&gt;
  &lt;img src=&quot;https://arielsalminen.com/img/updates/layout.png&quot; alt=&quot;Duet layout components&quot; loading=&quot;lazy&quot; /&gt;
&lt;/a&gt;
&lt;h3 id=&quot;visual-regression-tests&quot;&gt;Visual regression tests &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-december-2019-update/#visual-regression-tests&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Automated &lt;a href=&quot;https://arielsalminen.com/contributing/#visual-regression-tests&quot;&gt;visual regression tests&lt;/a&gt; allow us to make sure that our components render as expected across different browsers after changes are made to the code. They also help us deliver higher quality releases with less bugs.&lt;/p&gt;
&lt;a href=&quot;https://www.duetds.com/contributing/#visual-regression-tests&quot; target=&quot;_blank&quot;&gt;
&lt;img src=&quot;https://arielsalminen.com/img/screenshot-diff.png&quot; loading=&quot;lazy&quot; alt=&quot;Visual regression tests in Duet&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;on-the-roadmap-next&quot;&gt;On the roadmap next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-december-2019-update/#on-the-roadmap-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Getting more components ready for production usage is still our first priority at the moment. For an up-to-date list on progress and what’s under work, &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;view component statuses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Our next priority is to support designers and developers who start utilizing these new parts. If you have any questions, please &lt;a href=&quot;https://www.duetds.com/support/&quot;&gt;view support page&lt;/a&gt; and reach out.&lt;/li&gt;
&lt;li&gt;Finally, we’re also starting to focus more on contribution and adoption from different teams and plan for 2020.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until 2020!&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;</content>
    </entry>
    
    <entry>
      <title>Duet Design System November 2019 Update</title>
      <link href="https://arielsalminen.com/2019/duet-design-system-november-2019-update/"/>
      <updated>2019-11-01T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/duet-design-system-november-2019-update/</id>
      <content type="html">&lt;p&gt;You’re reading the third Duet Design System monthly update. This month marks a major milestone for us as we’re launching our new design system publicly.&lt;/p&gt;
&lt;p&gt;After &lt;a href=&quot;https://www.duetds.com/updates/september-2019/&quot;&gt;ten months of hard work&lt;/a&gt;, we’re extremely happy to announce that we’ve removed the authentication and made the &lt;a href=&quot;https://www.duetds.com/&quot;&gt;documentation&lt;/a&gt; public. This change will make sharing and collaboration between different teams and third party vendors much easier. This is also a chance for us to be more transparent towards our users and share the work-in-progress.&lt;/p&gt;
&lt;p&gt;We’re also excited to see continuous rise in the adoption rate of Duet inside &lt;a href=&quot;https://www.lahitapiola.fi/henkilo&quot;&gt;LocalTapiola&lt;/a&gt; and &lt;a href=&quot;https://www.turva.fi/henkiloasiakkaat&quot;&gt;Turva&lt;/a&gt;. We follow this with a &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;Node.js&lt;/a&gt; based tool that we’ve built. The tool automatically measures Duet’s adoption and utilization levels across our product portfolio, and helps us understand where and how the system is being utilized and how it affects the work of different teams.&lt;/p&gt;
&lt;p&gt;At the time of writing, thirteen product teams utilize &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet&lt;/a&gt; directly in their app. Four out of those thirteen teams already have most of their frontend UI using &lt;a href=&quot;https://www.duetds.com/developers/&quot;&gt;Duet’s packages&lt;/a&gt; instead of custom built solutions. This quick adoption rate has somewhat affected our pace developing new features as we’ve had to provide a lot more support to our users. This is a very positive problem to have though!&lt;/p&gt;
&lt;p&gt;Remember, if you have any questions or problems, don’t hesitate to contact us directly. We’ve also created a comprehensive &lt;a href=&quot;https://www.duetds.com/faq/&quot;&gt;FAQ page&lt;/a&gt; that should answer some of your questions as well.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/analytics.png&quot; alt=&quot;Screenshot of Duet’s statistics tool&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;The above screenshot reveals a tiny portion of our statistics tool. This graph shows the total installations of our core packages. This is probably the least important information in the whole tool, but fun statistic to have nevertheless.&lt;/p&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-november-2019-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;new-brand-typeface&quot;&gt;New brand typeface &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-november-2019-update/#new-brand-typeface&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’ve been working on a new interface and brand typeface since early 2019 together with type designer &lt;a href=&quot;http://kostasbartsokas.com/&quot;&gt;Kostas Bartsokas&lt;/a&gt;. The typeface, called LahiTapiola Sans, is now ready and downloadable from &lt;a href=&quot;https://www.duetds.com/typography/&quot;&gt;typography&lt;/a&gt; page.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/typeface.svg&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;design-principles&quot;&gt;Design principles &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-november-2019-update/#design-principles&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.duetds.com/design-principles/&quot;&gt;Design principles&lt;/a&gt; form the foundation of Duet. They guide our team when working on different parts of the system and help us do better and more informed decisions.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/principles.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;react-and-angular-components&quot;&gt;React and Angular components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-november-2019-update/#react-and-angular-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To make it easier to use Duet’s &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;Web Components&lt;/a&gt; on different frameworks, we’ve created &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;React&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/using-components/&quot;&gt;Angular specific wrappers&lt;/a&gt;. This means you now get the ability to use for example ngmodel on inputs and other form fields.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Install Duet’s React package&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;npm install @duetds&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;react&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Import a React component from the above package&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Component &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; DuetButton &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@duetds/react&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// utilize the imported component&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Example&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;DuetButton variation&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;primary&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        Primary button&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;DuetButton&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;on-the-roadmap-next&quot;&gt;On the roadmap next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-november-2019-update/#on-the-roadmap-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Getting more components ready for production usage is still our first priority at the moment. For an up-to-date list on progress and what’s under work, &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;view component statuses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Our next priority is to support designers and developers who start utilizing these new parts. If you have any questions, please &lt;a href=&quot;https://www.duetds.com/support/&quot;&gt;view support page&lt;/a&gt; and reach out.&lt;/li&gt;
&lt;li&gt;Finally, we’re also starting to focus more on contribution and adoption from different teams and plan for 2020.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until December!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System October 2019 Update</title>
      <link href="https://arielsalminen.com/2019/duet-design-system-october-2019-update/"/>
      <updated>2019-10-01T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/duet-design-system-october-2019-update/</id>
      <content type="html">&lt;p&gt;You’re reading the second Duet Design System monthly update. This update focuses on accessibility and performance updates that we’ve been working on.&lt;/p&gt;
&lt;p&gt;During the past month we’ve focused on getting more components ready for production usage together with some big accessibility and performance improvements. At the time of writing, we now have &lt;a href=&quot;https://www.duetds.com/components&quot;&gt;25 production ready components&lt;/a&gt; together with &lt;a href=&quot;https://www.duetds.com/templates/&quot;&gt;5 example templates&lt;/a&gt; you can use.&lt;/p&gt;
&lt;p&gt;Making all these new features accessible has become an important part of our workflow. While the new accessibility law requires us to do so, the more important part is that it allows us to improve the experience for everyone who uses our products. To achieve this, we’ve created an &lt;a href=&quot;https://www.duetds.com/accessibility/&quot;&gt;accessibility checklist&lt;/a&gt; that helps us remember to tick all the necessary boxes.&lt;/p&gt;
&lt;p&gt;We’ve been also working on optimizing &lt;a href=&quot;https://www.duetds.com/developers/&quot;&gt;Duet’s packages&lt;/a&gt; for better performance. All packages now weigh around 90 KB combined which is pretty good, considering that this includes static assets as well. Current network footprints for different parts look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web Components Runtime:&lt;/strong&gt; 1.3 KB gzipped&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design Tokens:&lt;/strong&gt; 1.5 KB gzipped&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS Framework:&lt;/strong&gt; 3 KB gzipped&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonts CSS:&lt;/strong&gt; 300 bytes gzipped&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WOFF2 fonts:&lt;/strong&gt; 46.6 KB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All 302 icons combined:&lt;/strong&gt; 43.9 KB&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-october-2019-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;visual-studio-code-extension&quot;&gt;Visual Studio Code extension &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-october-2019-update/#visual-studio-code-extension&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; is an editor optimized for building modern web apps. To ease up the usage, we’ve created &lt;a href=&quot;https://www.duetds.com/visual-studio-code/&quot;&gt;an extension&lt;/a&gt; that does autocompletion for Duet’s components and component properties.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/vscode/vscode3-edit.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;accessibility-checklist&quot;&gt;Accessibility checklist &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-october-2019-update/#accessibility-checklist&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.duetds.com/accessibility/&quot;&gt;Accessibility checklist&lt;/a&gt; is a tool created and used by Duet’s core team when developing new features. It helps us improve the experience for everyone who uses our products and can be useful for other teams as well.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/duet-accessibility.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
&lt;h3 id=&quot;css-framework&quot;&gt;CSS Framework &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-october-2019-update/#css-framework&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duet’s &lt;a href=&quot;https://www.duetds.com/css-framework/&quot;&gt;CSS Framework&lt;/a&gt; includes a wide range of shorthand utility classes to modify an element’s appearance in your own application. It’s also an useful companion to include on a page when using &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;our components&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- To change text colors --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-color-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Text&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-color-secondary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Text&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- To change background colors --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-bg-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-bg-secondary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- To change fills of SVGs --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-fill-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;duet-fill-secondary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;on-the-roadmap-next&quot;&gt;On the roadmap next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-october-2019-update/#on-the-roadmap-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Getting more components ready for production usage is still our first priority at the moment. For an up-to-date list on progress and what’s under work, &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;view component statuses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Our next priority is to support designers and developers who start utilizing these new parts. If you have any questions, please &lt;a href=&quot;https://www.duetds.com/support/&quot;&gt;view support page&lt;/a&gt; and reach out.&lt;/li&gt;
&lt;li&gt;Finally, we’re also working on an internal tool that will allow us to measure Duet’s adoption and usage. This will help us understand where and how Duet is being used and how it affects the workflows of other teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until November!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Duet Design System September 2019 Update</title>
      <link href="https://arielsalminen.com/2019/duet-design-system-september-2019-update/"/>
      <updated>2019-09-06T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/duet-design-system-september-2019-update/</id>
      <content type="html">&lt;p&gt;You’re reading the very first Duet Design System monthly update. As this is the first of its kind, we’ll do a short recap on what has been accomplished so far.&lt;/p&gt;
&lt;h2 id=&quot;where-we%E2%80%99re-now&quot;&gt;Where we’re now &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-september-2019-update/#where-we%E2%80%99re-now&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We started working on &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet&lt;/a&gt; earlier this year in the form of user research and interviews. This was done to recognize organizational challenges and to create a solid plan for the work to follow. The challenges recognized were divided into different categories and based on them, the goals for the system became:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improved work efficiency for designers and developers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved user interface consistency and quality&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved communication between teams and people&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared documentation platform&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since those early days we’ve made a lot of progress on all these fronts. We now have a living and breathing system that’s divided into &lt;a href=&quot;https://www.duetds.com/developers/&quot;&gt;six front-end packages&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;a documentation platform&lt;/a&gt;, and &lt;a href=&quot;https://www.duetds.com/abstract/&quot;&gt;a Sketch toolkit&lt;/a&gt; that the designers use.&lt;/p&gt;
&lt;p&gt;We’ve also created many smaller utility tools such as &lt;a href=&quot;https://www.duetds.com/zeplin/&quot;&gt;Duet Zeplin extension&lt;/a&gt;. This extension shows &lt;a href=&quot;https://www.duetds.com/tokens/&quot;&gt;Duet’s Design Tokens&lt;/a&gt; instead of hard coded values in the &lt;a href=&quot;https://zeplin.io/&quot;&gt;Zeplin app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The packages and tools created can be used together or separately depending on your team’s individual needs. This makes it easier to start adopting parts of the design system into existing applications.&lt;/p&gt;
&lt;p&gt;While there’s a lot more work to do, especially on the communication part, we’re excited about the fact that we’re quite a bit ahead of our original schedule. That gives us some headway to improve the communication via these monthly updates and weekly design system “office hours”  where you can just show up with your &lt;a href=&quot;https://www.duetds.com/faq/&quot;&gt;design system questions&lt;/a&gt; and &lt;a href=&quot;https://www.duetds.com/support/&quot;&gt;support requests&lt;/a&gt; (every Thursday at 2pm).&lt;/p&gt;
&lt;p&gt;If you have any questions right now, don’t hesitate to &lt;a href=&quot;mailto:duetdesignsystem@lahitapiola.fi&quot;&gt;contact us directly&lt;/a&gt;. We’ve also created a comprehensive &lt;a href=&quot;https://www.duetds.com/faq/&quot;&gt;FAQ page&lt;/a&gt; that should answer some of your questions as well.&lt;/p&gt;
&lt;h2 id=&quot;new-this-month&quot;&gt;New this month &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-september-2019-update/#new-this-month&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this section we’ll highlight every month new features and progress from &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet Design System&lt;/a&gt;. This month’s highlights include:&lt;/p&gt;
&lt;h3 id=&quot;duet-zeplin-extension&quot;&gt;Duet Zeplin extension &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-september-2019-update/#duet-zeplin-extension&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://zeplin.io/&quot;&gt;Zeplin&lt;/a&gt; is a tool we use to handoff designs with accurate specs, assets and code snippets to developers. To ease up the usage and make it more efficient for developers, we’ve created &lt;a href=&quot;https://www.duetds.com/zeplin/&quot;&gt;an extension&lt;/a&gt; that shows &lt;a href=&quot;https://www.duetds.com/tokens/&quot;&gt;Duet’s Design Tokens&lt;/a&gt; in Zeplin.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/zeplin.png&quot; loading=&quot;lazy&quot; alt=&quot;Duet Zeplin extension&quot; /&gt;
&lt;h3 id=&quot;icon-search&quot;&gt;Icon search &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-september-2019-update/#icon-search&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To make it easier to find a specific icon (or many!), we’ve created a better user interface for searching &lt;a href=&quot;https://www.duetds.com/iconography/&quot;&gt;Duet’s icons&lt;/a&gt;. Each of the icons is now also tagged with a bunch of keywords for easier discoverability.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/icon-search.png&quot; loading=&quot;lazy&quot; alt=&quot;Icon search&quot; /&gt;
&lt;h3 id=&quot;new-components&quot;&gt;New components &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-september-2019-update/#new-components&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We’re working hard on your component requests. That’s finally paying off as we’re now seeing the first actual components being rolled out to production applications. See &lt;a href=&quot;https://www.duetds.com/components/navigation/&quot;&gt;Navigation&lt;/a&gt; or &lt;a href=&quot;https://www.duetds.com/components/hero/&quot;&gt;Hero Area&lt;/a&gt; for examples of such components.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/updates/new-components.png&quot; loading=&quot;lazy&quot; alt=&quot;New components&quot; /&gt;
&lt;h2 id=&quot;on-the-roadmap-next&quot;&gt;On the roadmap next &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/duet-design-system-september-2019-update/#on-the-roadmap-next&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Getting more components ready for production usage is our first priority at the moment. For an up-to-date list on progress and what’s under work, &lt;a href=&quot;https://www.duetds.com/components/&quot;&gt;view component statuses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Our next priority is to support designers and developers who start utilizing these new parts. If you have any questions, please &lt;a href=&quot;https://www.duetds.com/support/&quot;&gt;view support page&lt;/a&gt; and reach out.&lt;/li&gt;
&lt;li&gt;Finally, we’re working on the documentation and trying to make sure it covers most of the things you might ask. Recently, we updated the &lt;a href=&quot;https://www.duetds.com/getting-started/&quot;&gt;Getting Started&lt;/a&gt; guidelines for both developers and designers. If you feel like something’s missing, please &lt;a href=&quot;mailto:duetdesignsystem@lahitapiola.fi&quot;&gt;let us know&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until next time!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Design Principles of Duet Design System</title>
      <link href="https://arielsalminen.com/2019/design-principles-of-duet-design-system/"/>
      <updated>2019-03-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2019/design-principles-of-duet-design-system/</id>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://www.duetds.com/&quot;&gt;LocalTapiola&lt;/a&gt; hired me in 2019 to help reimagine what the company’s approach to designing, building and shipping digital products at scale should look like. I started this work by conducting a series of user research activities and workshops to reveal a lack of alignment and personal biases across business units, products and teams to understand how the design system could help them.&lt;/p&gt;
&lt;p&gt;When we had a clear view of the challenges that we wanted to solve, it was a matter of creating fundamental principles for the system that we could follow as a team. These are the principles that I created for &lt;a href=&quot;https://www.duetds.com/&quot;&gt;Duet&lt;/a&gt;:&lt;/p&gt;
&lt;h2 id=&quot;1.-universality&quot;&gt;1. Universality &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/design-principles-of-duet-design-system/#1.-universality&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Universality is in the core of the World Wide Web, so we should embrace it and build systems that are available to, and accessible by, everyone.&lt;/p&gt;
&lt;h2 id=&quot;2.-consistency&quot;&gt;2. Consistency &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/design-principles-of-duet-design-system/#2.-consistency&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Consistency enhances clarity and makes our system more predictable and efficient to use. Users shouldn’t have to wonder whether different actions or terminology used mean the same thing.&lt;/p&gt;
&lt;h2 id=&quot;3.-performance&quot;&gt;3. Performance &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/design-principles-of-duet-design-system/#3.-performance&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Good performance is good user experience. We should strive towards making our system as fast as possible in terms of both network footprint and the time it takes to become interactive.&lt;/p&gt;
&lt;h2 id=&quot;4.-modularity&quot;&gt;4. Modularity &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2019/design-principles-of-duet-design-system/#4.-modularity&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Modularity reduces complexity and improves our system’s reusability by breaking it into small, easy to consume parts.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Vue Design System</title>
      <link href="https://arielsalminen.com/2018/vue-design-system/"/>
      <updated>2018-03-13T00:00:00Z</updated>
      <id>https://arielsalminen.com/2018/vue-design-system/</id>
      <content type="html">&lt;p&gt;Vue Design System is a set of organized tools, patterns, and practices that work as the foundation for &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt; application development. What initially started as a quick-n-dirty prototyping tool for a client of mine, has grown into a fully capable systems tool that provides an environment where the pattern library and live application can be perfectly in sync.&lt;/p&gt;
&lt;p&gt;For me personally, Vue Design System has become as much of a design systems teaching and learning platform, as it is a tool that’s capable of growing from a prototype to a fully fleshed-out system that multiple applications can depend on.&lt;/p&gt;
&lt;p&gt;In this article, I will shed some light to the processes and workflow I use to get started with a new &lt;a href=&quot;http://designsystemsbook.com/&quot;&gt;design system&lt;/a&gt; project. An article, I would’ve wanted to come across when first starting with design systems and trying to figure out the best approaches. While I’ve written this from Vue Design System’s perspective, the concepts and processes I introduce here will work with any tool.&lt;/p&gt;
&lt;h2 id=&quot;the-structure&quot;&gt;The Structure &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#the-structure&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A design system can help establish a common vocabulary between everyone in an organization and ease the collabo­ration between different disciplines. I’ve seen it go the other way around too when important decisions have been made in a rush. To avoid that, &lt;a href=&quot;https://vueds.com/&quot;&gt;Vue Design System&lt;/a&gt; introduces the following framework for naming that I’ve found working well in the past:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/vueds.svg&quot; style=&quot;width:100%&quot; /&gt;
&lt;p&gt;Let’s quickly walk through each of these concepts before diving into the workflow part.&lt;/p&gt;
&lt;h3 id=&quot;principles&quot;&gt;Principles &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#principles&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://principles.design/&quot;&gt;Design principles&lt;/a&gt; are the foundation of the whole system. They form the basis of a good product and help the team with decision making. They are there to guide you and your team when working with the myriad parts of the system and help you do better and more informed decisions.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/tokens.svg&quot; style=&quot;margin-top:13%;width:7%&quot; /&gt;
&lt;h3 id=&quot;tokens&quot;&gt;Tokens &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#tokens&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/arielsalminen/vue-design-system/wiki/working-with-the-system#tokens&quot;&gt;Design tokens&lt;/a&gt; are the atoms of the system as &lt;a href=&quot;https://www.lightningdesignsystem.com/design-tokens/&quot;&gt;Salesforce&lt;/a&gt; describes them. In Vue Design System they are used instead of hard coded values to ensure a better consistency across any platform. To give you a concrete example, this is how Vue Design System has its tokens defined:&lt;/p&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# FONT-SIZE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;font_size_xx_large&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;64px&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;font_size_x_large&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;48px&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;font_size_large&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;24px&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;font_size_base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;16px&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;font_size_small&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;13px&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;font_size_x_small&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;11px&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the background, a tool called &lt;a href=&quot;https://github.com/salesforce-ux/theo&quot;&gt;Theo&lt;/a&gt; converts the above format to both Sass and Json, so that you can utilize the tokens across the system:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Example using SCSS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.heading &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;stack-space&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$space-small&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$font-family-heading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line-height-heading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also import the tokens in JavaScript:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Import tokens&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; tokens &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@/tokens/tokens.raw.json&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/elements.svg&quot; style=&quot;margin-top:13%;width:15%&quot; /&gt;
&lt;h3 id=&quot;elements&quot;&gt;Elements &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#elements&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/arielsalminen/vue-design-system/wiki/working-with-the-system#elements&quot;&gt;Elements&lt;/a&gt; utilize decisions made on the token level. A simple example of an element would be a button, a link, or an input. Anything that cannot be broken down further. I use the name ‘element’ since everything in Vue and React world is nowadays ‘a component.’ Using that term for anything else would be confusing.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/patterns.svg&quot; style=&quot;margin-top:13%;width:20%&quot; /&gt;
&lt;h3 id=&quot;patterns&quot;&gt;Patterns &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#patterns&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/arielsalminen/vue-design-system/wiki/working-with-the-system#patterns&quot;&gt;Patterns&lt;/a&gt; are UI Patterns that fall on the more complex side of the spectrum. So for example things like a date picker, a data table, or a visualization. Patterns utilize both elements and tokens. If you wonder whether something should be called an element or a pattern, ask yourself this question: &lt;em&gt;“Can this be broken down into smaller pieces?”&lt;/em&gt; If the answer is yes, it should most likely be a pattern in Vue Design System.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/templates.svg&quot; style=&quot;margin-top:13%;width:35%&quot; /&gt;
&lt;h3 id=&quot;templates&quot;&gt;Templates &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#templates&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Finally, Vue Design System has &lt;a href=&quot;https://github.com/arielsalminen/vue-design-system/wiki/working-with-the-system#templates&quot;&gt;templates&lt;/a&gt; which exist to document the layout and structure of a section. I am not calling these pages since semantically that would be incorrect. While they &lt;em&gt;can be&lt;/em&gt; pages, that’s not their only functionality. Templates consist of the three things mentioned above: &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#tokens&quot;&gt;tokens&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#elements&quot;&gt;elements&lt;/a&gt;, and &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#patterns&quot;&gt;patterns&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;my-workflow&quot;&gt;My Workflow &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#my-workflow&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that you’re familiar with the structure of Vue Design System, it’s time for us to move forward. While my process almost always starts with research, I’m expecting here that we’ve already done that, have the &lt;a href=&quot;https://www.uxpin.com/evangelizing-design-system-roi-template&quot;&gt;necessary buy-in&lt;/a&gt; from the executives, and have an &lt;a href=&quot;http://bradfrost.com/blog/post/interface-inventory/&quot;&gt;interface inventory&lt;/a&gt; ready. Maybe you even got a &lt;a href=&quot;https://medium.com/eightshapes-llc/designing-a-systems-team-d22f27a2d81d&quot;&gt;design systems team&lt;/a&gt; formed at this point, and everyone is eagerly waiting to get started.&lt;/p&gt;
&lt;p&gt;The way I tend to start the work is by organizing a few day long workshops first. After the initial workshops, I begin running more intensive design sprints with the whole team. This is done to get a kick-start for the whole project. Overall, the process I use looks somewhat like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;&lt;strong&gt;Figure out organizational challenges&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strong&gt;Define principles for the system&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strong&gt;Quick draft of type, color, and spacing&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strong&gt;Find unified design direction by exploring&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strong&gt;Iterate on color palette, type, and spacing&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strong&gt;Define initial set of system’s parts&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/space.jpg&quot; style=&quot;width:100%&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Workspace after a design systems sprint at &lt;a href=&quot;http://www.nosto.com/&quot;&gt;Nosto&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;figuring-out-challenges&quot;&gt;Figuring out challenges &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#figuring-out-challenges&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Often the challenges related to people, organization’s structure, and the underlying processes are the hardest things any given system faces. They’re also some of the primary reasons we’re building these systems for in the first place. What I’m trying to say here, is that it’s not enough to build a system. That itself won’t solve anything. You need to make an organization to adopt it and maintain it over time. Get people excited about it. Only then the system will start solving the things it was meant to.&lt;/p&gt;
&lt;p&gt;This is why I tend to start any systems project by running a so called &lt;em&gt;Challenges Workshop.&lt;/em&gt; This workshop is meant to reveal a lack of alignment and personal biases across teams. It has a tendency to show organizational challenges too, which is where the name comes from.&lt;/p&gt;
&lt;p&gt;To run this workshop, I use a similar model that Jonathan Courtney describes in his article called &lt;a href=&quot;https://medium.muz.li/a-super-simple-exercise-for-solving-almost-any-product-design-challenge-f9e6c0019d7d&quot;&gt;Lightning Decision Jam—solve problems without discussion&lt;/a&gt;. If you’re interested, you can &lt;a href=&quot;https://www.slideshare.net/ViljamiSalminen/design-system-challenges-exercise&quot;&gt;view the slides&lt;/a&gt; I use on SlideShare. The output of the workshop is a set of prioritized actions that directly inform the backlog of the design system.&lt;/p&gt;
&lt;p&gt;Keep in mind that while the format of this workshop is very strict, things don’t always go like planned and you need to be ready to go with the flow. People &lt;em&gt;will ask&lt;/em&gt; questions. There &lt;em&gt;will be&lt;/em&gt; unexpected breaks. The important person you expected won’t be able to join. But that’s all ok.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.slideshare.net/ViljamiSalminen/design-system-challenges-exercise&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/slides.jpg&quot; style=&quot;width:80%;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Challenges Exercise slidedeck. &lt;a href=&quot;https://www.slideshare.net/ViljamiSalminen/design-system-challenges-exercise&quot;&gt;View the deck&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;defining-principles&quot;&gt;Defining principles &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#defining-principles&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once you’ve figured out what the tough problems are that you’re trying to solve, the work should continue from the &lt;a href=&quot;https://principles.design/&quot;&gt;guiding principles&lt;/a&gt;. Maybe your company already has design principles in place, or maybe you can utilize some of your brand guidelines as the base here. Nevertheless, this is where the groundwork for the system is done.&lt;/p&gt;
&lt;p&gt;If you remember this diagram I shared earlier, it shows how everything in &lt;a href=&quot;https://vueds.com/&quot;&gt;Vue Design System&lt;/a&gt; is based on the underlying principles:&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/vueds.svg&quot; style=&quot;width:100%&quot; /&gt;
&lt;p&gt;The way I’ve done this in the past, is by running a few dedicated workshops which have helped us to create high level draft principles. After the workshops, I’ve assigned one person to iterate on the principles. At the same time we, as a team, have provided feedback and helped to edit the design principles further.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/workshop2.jpg&quot; style=&quot;width:80%;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Defining design principles at &lt;a href=&quot;http://www.nosto.com/&quot;&gt;Nosto&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;drafting-type%2C-color-%26-spacing&quot;&gt;Drafting type, color &amp;amp; spacing &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#drafting-type%2C-color-%26-spacing&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once your principles start shaping up and you’ve got a draft that you can share to stakeholders, it’s time to start planning the &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#tokens&quot;&gt;system’s tokens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One way to do this, is by creating a quick draft styleguide by one or a few designers. The point is not to make something final or to spend a lot of time this early. Instead, try to create something quick and simple that you can utilize in the next steps moving forward.&lt;/p&gt;
&lt;p&gt;I suggest you to try to capture any ideas about a new design direction as well, if any. Recently, I did a quick draft styleguide for one of my clients that looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/styleguide-v2.svg&quot; class=&quot;image-padding&quot; style=&quot;max-width:100%;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;&lt;a href=&quot;https://www.yhdistysavain.fi/&quot;&gt;Yhdistysavain’s&lt;/a&gt; draft styleguide.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;finding-unified-design-direction&quot;&gt;Finding unified design direction &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#finding-unified-design-direction&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At this point, I usually want to pull the whole design systems team together and clear their calendar. After we’ve agreed on the schedule, we focus on different products or product features to redesign utilizing the &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#principles&quot;&gt;principles&lt;/a&gt; and &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#tokens&quot;&gt;design tokens&lt;/a&gt; created.&lt;/p&gt;
&lt;p&gt;I call this the &lt;em&gt;Design System Kick-off Sprint.&lt;/em&gt; It’s important to involve stakeholders in review sessions once or twice a week during this sprint to get their approval and to keep them in the loop.&lt;/p&gt;
&lt;p&gt;Recently, I ran three 4 day long sprints with a client of mine where our schedule looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/schedule.png&quot; class=&quot;image-padding&quot; style=&quot;max-width:100%&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Design System Kick-off sprint schedule.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#principles&quot;&gt;principles&lt;/a&gt; and the &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#drafting-type-color-amp-spacing&quot;&gt;draft styleguide&lt;/a&gt; created during the first week guided our work into a unified direction while allowing room for exploration and discovery. At the end of each day we reviewed, discussed, and spent time examining how different patterns started to emerge.&lt;/p&gt;
&lt;p&gt;Finally, this initial sprint also allowed us to change our course multiple times where necessary. It made us immediately focus on the big picture like the full views and features, before we started defining our &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#tokens&quot;&gt;tokens&lt;/a&gt;, &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#elements&quot;&gt;elements&lt;/a&gt; and &lt;a href=&quot;https://arielsalminen.com/2018/vue-design-system/#patterns&quot;&gt;patterns&lt;/a&gt; more during the third and the fourth week.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/colors.jpg&quot; style=&quot;width:80%;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Defining color palette at &lt;a href=&quot;http://www.nosto.com/&quot;&gt;Nosto&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;defining-the-parts&quot;&gt;Defining the parts &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#defining-the-parts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s during these sprints, when I also start introducing people to &lt;a href=&quot;https://vueds.com/&quot;&gt;Vue Design System&lt;/a&gt; and teach them how to use &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; if they aren’t familiar with it. We learn how to version and document everything from the start and use GitHub’s tools to track the progress on the system.&lt;/p&gt;
&lt;p&gt;At the end of these sprints we’ll have a rough &lt;a href=&quot;https://vueds.com/example/&quot;&gt;living documen­tation&lt;/a&gt;. The documentation includes our &lt;a href=&quot;https://vueds.com/example/#!/Design%20Principles&quot;&gt;design principles&lt;/a&gt;, &lt;a href=&quot;https://vueds.com/example/#!/Design%20Tokens?id=fontsize&quot;&gt;type scale&lt;/a&gt;, &lt;a href=&quot;https://vueds.com/example/#!/Design%20Tokens?id=color&quot;&gt;color guidelines&lt;/a&gt; and &lt;a href=&quot;https://vueds.com/example/#!/Design%20Tokens?id=spacing&quot;&gt;spacing usage&lt;/a&gt; with additional &lt;a href=&quot;https://vueds.com/example/#!/Templates&quot;&gt;prototypes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vueds.com/example/&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2018/vue-design-system/vueds-2.0.0.png&quot; style=&quot;border: 1px solid #f1f1f1;width:80%;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Vue Design System’s &lt;a href=&quot;https://vueds.com/example/&quot;&gt;example styleguide&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the past, I’ve been fortunate to work with clients who have had designers to code up their ideas into real &lt;a href=&quot;https://vueds.com/example/#!/Templates&quot;&gt;living templates&lt;/a&gt; during these sprints, but it doesn’t have to work like that. My first recommendation is always to start with whatever tools you’re comfortable with to keep the initial pace fast.&lt;/p&gt;
&lt;p&gt;Often, the output from the very first sprints might be just a set of principles, design specs, and tokens organized in a visual document or a &lt;a href=&quot;https://www.google.com/sheets/about/&quot;&gt;Google Sheet&lt;/a&gt;. Other times, it might be a collection of components in a &lt;a href=&quot;https://www.sketchapp.com/&quot;&gt;Sketch document&lt;/a&gt;. And that’s completely fine.&lt;/p&gt;
&lt;h2 id=&quot;a-way-forward&quot;&gt;A Way Forward &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/vue-design-system/#a-way-forward&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We’ve now kicked-off the work and created a solid foundation to build upon. Now’s the time for your systems team to dive into using &lt;a href=&quot;https://vueds.com/&quot;&gt;Vue Design System&lt;/a&gt;, start using a more structured workflow, having weekly design system sessions, and focus on delivering the 1.0 version.&lt;/p&gt;
&lt;p&gt;Separate from this article, I have created &lt;a href=&quot;https://github.com/arielsalminen/vue-design-system/wiki&quot;&gt;comprehensive docs&lt;/a&gt; for the tool itself that are part of the &lt;a href=&quot;https://github.com/arielsalminen/vue-design-system&quot;&gt;GitHub repository&lt;/a&gt;. The docs shows you how to start building components and where the system’s pieces live. Some parts of it are under work, but I will be working on them to make sure that the docs cover most of the questions you might have, if not all.&lt;/p&gt;
&lt;p&gt;If you want, you can follow the progress on Vue Design System on &lt;a href=&quot;https://github.com/arielsalminen/vue-design-system&quot;&gt;GitHub&lt;/a&gt;. I’ve also created a &lt;a href=&quot;https://github.com/arielsalminen/vue-design-system/issues?q=is%3Aissue+is%3Aopen+label%3Aroadmap&quot;&gt;roadmap of features&lt;/a&gt; I’d like to bring in next and will be updating the feature set there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To learn more about Vue Design System and to see the full list of features, see the &lt;a href=&quot;https://vueds.com/&quot;&gt;new website&lt;/a&gt; and &lt;a href=&quot;https://github.com/arielsalminen/vue-design-system&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Workspace</title>
      <link href="https://arielsalminen.com/2018/workspace/"/>
      <updated>2018-02-19T00:00:00Z</updated>
      <id>https://arielsalminen.com/2018/workspace/</id>
      <content type="html">&lt;p&gt;I’m happy. I’ve been succesfully running &lt;a href=&quot;https://arielsalminen.com/&quot; rel=&quot;external&quot;&gt;my design studio&lt;/a&gt; for the past 8 months and recently moved into a new office space. Since then I’ve been setting up the workspace to suit the way I want to work and create things. This dedicated quiet space gives me the luxury to focus and get much more done than I could get anywhere else before.&lt;/p&gt;
&lt;p&gt;While I find myself constantly switching between different working modes like running a design systems workshop, working at client’s premises, or doing a remote meeting with a team in another city, I like having this personal space where I can come back to think and focus. A space for exploration and tinkering.&lt;/p&gt;
&lt;p&gt;My workspace is a part of a bigger office, but with a dedicated room and a door. This is what my setup currently looks like &lt;em&gt;(click for bigger photos):&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/2018/studio/workspace.jpg&quot;&gt;&lt;img width=&quot;1500&quot; height=&quot;965&quot; src=&quot;https://arielsalminen.com/img/blog/2018/studio/workspace-small.jpg&quot; style=&quot;max-width:80%;&quot; loading=&quot;lazy&quot; alt=&quot;My workspace&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Workspace with lots of wall to draw on&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A mini device lab sitting on my desk:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/2018/studio/devices.jpg&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/studio/devices-small.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Mini device lab&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A tiny design systems book library:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/2018/studio/books.jpg&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/studio/books-small.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Design Systems book library&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I also have dedicated set of things that I take with me to workshops. It includes post-its, stickers, sharpies, and a timer in a small toolbox:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/2018/studio/workshop.jpg&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/studio/workshop-small.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Post-its, stickers, sharpies, and a timer&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Finally, I’ve been getting more and more back to photography recently and made a switch to Sony A7R II some time back. Behind the lenses is &lt;a href=&quot;https://loupedeck.com/&quot; rel=&quot;external&quot;&gt;Loupedeck&lt;/a&gt; photo editing console:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/2018/studio/camera.jpg&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/2018/studio/camera-small.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Camera, lenses, and editing console&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There’re a few things I’d still like to do here:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Firstly, I’d like to switch back to an adjustable desk at some point so that I can work both sitting and standing.&lt;/p&gt;
&lt;p&gt;In addition, I’d like to bring here a lounge chair we have in our basement to help me get away from the computer when I run out of answers and need to think instead.&lt;/p&gt;
&lt;p&gt;I’ve been also considering bringing a part of my record collection and a turntable with some speakers here, but I might just end up getting a &lt;a href=&quot;https://www.apple.com/homepod/&quot; rel=&quot;external&quot;&gt;HomePod&lt;/a&gt;. &lt;em&gt;We’ll see.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you have any questions about the setup ping me on &lt;a href=&quot;https://bsky.app/profile/arielsalminen.com&quot; rel=&quot;external&quot;&gt;Bluesky&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;full-list&quot;&gt;Full list &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2018/workspace/#full-list&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.apple.com/macbook-pro/&quot;&gt;15&amp;quot; Macbook Pro&lt;/a&gt;, which is my main workhorse.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.lg.com/us/monitors/lg-27MD5KA-B-5k-uhd-led-monitor&quot;&gt;LG Ultrafine 5K&lt;/a&gt; screen for design work.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;10 year old &lt;a href=&quot;https://en.wikipedia.org/wiki/Apple_Cinema_Display&quot;&gt;24&amp;quot; Cinema Display&lt;/a&gt; that I use mostly for testing Webfont rendering on low res screens.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.vanamco.com/devicelab/&quot;&gt;Vanamco Device Lab&lt;/a&gt; mobile device test stand.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://loupedeck.com/&quot; rel=&quot;external&quot;&gt;Loupedeck&lt;/a&gt; photo editing console.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.dpreview.com/reviews/sony-alpha-7r-ii&quot; rel=&quot;external&quot;&gt;Sony A7R II&lt;/a&gt; camera with 25+85mm &lt;a href=&quot;https://www.zeiss.com/camera-lenses/us/photography/products/batis-lenses/batis-1885.html&quot;&gt;Zeiss Batis&lt;/a&gt; lenses.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.visualconcept.eu/&quot;&gt;Modulo modular whiteboards&lt;/a&gt; for sketching.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.vitra.com/en-fi/product/eames-plastic-chair&quot;&gt;Vitra Eames&lt;/a&gt; plastic chair.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.vitra.com/en-gr/living/product/details/toolbox&quot;&gt;Vitra Toolbox&lt;/a&gt; for workshop gears.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://houseind.com/store/decor&quot;&gt;Eames Prints&lt;/a&gt; on walls from House Industries.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.timetimer.com/&quot;&gt;Time Timer&lt;/a&gt; visual timer.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Design Principles of Nosto Design System</title>
      <link href="https://arielsalminen.com/2017/design-principles-of-nosto-design-system/"/>
      <updated>2017-11-12T00:00:00Z</updated>
      <id>https://arielsalminen.com/2017/design-principles-of-nosto-design-system/</id>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://www.nosto.com/&quot;&gt;Nosto&lt;/a&gt; hired me in 2017 to help reimagine what the company’s approach to designing and building digital products at scale should look like. I started this work by conducting a series of user research activities and workshops to reveal a lack of alignment and personal biases across business units, products and teams to understand how the design system could help them.&lt;/p&gt;
&lt;p&gt;When we had a clear view of the challenges that we wanted to solve, it was a matter of creating fundamental principles for the system that they could follow as a team. These are the draft design principles that I helped to bring together:&lt;/p&gt;
&lt;h2 id=&quot;1.-build-for-merchants&quot;&gt;1. Build for merchants &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-principles-of-nosto-design-system/#1.-build-for-merchants&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We put our merchants at the center of everything we do. Our success comes from their success and we focus on helping them serve their customers better. We aim to understand the challenges of different types of merchants and base our decisions on data and research whenever possible.&lt;/p&gt;
&lt;h2 id=&quot;2.-make-it-actionable&quot;&gt;2. Make it actionable &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-principles-of-nosto-design-system/#2.-make-it-actionable&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We build tools that empower retailers to work with complex things in an easy way. Our focus is on delivering value by helping our customers reach their objectives, and all our design decisions strive to make that possible.&lt;/p&gt;
&lt;h2 id=&quot;3.-aim-for-consistency&quot;&gt;3. Aim for consistency &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-principles-of-nosto-design-system/#3.-aim-for-consistency&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The experience of using Nosto should be cohesive, so we use consistent language, patterns, and components when building new things. We promote familiarity and approachability by investing in keeping things aligned.&lt;/p&gt;
&lt;h2 id=&quot;4.-design-with-purpose&quot;&gt;4. Design with purpose &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-principles-of-nosto-design-system/#4.-design-with-purpose&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our aim is to deliver an enjoyable experience to our merchants by making their lives easier and helping them succeed in their business. We believe that good design serves a purpose and we put in the effort in order to help our product teams move fast.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Work in Progress</title>
      <link href="https://arielsalminen.com/2017/work-in-progress/"/>
      <updated>2017-07-04T00:00:00Z</updated>
      <id>https://arielsalminen.com/2017/work-in-progress/</id>
      <content type="html">&lt;p&gt;March, 2017. We were still living in the United States. It was a time of great anxiety for us. Just a couple weeks earlier I had been laid off from my previous job in &lt;a href=&quot;https://www.instagram.com/p/BVx5cA9B1Q2/&quot;&gt;California&lt;/a&gt;, Donald Trump had become the president, and we were suddenly living in this foreign country without valid Visas and no plans for the future whatsoever.&lt;/p&gt;
&lt;p&gt;There we were, about to have a baby, not able to &lt;a href=&quot;https://www.instagram.com/p/BWDzzpHhKvm/&quot;&gt;fly back&lt;/a&gt; to Europe anymore and trying to figure out what’s going to happen next. The company I used to work for got sold and our previous Visas couldn’t be transferred, which basically got us here. Just a week before all this started, I remember discussing with my wife how I could see us growing old in this country.&lt;/p&gt;
&lt;p&gt;For a moment it felt like a bad dream in which we were fugitives living on enemy soil. In some ways, that dream felt real and vivid to us. I mean, it sounds frankly awkward when saying it out loud now, but back then so many things happened at once. I wasn’t even sure if it was legal for us to stay in the country after our Visas expired, so I tried to keep my mouth shut as well as I could. If anyone asked; &lt;em&gt;It was good. It was all going so good.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Later on, things started slowly unraveling as our second child, &lt;a href=&quot;https://www.instagram.com/p/BS7eU-fBSfK/&quot;&gt;Inga&lt;/a&gt;, was born in &lt;a href=&quot;https://www.instagram.com/p/BV2yOTPBl0O/&quot;&gt;Redwood City&lt;/a&gt;, California. During the next few weeks—and ultimately months—we managed to get all the necessary paperwork done to get the whole family back to Europe safely. We applied for new Visas, got the birth certificates for the baby, social security number for her, &lt;a href=&quot;https://www.instagram.com/p/BUAG0BAhMdW/&quot;&gt;US passport&lt;/a&gt;, and so on. It felt relieving. We were free to leave the country that once felt like a home to us.&lt;/p&gt;
&lt;p&gt;At the same time, in the middle of everything, I had this crazy idea to start up &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;my own design studio&lt;/a&gt; when we’re back in Europe. I had no savings, no clients, no real plans, nothing—heck, we didn’t even have &lt;a href=&quot;https://www.instagram.com/p/BVxZXQzhYtA/&quot;&gt;a home&lt;/a&gt; anymore—just this quirky feeling inside of me and a few suitcases full of clothes.&lt;/p&gt;
&lt;p&gt;But even then, I felt like I just had to do it. I didn’t want to go work for someone else. I wanted my freedom, and my wife kept on encouraging me to do it.&lt;/p&gt;
&lt;p&gt;As strange as it might sound, one of the forces that kept pushing me forward was how much dirt happened to us in such a short period of time. After all that, I kind of felt like nothing’s gonna stop us anymore.&lt;/p&gt;
&lt;p&gt;We’re gonna push forward with this feeling.&lt;br /&gt; Everything’s gonna work out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And it did.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This brings us back to the present day. We’re in &lt;a href=&quot;https://www.google.com/maps/place/Helsinki,+Finland/data=!4m2!3m1!1s0x46920bc796210691:0xcd4ebd843be2f763?sa=X&amp;amp;ved=0ahUKEwickvKt79fUAhUOzGMKHdN8AxoQ8gEIgAEwCw&quot;&gt;Helsinki&lt;/a&gt; now. We still don’t have a permanent home, but at least we’ve found one and can start planning the move next month. My &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;design studio&lt;/a&gt; is also up and running and I’ve found a bunch of great clients to work with. The next 5 months are more or less booked and I can’t wait to tell you about the projects I’m going to be working on.&lt;/p&gt;
&lt;p&gt;I’m still accepting smaller consulting gigs for the fall and longer engagements from November forward, so if you’re interested, see the &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;studio website&lt;/a&gt; and drop me a line via the &lt;a href=&quot;https://arielsalminen.com/contact/&quot;&gt;contact form&lt;/a&gt; or &lt;a href=&quot;mailto:info@arielsalminen.com&quot;&gt;email&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’m most interested in helping startups and larger organizations to design, build and manage their &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;Design Systems&lt;/a&gt;. During the past two years, I’ve been mainly working on large enterprise level systems and data visualization heavy projects with a few of the biggest Fortune 500 companies in San Francisco, CA.&lt;/p&gt;
&lt;p&gt;In addition, I’m also interested in longer term, &lt;a href=&quot;http://styleguides.io/&quot;&gt;Style Guide&lt;/a&gt; driven design projects for the web. Instead of mocking up all the different variations of a product as static images in a tool like &lt;a href=&quot;https://sketchapp.com/&quot;&gt;Sketch&lt;/a&gt;, I prefer to prototype these in the browser instead and go back and forth between design tools and code. You can &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;read more about my process&lt;/a&gt; from the studio’s website.&lt;/p&gt;
&lt;p&gt;If this sounds like something you might be interested in, &lt;a href=&quot;https://arielsalminen.com/contact/&quot;&gt;get in touch&lt;/a&gt; and we’ll work it from there. ✌️&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>On Design Tools and Processes</title>
      <link href="https://arielsalminen.com/2017/design-tools-processes/"/>
      <updated>2017-02-12T00:00:00Z</updated>
      <id>https://arielsalminen.com/2017/design-tools-processes/</id>
      <content type="html">&lt;p&gt;For the past year(s) I’ve been chasing for answers. Looking for new tools, thinking about &lt;a href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/&quot;&gt;design processes&lt;/a&gt; and figuring out what design really &lt;a href=&quot;https://arielsalminen.com/2015/the-many-faces-of-the-web/&quot;&gt;means to me&lt;/a&gt;. At times I’ve felt so disconnected with our pro­cesses that I’ve wondered if my career choice was right.&lt;/p&gt;
&lt;p&gt;For a field rooted in the fine arts this period of change has been increasingly hard and is about to get even harder. We’ve moved away from designing static pages to creating digital &lt;a href=&quot;https://arielsalminen.com/styleguide/&quot;&gt;systems of components&lt;/a&gt;, but we’ve done that mostly by using the same static design tools like &lt;a href=&quot;http://www.adobe.com/products/illustrator.html&quot;&gt;Illustrator&lt;/a&gt;, &lt;a href=&quot;https://www.sketchapp.com/&quot;&gt;Sketch&lt;/a&gt;, or even &lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt;. Tools that haven’t changed on a fundamental level in the past three decades.&lt;/p&gt;
&lt;p&gt;Now, I think there’s something wrong with that picture. Our design products are becoming more and more dynamic, but our tools still treat them as blank canvases to paint on. &lt;em&gt;Why?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/2017/design-tools-processes/&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2500&quot; height=&quot;1667&quot; src=&quot;https://arielsalminen.com/img/blog/design/transit.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;New York City Transit Manual&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;New York City Transit Manual. Image: &lt;a href=&quot;https://standardsmanual.com/products/nyctacompactedition&quot;&gt;Standards Manual&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-trip-down-memory-lane&quot;&gt;A Trip Down Memory Lane &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#a-trip-down-memory-lane&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To start unwrapping this, I want to first take you back in time, approxi­mately 30 years. &lt;em&gt;You ready…?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/IMG_2518.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Me, circa 1990 using Macintosh LC&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Imagine you’ve just landed in the 80s. 1986 to be exact. You’re sitting in front of a &lt;a href=&quot;https://en.wikipedia.org/wiki/Macintosh_128K&quot;&gt;Macintosh 128K&lt;/a&gt; with a black and white display. You’re about to start creating a market­ing booklet for one of your clients, so you go ahead and launch an app­lication called &lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_PageMaker&quot;&gt;Aldus PageMaker&lt;/a&gt;. You know it’s going to be printed in &lt;a href=&quot;https://en.wikipedia.org/wiki/ISO_216&quot;&gt;A4&lt;/a&gt;, so you choose that as the page size.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/pce-mac-pagemaker42.png&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Aldus Pagemaker running on Mac OS&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Two years later, in 1988, you’ve upgraded your design tool of choice to the latest industry standard, &lt;a href=&quot;https://en.wikipedia.org/wiki/QuarkXPress&quot;&gt;QuarkXPress 1.0&lt;/a&gt;. It’s fundamen­tally more or less the same as the previous application you got used to, but you like Quark’s modern sleek toolkit.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/quark.png&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;QuarkXPress running on Mac OS&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Fast forward 10 years, it’s 1998. You’re using &lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_PageMaker&quot;&gt;Pagemaker 6.0&lt;/a&gt;. Your medium is print. It all makes so much sense.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/pagemaker.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Pagemaker 6.0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As your career path moves more and more towards web design, things are starting to get hairy. You start experimenting with various tools like &lt;a href=&quot;https://en.wikipedia.org/wiki/CorelDRAW&quot;&gt;CorelDraw&lt;/a&gt;…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/corel.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;…&lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_FreeHand&quot;&gt;Freehand&lt;/a&gt;…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/freehand.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;…&lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_Fireworks&quot;&gt;Fireworks&lt;/a&gt;…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/fireworks.gif&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;…&lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_Illustrator&quot;&gt;Illustrator&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_Photoshop&quot;&gt;Photoshop&lt;/a&gt;…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/illustrator.png&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;…&lt;a href=&quot;https://www.sketchapp.com/&quot;&gt;Sketch&lt;/a&gt;…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/sketch.png&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;…and even &lt;a href=&quot;http://figma.com/&quot;&gt;Figma&lt;/a&gt;.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/figma.png&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;But there’s this thought in the back of your head which makes you feel like you’ve been here before. All these years, all this time, and no progress at all, &lt;em&gt;huh?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Your design tools still fundamentally work the same way as they did three decades ago. Either a fixed canvas and the concept of a page is forced by the tool, or the tool forces you into such mental mode.&lt;/p&gt;
&lt;h2 id=&quot;99-problems%2C-but-a-tool-ain%E2%80%99t-one&quot;&gt;99 Problems, But A Tool Ain’t One? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#99-problems%2C-but-a-tool-ain%E2%80%99t-one&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s continue our exercise a little longer and imagine launching one of the more recent tools I shared. What’s the first thing you do? ------ Well, if you’re at all like me, you either choose your artboard size or draw an empty box to place your content in.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/box.svg&quot; style=&quot;max-width:95%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Empty box&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As you continue, you might draw some more boxes.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/wireframe.svg&quot; style=&quot;max-width:95%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;More empty boxes&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Eventually, you probably replace or fill these boxes with something more “meaningful.”&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/wireframe2.svg&quot; style=&quot;max-width:95%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;More meaningful boxes&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ok, that’s enough, you probably get my point by now.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;houston%2C-we&#39;ve-got-a-problem&quot;&gt;Houston, We&#39;ve Got a Problem &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#houston%2C-we&#39;ve-got-a-problem&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Firstly, the web doesn’t have a fixed canvas, but for some odd reason we keep on using tools and processes that force us into thinking about these &lt;em&gt;fixed containers&lt;/em&gt; around our designs.&lt;/p&gt;
&lt;p&gt;The control which designers know in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Printing&quot;&gt;print medium&lt;/a&gt; is simply a limi­ta­tion of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Printing&quot;&gt;printed page&lt;/a&gt;. We should embrace the fact that the web doesn’t have these same constraints.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://opensignal.com/reports/fragmentation.php&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/screen-size.png&quot; style=&quot;max-width:90%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Android screen size fragmentation in 2012. Image: &lt;a href=&quot;https://opensignal.com/reports/fragmentation.php&quot;&gt;OpenSignal&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Secondly, our tools falsely enforce the page metaphor even though we aren’t actually designing pages. Our canvas is infinite, but the tools we use force us into thinking about pages instead of &lt;a href=&quot;http://bradfrost.com/blog/post/atomic-web-design/&quot;&gt;systems of compo­nents&lt;/a&gt; or &lt;a href=&quot;http://frankchimero.com/writing/the-webs-grain/&quot;&gt;materials to build with&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/infinite-canvas.svg&quot; style=&quot;max-width:70%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Our canvas is infinite&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Thirdly, our tools encourage form over content. It should be the other way around. Our decisions should start from the &lt;a href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/&quot;&gt;content out&lt;/a&gt;, not canvas in. Design in the absence of content is not design, it’s decora­tion like Jeffrey Zeldman &lt;a href=&quot;http://www.zeldman.com/2008/05/06/content-precedes-design/&quot;&gt;once wrote&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/wireframe.svg&quot; style=&quot;max-width:95%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Form over content&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Finally, our tools completely discourage systematic thinking. They make it hard to pay attention on how different parts of a system influ­ence one another within a whole.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://lightningdesignsystem.com/&quot;&gt;&lt;img src=&quot;https://arielsalminen.com/img/blog/design/salesforce.png&quot; style=&quot;border:1px solid #eee;max-width:75%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;SalesForce Lightning Design System&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;past-reveals-the-future&quot;&gt;Past Reveals The Future &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#past-reveals-the-future&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For a field rooted in the fine arts, this makes sense. Graphic design provided us a history &lt;a href=&quot;https://en.wikipedia.org/wiki/History_of_graphic_design&quot;&gt;spanning for centuries&lt;/a&gt;, so it’s natural that we borrowed our vocab­u­lary and concepts like canvas and page from it. But when a new medium borrows from an existing one, some of it makes sense, but a lot generally doesn’t.&lt;/p&gt;
&lt;p&gt;When John Allsopp wrote &lt;a href=&quot;http://alistapart.com/article/dao&quot;&gt;The Dao of Web Design&lt;/a&gt; in 2000, I’m not sure he knew how relevant the article would be almost two decades after it was written. Even with the introduction of &lt;a href=&quot;http://alistapart.com/article/responsive-web-design&quot;&gt;responsive design&lt;/a&gt; and new &lt;a href=&quot;https://arielsalminen.com/styleguide/&quot;&gt;component based workflows&lt;/a&gt;, I feel like we’re still repeating the same mistakes.&lt;/p&gt;
&lt;p&gt;In 1928, a German writer called &lt;a href=&quot;https://en.wikipedia.org/wiki/Walter_Benjamin&quot;&gt;Walter Benjamin&lt;/a&gt; predicted that writers would soon start to compose their work with a typewriter, instead of a pen. He wrote something along the lines:&lt;/p&gt;
&lt;blockquote&gt;“By writing directly into a mechanical form rather than a manuscript, the writer would be working closer to the nature of the multiplied result, and through an increased awareness and gradual mastery of the form’s new limi&amp;shy;ta&amp;shy;tions and possibilities the writing itself would evolve.”&lt;br /&gt;&lt;br /&gt;— Walter Benjamin&lt;/blockquote&gt;
&lt;p&gt;I find Walter’s century-old thinking fascinating. I feel like it’s close to what we should be doing on the web today as well. By working closer to the nature of the result our work itself evolves. We become more aware of the unknowns and how different parts of a system influ­ence one another.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/design/walter_benjamin.jpg&quot; style=&quot;max-width:80%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Walter Benjamin. Image: &lt;a href=&quot;http://theamericanreader.com/the-name-of-the-critic-on-walter-benjamin-a-critical-life/&quot;&gt;The American Reader&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Walter’s thoughts on increased awareness take me back to the original questions I presented at the &lt;a href=&quot;https://arielsalminen.com/2017/design-tools-processes/&quot;&gt;beginning of this article&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;“What design really means to me? &lt;br /&gt;What kind of tools and processes will we use in the&amp;nbsp;future?”&lt;/blockquote&gt;
&lt;p&gt;Turns out the answer to both of these questions has been in front of me all this time, but I’ve tried too hard to convince myself that I should be using &lt;em&gt;design tools&lt;/em&gt; to do design. Even when they actually seem to be limiting my capabilities as a designer.&lt;/p&gt;
&lt;h2 id=&quot;contemporary-design-process&quot;&gt;Contemporary Design Process &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#contemporary-design-process&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Changing our ways of thinking and doing isn’t easy. Sometimes it’s necessary though, and the first step on this journey is to let go. Let go of our imagi­nary feel of control. Forget the boundaries presented by our tools and ways of thinking. Break out of the &lt;a href=&quot;https://louderthanten.com/coax/design-machines&quot;&gt;silos we’ve created&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As our design products are becoming more dynamic, it makes less and less sense to separate the design and the development disciplines. Instead of working in silos, I foresee a future where the terms &lt;em&gt;designer&lt;/em&gt; and &lt;em&gt;developer&lt;/em&gt; are inter­change­able. A future where we are comfortable &lt;a href=&quot;http://alistapart.com/article/sketchingincode&quot;&gt;sketching our ideas in code&lt;/a&gt; or working closely with developers to achieve that.&lt;/p&gt;
&lt;p&gt;Design is not just what it looks like and feels like. Design is &lt;a href=&quot;https://ia.net/know-how/design-is-how-it-works&quot;&gt;how it works&lt;/a&gt; and sketching in code enables us to focus on that. Moving quicker to code helps us to put content over form, embrace the fluid nature of the web, and focus on systems of components instead of pages. It also helps us to find user experience issues that previously only became visible once the implementation started.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://arielsalminen.com/designing-design/img/react-sketch1.jpg&quot; style=&quot;border:1px solid #eee;max-width:75%;&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;AirBnB’s &lt;a href=&quot;https://www.npmjs.com/package/react-sketchapp&quot;&gt;React renderer&lt;/a&gt; for Sketch App that treats Sketch as a pure render function and keeps their code based design system the source of truth. Image: &lt;a href=&quot;https://twitter.com/jongold/status/807419484709351424&quot;&gt;Jon Gold&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This transition doesn’t have to be all or nothing, though. We can start taking baby steps towards better workflows today. Instead of for example trying to mockup all the different variations as static images in &lt;a href=&quot;https://www.sketchapp.com/&quot;&gt;Sketch&lt;/a&gt;, we should probably prototype more complex features in the browser. That proto­type can eventually be turned into a simple code based design system that outputs infinite variations for us.&lt;/p&gt;
&lt;p&gt;When moving further, we should also introduce new processes and start utilizing tools such as &lt;a href=&quot;http://styleguides.io/&quot;&gt;style guides&lt;/a&gt;, &lt;a href=&quot;http://styleguides.io/examples.html&quot;&gt;pattern libraries&lt;/a&gt;, and &lt;a href=&quot;https://www.lightningdesignsystem.com/&quot;&gt;modular code based designs systems&lt;/a&gt; that encourage conversation and collabo­ration not only by developers, but by designers and shareholders as well. This will eventually help each discipline to better understand the full breadth of our work from many perspectives.&lt;/p&gt;
&lt;p&gt;In 10 years, I imagine us looking back at the period we live in right now with the same sense of disbelief that some of us remember &lt;a href=&quot;https://stuffandnonsense.co.uk/blog/about/walls_come_tumbling_down_presentation_slides_and_transcript/&quot;&gt;from the past&lt;/a&gt;. History has a tendency to repeat itself, and we need to stop repeating the same mistakes over and over.&lt;/p&gt;
&lt;h2 id=&quot;let%E2%80%99s-get-rid-of&quot;&gt;Let’s get rid of &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#let%E2%80%99s-get-rid-of&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;Fixed canvas thinking&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;The page metaphor&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;Form over content&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;Tools that discourage systematic thinking&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;Designers and developers working separately&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;Designers working only on static mockups&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;strike&gt;Showing clients static comps and asking for sign-off&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;references-and-links&quot;&gt;References And Links &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2017/design-tools-processes/#references-and-links&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;sup id=&quot;cite1&quot; class=&quot;indent&quot;&gt;[1]&lt;/sup&gt; First and foremost, I want to thank &lt;em&gt;Frank Chimero&lt;/em&gt; for his talk called &lt;a href=&quot;http://frankchimero.com/writing/the-webs-grain/&quot; rel=&quot;external&quot;&gt;The Web’s Grain&lt;/a&gt;. It’s an amazing resource and gave me the idea for the box and canvas illustrations.&lt;/p&gt;
&lt;p&gt;&lt;sup id=&quot;cite1&quot; class=&quot;indent&quot;&gt;[2]&lt;/sup&gt; Secondly, I want to thank &lt;em&gt;Rune Madsen&lt;/em&gt; for his article titled &lt;a href=&quot;https://runemadsen.com/blog/on-meta-design-and-algorithmic-design-systems/&quot; rel=&quot;external&quot;&gt;On Meta-Design and Algorithmic Design Systems&lt;/a&gt;. It has been a tremendous source of inspiration for me over the past couple of years.&lt;/p&gt;
&lt;p&gt;&lt;sup id=&quot;cite1&quot; class=&quot;indent&quot;&gt;[3]&lt;/sup&gt; Finally, thanks to &lt;em&gt;Jon Gold&lt;/em&gt; for his exploration on &lt;a href=&quot;http://www.jon.gold/2016/06/declarative-design-tools/&quot;&gt;Declarative Design Tools&lt;/a&gt;. It gave me the enthusiasm to write this article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More resources and further reading in random order:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://runemadsen.com/blog/on-meta-design-and-algorithmic-design-systems/&quot;&gt;On Meta-Design and Algorithmic Design Systems&lt;/a&gt; by Rune Madsen&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://frankchimero.com/writing/the-webs-grain/&quot;&gt;The Web’s Grain&lt;/a&gt; by Frank Chimero&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://cognitivemedium.com/tat/index.html&quot;&gt;Thought as a Technology&lt;/a&gt; by Michael Nielsen&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://alistapart.com/article/dao&quot;&gt;A Dao of Web Design&lt;/a&gt; by John Allsopp&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://atomicdesign.bradfrost.com/chapter-1/&quot;&gt;Create Design Systems, Not Pages&lt;/a&gt; by Brad Frost&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://louderthanten.com/coax/design-machines&quot;&gt;Design Machines&lt;/a&gt; by Travis Gertz&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://programmingdesignsystems.com/&quot;&gt;Programming Design Systems&lt;/a&gt; by Rune Madsen&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://stuffandnonsense.co.uk/blog/about/walls_come_tumbling_down_presentation_slides_and_transcript/&quot;&gt;Walls Come Tumbling Down&lt;/a&gt; by Andy Clarke&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://ia.net/know-how/design-is-how-it-works&quot;&gt;Design is How it Works&lt;/a&gt; by iA&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.jon.gold/2016/05/robot-design-school/&quot;&gt;Taking The Robots To Design School&lt;/a&gt; by Jon Gold&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.jon.gold/2016/06/declarative-design-tools/&quot;&gt;Declarative Design Tools&lt;/a&gt; by Jon Gold&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://robinrendle.com/essays/a-visual-lexicon/&quot;&gt;A Visual Lexicon&lt;/a&gt; by Robin Rendle&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>The Future of Web Fonts</title>
      <link href="https://arielsalminen.com/2016/the-future-of-web-fonts/"/>
      <updated>2016-10-09T00:00:00Z</updated>
      <id>https://arielsalminen.com/2016/the-future-of-web-fonts/</id>
      <content type="html">&lt;p&gt;We love typefaces. They give our sites and applications personalized feel. They convey the information and tell a story. They establish information hierarchy. But they’re also full of problems. Type­faces make our websites &lt;a href=&quot;https://www.zachleat.com/web/comprehensive-webfonts/&quot;&gt;slow&lt;/a&gt;. They produce &lt;a href=&quot;https://css-tricks.com/fout-foit-foft/&quot;&gt;&lt;span class=&quot;small-caps&quot;&gt;FOUT&lt;/span&gt;&lt;/a&gt; — or &lt;a href=&quot;https://css-tricks.com/fout-foit-foft/&quot;&gt;&lt;span class=&quot;small-caps&quot;&gt;FOIT&lt;/span&gt;&lt;/a&gt; if you prefer. They render in unpre­dictable ways. Why should we live with inflexible type that doesn’t scale, when the core nature of our medium is fluid and responsive?&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;small-caps&quot;&gt;TLDR&lt;/span&gt;; We don’t have to. Three weeks ago, &lt;a href=&quot;http://www.apple.com/&quot;&gt;Apple&lt;/a&gt;, &lt;a href=&quot;https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;https://www.microsoft.com/en-us/Typography/&quot;&gt;Microsoft&lt;/a&gt; and &lt;a href=&quot;http://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/&quot;&gt;Adobe&lt;/a&gt; introduced a new font format called &lt;strong&gt;Variable Fonts&lt;/strong&gt;. In a gist, Variable Fonts provide the flexibility of multiple fonts in a single file that can adapt fluidly to any type of screen or device. One font, near infinite variations.&lt;/p&gt;
&lt;p&gt;When using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Web_fonts&quot;&gt;web fonts&lt;/a&gt; today, you have to load separate font files for each style and weight, resulting in long download times and &lt;span class=&quot;small-caps&quot;&gt;FOUT&lt;/span&gt;/&lt;span class=&quot;small-caps&quot;&gt;FOIT&lt;/span&gt;. With Variable Fonts, we can request just one highly optimized file including all the weights and styles of a typeface. This is a tremen­dous shift that I see leading to richer, more responsive typographic experiences and vastly expanding the possibilities for web typography.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/webfonts/peace-type.gif&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;424&quot; src=&quot;https://arielsalminen.com/img/blog/webfonts/peace-type-noanim.png&quot; alt=&quot;Variable Fonts&quot; style=&quot;width:70%&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;http://letterror.com/dev/mathshapes/&quot;&gt;Erik van Blokland&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.typography.com/fonts/chronicle-text/features/&quot;&gt;concept of grades&lt;/a&gt; also becomes closer to reality. Having grades with separate font files always seemed a bit impractical, but with Variable Fonts things will change. With the new format we can start doing typographic fine adjust­ments based on not just the screen size and density, but also on the text rasterizer and anti­aliasing &lt;a href=&quot;http://typerendering.com/&quot;&gt;engine being used&lt;/a&gt; — all while not having to worry about the page weight.&lt;/p&gt;
&lt;p&gt;Imagine also tailoring the width and height of your font’s characters for better readability across different screens. Imagine making your font’s x-height just a tad bigger at small sizes for greater legibility.&lt;/p&gt;
&lt;p&gt;All this and much more will be possible soon.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/webfonts/otvo_fig2.png&quot; style=&quot;max-width:90%&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://www.microsoft.com/typography/otspec180/otvaroverview.htm&quot;&gt;Microsoft&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Recently, &lt;a href=&quot;https://www.w3.org/Style/CSS/members.en.php3&quot;&gt;CSS Working Group&lt;/a&gt; added the first draft of the Variable Fonts Spec­ification to &lt;a href=&quot;https://drafts.csswg.org/css-fonts-4/&quot;&gt;CSS Fonts Level 4 spec&lt;/a&gt;. See below what the usage currently looks like. If you have improve­ment ideas, I encour­age you to create a &lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues&quot;&gt;GitHub issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/webfonts/otvo_fig6.png&quot; style=&quot;max-width:40%&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Point positions for a non-default instance, image credit: &lt;a href=&quot;https://www.microsoft.com/typography/otspec180/otvaroverview.htm&quot;&gt;Microsoft&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;WebKit has also started imple­ment­ing the new &lt;a href=&quot;https://www.microsoft.com/en-us/Typography/OpenTypeSpecification.aspx&quot;&gt;OpenType 1.8&lt;/a&gt; Specification that Variable Fonts are part of, and you can see the progress in the latest &lt;a href=&quot;https://webkit.org/downloads/&quot;&gt;Safari nightly build&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/litherum&quot;&gt;@litherum&lt;/a&gt; has even put together a &lt;a href=&quot;http://litherum.blogspot.com/2016/09/variation-fonts-demo.html&quot;&gt;demo&lt;/a&gt; showing Variable Fonts in action.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/webfonts/variation.gif&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/webfonts/variation.png&quot; alt=&quot;Variable Fonts&quot; style=&quot;width: 70%&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;desc&quot;&gt;Animated example by &lt;a href=&quot;http://litherum.blogspot.com/2016/09/variation-fonts-demo.html&quot;&gt;@litherium&lt;/a&gt;. The bug with glyph advances &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=163093&quot;&gt;has been fixed&lt;/a&gt;, but the fix hasn’t yet landed WebKit Nightly, thus you see the glyphs overlapping.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;usage-examples&quot;&gt;Usage Examples &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/the-future-of-web-fonts/#usage-examples&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Semibold weight:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 632&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  The Quick Brown Fox&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Semicondensed weight:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-stretch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 83.7%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  The Quick Brown Fox&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Using the “ital” axis:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; italic&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  The Quick Brown Fox&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Animating weight and width axes:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; zoom&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token selector&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;font-variation-settings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wght&quot;&lt;/span&gt; 400&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wdth&quot;&lt;/span&gt; 85 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token selector&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;font-variation-settings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wght&quot;&lt;/span&gt; 800&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wdth&quot;&lt;/span&gt; 105 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;animation-duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3s&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;animation-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; zoom&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  The Quick Brown Fox&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Variable Font as a web font:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;VariableFont&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;VariableFont.otf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;VariableFont&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  The Quick Brown Fox&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The future of digital typography looks intrigu­ing. It’s not all figured out yet, but I’m excited to see where this journey leads us.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further Reading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/the-future-of-web-fonts/#further-reading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369#.74d2759la&quot;&gt;Introducing OpenType Variable Fonts&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.microsoft.com/typography/otspec/otvaroverview.htm&quot;&gt;OpenType Font Variations overview&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://alistapart.com/blog/post/variable-fonts-for-responsive-design&quot;&gt;Variable Fonts for responsive design&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/&quot;&gt;Variable Fonts, a new kind of font for flexible design&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://typedrawers.com/discussion/1763/otvar-introducing-opentype-variable-fonts&quot;&gt;A single font that behaves like multiple fonts&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/Typography/FontVariationsAnnouncement.aspx&quot;&gt;Introducing OpenType Font Variations&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://alistapart.com/column/font-hinting-and-the-future-of-responsive-typography&quot;&gt;Font hinting and the future of responsive typography&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://medium.com/@jpamental/variable-fonts-the-future-of-web-design-e45386b82c6a#.wx8dij6dw&quot;&gt;Variable fonts &amp;amp; the future of web design&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://drafts.csswg.org/css-fonts-4/&quot;&gt;CSS Fonts Level 4 spec&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://litherum.blogspot.com/2016/09/variation-fonts-demo.html&quot;&gt;Variable Fonts demo&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://stuff.djr.com/variable-demo/&quot;&gt;Variable Interpolating Pixel Font demo&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Typography for User Interfaces</title>
      <link href="https://arielsalminen.com/2016/typography-for-user-interfaces/"/>
      <updated>2016-06-21T00:00:00Z</updated>
      <id>https://arielsalminen.com/2016/typography-for-user-interfaces/</id>
      <content type="html">&lt;p&gt;Back in 2004, when I had just started my career, &lt;a href=&quot;http://mikeindustries.com/blog/archive/2004/08/sifr&quot;&gt;sIFR&lt;/a&gt; was the hottest thing out there. It was developed by &lt;a href=&quot;http://shauninman.com/pendium/&quot;&gt;Shaun Inman&lt;/a&gt; and it embedded custom fonts in a small Flash movie, which could be utilized with a little bit of JavaScript and CSS. At the time, it was basically the only way to use custom fonts in browsers like &lt;a href=&quot;https://www.mozilla.org/en-US/firefox/new/&quot;&gt;Firefox&lt;/a&gt; or &lt;a href=&quot;http://www.apple.com/safari/&quot;&gt;Safari&lt;/a&gt;. The fact that this technique relied on Flash soon made it obsolete though, with the release of the iPhone in 2007.&lt;/p&gt;
&lt;p&gt;In 2008, browsers started eventually supporting the new CSS3 &lt;a href=&quot;https://www.w3.org/TR/css-fonts-3/&quot;&gt;@font-face rule&lt;/a&gt;. It had already been a part of the CSS spec in 1998, but later got pulled out of it. I remember the excitement when I managed to convince one of my clients to utilize the new &lt;code&gt;@font-face&lt;/code&gt; and rely on &lt;a href=&quot;https://en.wikipedia.org/wiki/Progressive_enhancement&quot;&gt;progressive enhance­ment&lt;/a&gt; to deliver an enhanced experience for browsers which already supported this feature.&lt;/p&gt;
&lt;p&gt;Since my early days in the industry, I’ve grown to love type and all the little nuances that go into setting it. In this article, I want to share some of the fundamentals that I’ve learned, and hopefully help you get better at setting type for user interfaces.&lt;/p&gt;
&lt;blockquote&gt;
  “Our interfaces are written, text being the interface, and typography being our main discipline.”
  &lt;br /&gt;&lt;br /&gt;
  — Ariel Salminen
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-first-guis&quot;&gt;The first GUIs &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#the-first-guis&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While the history of typography dates back about &lt;a href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/&quot;&gt;five thousand years&lt;/a&gt;, we’ve had graphical user interfaces for mere four decades. One of the key turning points was in 1973, when &lt;a href=&quot;https://en.wikipedia.org/wiki/Xerox&quot;&gt;Xerox&lt;/a&gt; introduced &lt;a href=&quot;https://en.wikipedia.org/wiki/Xerox_Alto&quot;&gt;Alto&lt;/a&gt;, which in essence created the foundation for today’s graphical UIs. &lt;em&gt;Alto&lt;/em&gt; was born a decade before any other GUI hit the mass market, and was seen as the future of computing.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/alto.png&quot; width=&quot;1000&quot; height=&quot;1079&quot; class=&quot;image-padding&quot; alt=&quot;Alto&quot; /&gt;
&lt;p&gt;This early development for &lt;em&gt;Alto&lt;/em&gt; evolved to &lt;a href=&quot;https://en.wikipedia.org/wiki/Xerox_Star&quot;&gt;Xerox Star&lt;/a&gt; in the 80s and became the first commercial operating system with GUI.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/star.png&quot; width=&quot;1426&quot; height=&quot;1042&quot; class=&quot;image-padding&quot; alt=&quot;Xerox Star&quot; /&gt;
&lt;p&gt;Although neither &lt;em&gt;Alto&lt;/em&gt; nor &lt;em&gt;Star&lt;/em&gt; never really took off the ground, they greatly influenced the future development at Apple and Microsoft with their revolutionary mouse-driven GUI. A couple years later, in 1984, &lt;a href=&quot;https://en.wikipedia.org/wiki/Steve_Jobs&quot;&gt;Steve Jobs&lt;/a&gt; introduced the first &lt;a href=&quot;https://www.youtube.com/watch?v=VtvjbmoDx-I&quot;&gt;Mac OS&lt;/a&gt;.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/desktop-1.png&quot; width=&quot;1170&quot; height=&quot;782&quot; class=&quot;image-padding&quot; alt=&quot;Macintosh&quot; /&gt;
&lt;p&gt;The release of the Macintosh meant custom typography suddenly becoming available to the masses for the first time ever. The &lt;a href=&quot;https://en.wikipedia.org/wiki/Macintosh_128K&quot;&gt;original Mac&lt;/a&gt; came pre-installed with many &lt;a href=&quot;https://en.wikipedia.org/wiki/Fonts_on_Macintosh&quot;&gt;iconic typefaces&lt;/a&gt;, and over the next few years, multiple type foundries started releasing more and more digital versions of their popular typefaces.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/img013.gif&quot; width=&quot;470&quot; height=&quot;318&quot; class=&quot;image-padding&quot; alt=&quot;Menu&quot; /&gt;
&lt;p&gt;When inspecting these early graphical user interfaces closer, we realize that most of their elements are written language. These GUIs are essentially pure text — collections of singular words displayed in isolation from one another.&lt;/p&gt;
&lt;p&gt;We can make a similar observation by inspecting almost any modern interface too. Our interfaces are written, text being the interface, and typography being our main discipline.&lt;/p&gt;
&lt;h2 id=&quot;text-is-interface&quot;&gt;Text is interface &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#text-is-interface&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every word and letter in an interface matters. Good writing is good design. Text is ultimately &lt;a href=&quot;http://thomasbyttebier.be/blog/the-best-ui-typeface-goes-unnoticed&quot;&gt;interface&lt;/a&gt;, and it’s us, the designers, who are the copywriters shaping this information.&lt;/p&gt;
&lt;p&gt;Take a look at the example below and imagine the elements taken apart and put down on a table in front of you. Observe what’s left. A collection of singular words, two images and few icons.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/ios.jpg&quot; style=&quot;max-width:70%&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;Our work is not about putting random things on screen and making them look pretty, but instead starting from the most important parts, &lt;a href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/&quot;&gt;the copy and the content&lt;/a&gt;, and figuring other details up from there. That’s where the core of our craft lies.&lt;/p&gt;
&lt;p&gt;The clarity of letterforms plays a key role too. It might not seem to matter much at first, especially if our brain needs to pause only for a fraction of a second to decipher a word shape. But when we multiply this across numerous instances and letter combinations, our typographic choices become much more apparent.&lt;/p&gt;
&lt;p&gt;Of course, there are more nuances to interface design; things like balance, positioning, hierarchy and structure, but good copywriting and typography &lt;a href=&quot;https://ia.net/know-how/the-web-is-all-about-typography-period&quot;&gt;takes us 95% there&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;“A great designer knows how to work with text not just as content, he&amp;nbsp;treats text as a&amp;nbsp;user interface.”
&lt;br /&gt;&lt;br /&gt;
– Oliver Reichenstein
&lt;/blockquote&gt;
&lt;h2 id=&quot;how-we-read&quot;&gt;How we read &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#how-we-read&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If the letters that we put on screens are so important, then we should spend some time studying how we read and how that affects our design decisions.&lt;/p&gt;
&lt;p&gt;One of the key findings that I had back when I was reading &lt;em&gt;Billy Whited’s&lt;/em&gt; article on &lt;a href=&quot;http://blog.typekit.com/2013/03/28/setting-type-for-user-interfaces/&quot;&gt;Setting Type for User Interfaces&lt;/a&gt;, is that the efficiency with which we read is a function of the amount of text available to us as we do so. This means that an isolated word that has fewer than 20 characters will be read more slowly than a word that forms a part of a longer sentence.&lt;/p&gt;
&lt;p&gt;This results from the fact that our eyes don’t move smoothly across the text when we read longer sentences. Instead, they make discrete jumps between words, which are called &lt;a href=&quot;https://en.wikipedia.org/wiki/Saccade&quot;&gt;saccades&lt;/a&gt;.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/saccades.svg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;Saccades improve our reading capabilities and make it possible for us to skip shorter functional words completely. This is a key factor to keep in mind since our interfaces tend to have mostly isolated words. In essence, it means that we cannot rely on the effects of saccades at all.&lt;/p&gt;
&lt;p&gt;Eventually, &lt;a href=&quot;http://researchonline.rca.ac.uk/957/1/Sofie_Beier_Typeface_Legibility_2009.pdf&quot;&gt;knowing&lt;/a&gt; that the identification of individual letters plays the most critical part in the reading process, it’s becoming apparent why our choice of typeface is extremely important.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/bouma.svg&quot; class=&quot;image-padding&quot; style=&quot;max-width:70%&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;In the past, many thought we recognize words by their so called &lt;a href=&quot;https://en.wikipedia.org/wiki/Bouma&quot;&gt;Bouma shape&lt;/a&gt;, or the outline that a word creates. &lt;a href=&quot;http://blog.typekit.com/2013/03/28/setting-type-for-user-interfaces/&quot;&gt;In&lt;/a&gt; &lt;a href=&quot;http://www.microsoft.com/typography/ctfonts/wordrecognition.aspx&quot;&gt;later&lt;/a&gt; &lt;a href=&quot;https://typography.guru/journal/how-do-we-read-words-and-how-should-we-set-them-r19/&quot;&gt;studies&lt;/a&gt; &lt;a href=&quot;http://researchonline.rca.ac.uk/957/1/Sofie_Beier_Typeface_Legibility_2009.pdf&quot;&gt;this&lt;/a&gt; was proven to be somewhat wrong, and the readability and legibility of a given typeface should not be anymore evaluated only by its ability to generate a good bouma shape. Instead, we need to pay more attention to the letterforms themselves.&lt;/p&gt;
&lt;h2 id=&quot;what-makes-letters-legible&quot;&gt;What makes letters legible? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#what-makes-letters-legible&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At first, it might seem hard or just plain impossible to answer this question. Since reading is a matter of habit, we read best, what we read most. How could we possibly determine what features make letters legible? To start gaining an understanding, we need to first break sentences into words, words into letters, and letters into smaller parts and start looking the finer details.&lt;/p&gt;
&lt;p&gt;In 2008, Department of Psychology at the &lt;a href=&quot;http://www.uvic.ca/&quot;&gt;University of Victoria&lt;/a&gt; did &lt;a href=&quot;https://typekit.files.wordpress.com/2013/03/fiset_psychscience_2008.pdf&quot;&gt;empirical tests&lt;/a&gt; to reveal which areas of lowercase and uppercase Latin letters are most efficient for reading.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/legibilty3.jpg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;The study revealed ​a few interesting things. First of all, it revealed that line terminations are the most important features for letter identification.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/legibility5.jpg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;The image above shows which areas we pay most attention to when recognizing letters. These areas of a typeface should be designed both in a generic and familiar way and also in a way that stresses letter differentiation.&lt;/p&gt;
&lt;p&gt;In 2010, there was also &lt;a href=&quot;http://www.ingentaconnect.com/content/jbp/idj/2010/00000018/00000002/art00004&quot;&gt;another study&lt;/a&gt;, by &lt;a href=&quot;https://www.researchgate.net/profile/Sofie_Beier/publications&quot;&gt;Sofie Beier&lt;/a&gt; and &lt;a href=&quot;http://www.typecon.com/speakers/kevin-larson&quot;&gt;Kevin Larson&lt;/a&gt;, that focused testing letter variations of frequently misrecognized letters.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/legibility7.jpg&quot; class=&quot;image-padding&quot; style=&quot;max-width:75%&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;This study found that some variations were more legible than others, despite the letters within a font having similar size, weight and personality. The results showed that narrow letters benefit from being widened, and that &lt;a href=&quot;https://en.wikipedia.org/wiki/X-height&quot;&gt;x-height characters&lt;/a&gt; benefit from using more of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Ascender_(typography)&quot;&gt;ascending&lt;/a&gt; and &lt;a href=&quot;http://www.typographydeconstructed.com/descender/&quot;&gt;descending area&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;http://legibilityapp.com/&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/legibility-tool.jpg&quot; class=&quot;image-padding&quot; style=&quot;max-width:70%&quot; alt=&quot;&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;We can gain more understanding about the legibility of a given typeface by using &lt;a href=&quot;http://legibilityapp.com/&quot;&gt;a tool I built&lt;/a&gt; for a recent project. &lt;a href=&quot;http://legibilityapp.com/&quot;&gt;Legibility App&lt;/a&gt; allows you to simulate different &lt;em&gt;(often harsh)&lt;/em&gt; viewing conditions by applying a level of filters on top of the text — like blur, overglow and pixelation. The app is in beta, and for the time being, works in &lt;a href=&quot;https://www.google.com/chrome/browser/desktop/&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=&quot;http://www.opera.com/&quot;&gt;Opera&lt;/a&gt; and &lt;a href=&quot;http://www.apple.com/safari/&quot;&gt;Safari&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-to-look-for-in-a-ui-typeface&quot;&gt;What to look for in a UI typeface? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#what-to-look-for-in-a-ui-typeface&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Understanding how we read and what features make letters legible gives us a better overall view on what we should look for when choosing a UI typeface. I’ve gathered 10 key things below.&lt;/p&gt;
&lt;h3 id=&quot;1.-legibility&quot;&gt;1. Legibility &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#1.-legibility&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Legibility is the number one factor to consider. Letterforms need to be clear and recognizable. Letters with clear distinction in their forms perform better as user interface elements.&lt;sup&gt;[&lt;a href=&quot;https://prowebtype.com/picking-ui-type/&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt; Many &lt;a href=&quot;https://en.wikipedia.org/wiki/Sans-serif&quot;&gt;sans serif&lt;/a&gt; typefaces, including &lt;a href=&quot;https://en.wikipedia.org/wiki/Helvetica&quot;&gt;Helvetica&lt;/a&gt;, have indistinguishable capital I and lowercase l, making these particular fonts bad choices for interfaces.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/legibility.svg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/adobe-fonts/source-sans-pro&quot;&gt;Source Sans Pro&lt;/a&gt; on the left compared to Helvetica on the right. It’s almost impossible to differentiate the first 3 letters on Helvetica. Source Sans Pro on the other hand performs much better. Some people would also agree that Helvetica sucks for any type of UI work since it wasn’t really developed for use on screen displays.&lt;/p&gt;
&lt;blockquote&gt;“Helvetica sucks. It really wasn’t designed for small sizes on screens. Words like ‘milliliter’ can be very difficult to decipher.”
&lt;br /&gt;&lt;br /&gt;
– Erik Spiekermann
&lt;/blockquote&gt;
&lt;p&gt;When Apple “momentarily” switched to using Helvetica as their main interface typeface, it caused real usability and readability issues for certain users. Eventually, this was one of the reasons that led Apple to design the typeface we now know as &lt;a href=&quot;https://developer.apple.com/fonts/&quot;&gt;San Francisco&lt;/a&gt;. This new typeface is designed specifically for screens and it has higher x-height than Helvetica, looser spacing, and its letters are easier to distinguish from one another.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/os-x-settings.png&quot; style=&quot;max-width:70%&quot; alt=&quot;&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;http://thomasbyttebier.be/blog/the-best-ui-typeface-goes-unnoticed&quot;&gt;Thomas Byttebier&lt;/a&gt;&lt;/span&gt;
&lt;h3 id=&quot;2.-modesty&quot;&gt;2. Modesty &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#2.-modesty&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An ideal UI typeface doesn’t scream for attention, but rather goes unnoticed. The typeface you choose should stay out of the users’ way when they try to complete their task, by honoring the content in a way that doesn’t add to the users’ cognitive load.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/modesty.svg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;h3 id=&quot;3.-flexibility&quot;&gt;3. Flexibility &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#3.-flexibility&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A UI typeface needs to be flexible. We are designing experiences for medium(s), where it’s not possible to control our user’s abilities, context, browser, screen size, connection speed, or even the input method used.&lt;/p&gt;
&lt;p&gt;The typeface we choose should support these vast contexts and work well in different sizes, devices, and on a small screen in particular. Sans serifs that are made to work at small sizes on low resolution are preferred.&lt;sup&gt;[&lt;a href=&quot;https://prowebtype.com/picking-ui-type/&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/flexibility3.svg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;h3 id=&quot;4.-large-x-height&quot;&gt;4. Large x-height &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#4.-large-x-height&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;X-height means the height of a lowercase “x”. You want to look out for a typeface with large &lt;a href=&quot;https://en.wikipedia.org/wiki/X-height&quot;&gt;x-height&lt;/a&gt; since it’s in general easier to read and renders better in small sizes. Don’t go too far though, since too large x-height makes the letters &lt;em&gt;n&lt;/em&gt; and &lt;em&gt;h&lt;/em&gt; difficult to distinguish.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/x-height.svg&quot; alt=&quot;&quot; class=&quot;image-padding&quot; /&gt;
&lt;h3 id=&quot;5.-wide-proportions&quot;&gt;5. Wide proportions &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#5.-wide-proportions&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Proportions refer to the width of a character in relation to its height. You want to look out for a typeface with wide proportions since it helps with legibility and is easier to read in small sizes on a screen.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/proportions.svg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;http://acumin.typekit.com/design/&quot;&gt;Adobe Acumin&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;6.-loose-letter-spacing&quot;&gt;6. Loose letter spacing &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#6.-loose-letter-spacing&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The space around the letters is as important as the space within them. Letters that are too close to each other can be hard to read. A good UI typeface should have enough breathing room in-between letters, and even spacing to establish a steady rhythm.&lt;/p&gt;
&lt;p&gt;On the other hand, if there’s too much spacing, the integrity of the word breaks. A good rule of thumb is that letter space should be slightly smaller than the counter space inside the letterforms.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/spacing.svg&quot; class=&quot;image-padding&quot; style=&quot;max-width:70%&quot; alt=&quot;&quot; /&gt;
&lt;blockquote&gt;
  “A good rule of thumb is that letter space should be slightly smaller than the counter space inside the letterforms.”
  &lt;br /&gt;&lt;br /&gt;
  — Ariel Salminen
&lt;/blockquote&gt;
&lt;h3 id=&quot;7.-low-stroke-contrast&quot;&gt;7. Low stroke contrast &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#7.-low-stroke-contrast&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Good UI typefaces have low stroke contrast. Typefaces with high-contrast might look good at larger sizes, but at small sizes on a screen thin strokes easily disappear. On the other end of the spectrum, we have typefaces like &lt;a href=&quot;https://en.wikipedia.org/wiki/Arial&quot;&gt;Arial&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Helvetica&quot;&gt;Helvetica&lt;/a&gt;, that can have too little contrast between letter shapes, making the letters indistinguishable from each other.&lt;/p&gt;
&lt;p&gt;It’s all about finding a balance between the two. Imagine the example below as a horizontal scale. You want to aim for something that is more towards the example on the right side.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/contrast.svg&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;h3 id=&quot;8.-opentype-features&quot;&gt;8. OpenType features &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#8.-opentype-features&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Making sure that the typeface you choose supports &lt;a href=&quot;https://typofonderie.com/font-support/opentype-features/&quot;&gt;OpenType features&lt;/a&gt; is important, since it provides much more flexibility for us. It’s often also an indicator that there’s a good support for different languages and &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_Unicode_characters&quot;&gt;special characters&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, one of the most useful OpenType Features has been &lt;a href=&quot;https://www.fonts.com/content/learning/fontology/level-3/numbers/proportional-vs-tabular-figures&quot;&gt;tabular figures&lt;/a&gt;, which are numerals that share a common width. You might want to use them for example when working with timers or counters, or when you have a table displaying information like IP numbers.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/otfeatures.png&quot; style=&quot;max-width:100%&quot; alt=&quot;&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;http://www.fontblog.de/das-ende-der-postscript-type-1-schriften/&quot;&gt;Fontblog&lt;/a&gt;&lt;/span&gt;
&lt;h3 id=&quot;9.-fallback-fonts&quot;&gt;9. Fallback fonts &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#9.-fallback-fonts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Below is an experience that you’re all probably familiar with. What’s happening here is that the &lt;a href=&quot;https://en.wikipedia.org/wiki/Web_typography&quot;&gt;web fonts&lt;/a&gt; are blocking the actual content from showing up before they’re all fully loaded.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/timeline.png&quot; class=&quot;image-padding&quot; alt=&quot;&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://www.filamentgroup.com/lab/weight-wait.html&quot;&gt;Filament Group&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;This can be &lt;a href=&quot;https://www.filamentgroup.com/lab/weight-wait.html&quot;&gt;easily fixed&lt;/a&gt; by loading the fonts in a non-blocking manner, which drastically cuts the loading time for the content. The drawback is that we need to define fallback fonts from the &lt;a href=&quot;http://www.granneman.com/webdev/coding/css/fonts-and-formatting/default-fonts/&quot;&gt;default system fonts&lt;/a&gt;, which show while our custom fonts are loading.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/timeline2.png&quot; class=&quot;image-padding&quot; style=&quot;max-width:100%&quot; alt=&quot;&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://www.filamentgroup.com/lab/weight-wait.html&quot;&gt;Filament Group&lt;/a&gt;&lt;/span&gt;
&lt;h3 id=&quot;10.-hinting&quot;&gt;10. Hinting &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2016/typography-for-user-interfaces/#10.-hinting&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hinting is a process where fonts are adjusted for maximum readability on computer monitors. &lt;a href=&quot;https://en.wikipedia.org/wiki/Font_hinting&quot;&gt;Hinting&lt;/a&gt; tries to make vector curves render nicely to a grid of pixels by providing a set of guidelines for different sizes. At low screen resolutions hinting is critical for producing clear, legible text.&lt;/p&gt;
&lt;p&gt;Windows is notorious for its bad font rendering without hinting, so make sure to always test on a Windows device that has low DPI monitor connected to it. This helps you to ensure that the letter forms stay legible.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/subpixel.jpg&quot; style=&quot;max-width:70%&quot; alt=&quot;&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://www.typotheque.com/articles/hinting&quot;&gt;Typotheque&lt;/a&gt;&lt;/span&gt;
&lt;h2 style=&quot;text-transform: none;&quot;&gt;The Future(s)&lt;/h2&gt;
&lt;p&gt;It’s been a relatively short ride for us, and I expect to see a lot of progress in terms of how type behaves on the web, how our &lt;a href=&quot;https://typecast.com/&quot;&gt;typographic tools&lt;/a&gt; mature, how &lt;a href=&quot;https://en.wikipedia.org/wiki/Category:Font_formats&quot;&gt;font formats&lt;/a&gt; keep evolving, and how we’ll be utilizing type in the (near) future.&lt;/p&gt;
&lt;p&gt;I imagine we’ll start seeing much more &lt;a href=&quot;https://en.wikipedia.org/wiki/Progressive_enhancement&quot;&gt;progressively enhanced&lt;/a&gt; expe­riences where the text itself is fundamen­tally more important than our suggestions about how it should be typeset.&lt;sup&gt;[&lt;a href=&quot;http://nicewebtype.com/&quot;&gt;6&lt;/a&gt;]&lt;/sup&gt; It’s really how things have always worked on the web, but we’re only now starting to take this issue seriously.&lt;/p&gt;
&lt;p&gt;For ideal typography, we also have to know as much as possible about each user’s reading environment. This may seem obvious, but it really isn’t.&lt;sup&gt;[&lt;a href=&quot;http://alistapart.com/column/responsive-typography-is-a-physical-discipline&quot;&gt;7&lt;/a&gt;]&lt;/sup&gt; In the future though, I imagine typefaces becoming more aware of their surroundings and starting to respond to a number of factors like &lt;a href=&quot;https://en.wikipedia.org/wiki/Viewport&quot;&gt;viewport&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Display_resolution&quot;&gt;resolution&lt;/a&gt;, &lt;a href=&quot;http://typerendering.com/&quot;&gt;type rendering engine&lt;/a&gt; used, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Ambient_Light_Events&quot;&gt;ambient light&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Lumen_(unit)&quot;&gt;screen brightness&lt;/a&gt; and even the &lt;a href=&quot;http://webdesign.maratz.com/lab/responsivetypography/&quot;&gt;viewing distance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also predict that fonts’ legibility adjustments will be eventually linked to &lt;a href=&quot;http://www.apple.com/accessibility/ios/&quot;&gt;OS’s accessibility options&lt;/a&gt; so that typefaces can automatically start adapting to different user needs.&lt;/p&gt;
&lt;p&gt;Overall, I see the future for UI typography being all about sensors and font formats that can respond to data acquired from these sensors, and eventually also &lt;a href=&quot;http://www.jon.gold/2016/05/robot-design-school/&quot;&gt;new typographic tools&lt;/a&gt; that have contextual awareness which integrates more intelligent algorithms to our workflows.&lt;/p&gt;
&lt;p&gt;All this is needed so that we, and the typefaces that we work with, can better respond to all these contexts we have to deal with.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/devices.jpg&quot; style=&quot;max-width:100%&quot; alt=&quot;Devices&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://www.flickr.com/photos/lukew/10430507184/in/photostream/&quot;&gt;Luke Wroblewski&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;To ease our work…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/vr.jpg&quot; style=&quot;max-width:100%&quot; alt=&quot;Samsung GearVR&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;http://www.samsung.com/us/explore/gear-vr/&quot;&gt;Samsung GearVR&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;…make our interfaces faster…&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/pano-1.jpg&quot; style=&quot;max-width:100%&quot; alt=&quot;MozVR&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://mozvr.com/&quot;&gt;MozVR&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;…more accessible…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/kallan_car_2.jpg&quot; style=&quot;max-width:100%&quot; alt=&quot;Callan &amp; Co&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;http://kallan.co/&quot;&gt;Callan &amp;amp; Co&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;…and eventually more legible and productive too…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/type-for-ui/img/hololens2.jpg&quot; style=&quot;max-width:100%&quot; alt=&quot;Microsoft Hololens&quot; /&gt;&lt;span class=&quot;desc&quot;&gt;Image credit: &lt;a href=&quot;https://www.microsoft.com/microsoft-hololens/en-us&quot;&gt;Microsoft Hololens&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;…because ultimately, good typography enables productivity for everyone. It could even &lt;a href=&quot;https://www.propublica.org/article/how-typography-can-save-your-life&quot;&gt;save your life&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This article is loosely based on a talk that I did in one of our internal design events in San Francisco, CA. &lt;a href=&quot;https://arielsalminen.com/type-for-ui/&quot; target=&quot;_blank&quot;&gt;See the slide deck&lt;/a&gt; (browse with arrow keys).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://arielsalminen.com/type-for-ui/&quot; target=&quot;_blank&quot;&gt;View slidedeck&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Relocating to San Francisco, CA</title>
      <link href="https://arielsalminen.com/2015/san-francisco/"/>
      <updated>2015-12-18T00:00:00Z</updated>
      <id>https://arielsalminen.com/2015/san-francisco/</id>
      <content type="html">&lt;p&gt;I’m terribly excited to tell that we’re moving to &lt;a href=&quot;https://en.wikipedia.org/wiki/San_Francisco_Bay_Area&quot;&gt;San Francisco Bay Area&lt;/a&gt; in the beginning of 2016! I’m joining a new company, &lt;a href=&quot;http://www.idean.com/&quot;&gt;Idean&lt;/a&gt;, as a Senior Interaction Designer and Iisa will be starting preschool there, which makes this a tremendous change for the whole family. All of this is something we’ve been planning for a while already, so we’re thrilled that it’s finally happening.&lt;/p&gt;
&lt;p&gt;As of today, we’ve packed everything we have—from the 12&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; record collection to Iisa’s toys—into a &lt;a href=&quot;https://en.wikipedia.org/wiki/Intermodal_container&quot;&gt;shipping container&lt;/a&gt; and it’s already in the harbor waiting to get shipped to the United States. We’re still staying in Finland for the Christmas, seeing relatives and enjoying some quiet time, before flying to San Francisco in January.&lt;/p&gt;
&lt;p&gt;It’s been interesting few years at &lt;a href=&quot;http://www.adtile.me/&quot;&gt;Adtile&lt;/a&gt;, and I’m grateful for all the things I’ve learned, but it’s time to move on towards new adventures.&lt;/p&gt;
&lt;p&gt;Looking forward to meeting &lt;a href=&quot;https://twitter.com/KarlTheFog&quot;&gt;Karl the Fog&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The 7th Edition of Arielsalminen.com</title>
      <link href="https://arielsalminen.com/2015/7th-edition/"/>
      <updated>2015-11-23T00:00:00Z</updated>
      <id>https://arielsalminen.com/2015/7th-edition/</id>
      <content type="html">&lt;p&gt;I designed the &lt;a href=&quot;https://arielsalminen.com/&quot;&gt;6th edition&lt;/a&gt; of this website almost 5 years ago, which is an eternity by today’s standards. The previous version was one of the first responsive websites out there that was built &lt;a href=&quot;http://www.lukew.com/resources/mobile_first.asp&quot;&gt;mobile first&lt;/a&gt; from start to finish. Everything was also done progressive enhancement in mind, which made it last well throughout the years.&lt;/p&gt;
&lt;p&gt;But as with many personal projects, there eventually came a point when the content started becoming obsolete, type didn’t work anymore like I wanted it to, and even updating the website became so terrible experience that I just stopped doing it.&lt;/p&gt;
&lt;p&gt;It was time to rethink. After some pondering, I came up with these 6 goals for the new version:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;Build a design system.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Focus on the content, typography and readability.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Better performance and faster loading.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Switch to &lt;span class=&quot;small-caps&quot;&gt;HTTPS&lt;/span&gt; and provide an offline experience.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Ditch &lt;span class=&quot;small-caps&quot;&gt;PHP&lt;/span&gt; and switch to a &lt;a href=&quot;https://middlemanapp.com/&quot;&gt;static site generator&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Move hosting to &lt;a href=&quot;https://aws.amazon.com/s3/&quot;&gt;Amazon &lt;span class=&quot;small-caps&quot;&gt;S3&lt;/span&gt;&lt;/a&gt; and use &lt;a href=&quot;https://aws.amazon.com/cloudfront/&quot;&gt;CloudFront&lt;/a&gt; as &lt;span class=&quot;small-caps&quot;&gt;CDN.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;challenges&quot;&gt;Challenges &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/7th-edition/#challenges&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Maintaining a website with a 5 years old &lt;span class=&quot;small-caps&quot;&gt;CMS&lt;/span&gt; can be a challenge itself, but moving all that cruft to a completely new platform can be even more challenging. The &lt;a href=&quot;http://v3.arie.ls/&quot;&gt;previous version&lt;/a&gt; had also hundreds of subpages and the image resources alone took almost 1 gigabyte of space on the server. The need to convert all that content to a new format was the biggest reason why I didn’t even attempt to do this any earlier.&lt;/p&gt;
&lt;p&gt;Originally, I thought I’d write about the  &lt;a href=&quot;https://arielsalminen.com/2012/responsive-workflow/&quot;&gt;workflow&lt;/a&gt; behind the redesign, but as it turns out, my process was somewhat unusual and it wouldn’t probably morph into a nice, readable article, just yet.&lt;/p&gt;
&lt;p&gt;Basically, I went with gut feeling with pretty much everything you see here. There’s no grid, no fancy ratios used, no typographic scale, and no magic numbers that the layout, type or colors would be based on.&lt;/p&gt;
&lt;p&gt;Shocked? Well, that’s really how it all started. But the intriguing part is that this ‘chaotic’ way of working, that included no proper workflow what­soever, eventually formed a &lt;a href=&quot;https://arielsalminen.com/styleguide/&quot;&gt;living design system&lt;/a&gt;, a tiny &lt;a href=&quot;https://arielsalminen.com/sketch/&quot;&gt;tool for content sketches&lt;/a&gt;, and even a grid for both layout and baseline.&lt;/p&gt;
&lt;p&gt;Now, I won’t be encouraging anyone to necessarily start working this way. &lt;a href=&quot;https://en.wikipedia.org/wiki/Grid_(graphic_design)&quot;&gt;Grids&lt;/a&gt;, &lt;a href=&quot;http://www.modularscale.com/&quot;&gt;typographic scales&lt;/a&gt; and ratios can be very helpful tools, and I tend to use them when in hurry. Lately, however, I’ve wanted to learn to trust my own instincts more and let go of the imaginary feeling of control we’ve created for ourselves.&lt;/p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/7th-edition/#results&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I quite like the simplicity here. Not just the layout and structure, but also how quick and simple this is to update. I’m basically doing all the updates now using &lt;a href=&quot;https://daringfireball.net/projects/markdown/syntax&quot;&gt;Markdown format&lt;/a&gt; in a plain old text editor, and then deploying the changes to Amazon &lt;span class=&quot;small-caps&quot;&gt;S3&lt;/span&gt; with a beta version of &lt;a href=&quot;http://beta.upstatic.io/&quot;&gt;Upstatic&lt;/a&gt; &lt;em&gt;(btw, I did the website!).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There’s also the &lt;a href=&quot;https://arielsalminen.com/styleguide/&quot;&gt;living style guide&lt;/a&gt;, which I’m happy about, as it helps me to more easily define a common visual language for all the individual components.&lt;/p&gt;
&lt;p&gt;There’s no commenting, but if you’d like to leave feedback, please &lt;a href=&quot;https://twitter.com/arielsalminen&quot;&gt;tweet to me&lt;/a&gt; instead. If you’re looking for the old versions of this website they are still accessible too, via &lt;a href=&quot;http://v1.arielsalminen.com/&quot;&gt;v1.arielsalminen.com&lt;/a&gt;, &lt;a href=&quot;http://v2.arielsalminen.com/&quot;&gt;v2.arielsalminen.com&lt;/a&gt;, &lt;a href=&quot;http://v3.arielsalminen.com/&quot;&gt;v3.arielsalminen.com&lt;/a&gt;, &lt;a href=&quot;http://v4.arielsalminen.com/&quot;&gt;v4.arielsalminen.com&lt;/a&gt;, &lt;a href=&quot;http://v5.arielsalminen.com/&quot;&gt;v5.arielsalminen.com&lt;/a&gt;, &lt;a href=&quot;http://v6.arielsalminen.com/&quot;&gt;v6.arielsalminen.com&lt;/a&gt;, &lt;a href=&quot;http://v7.arielsalminen.com/&quot;&gt;v7.arielsalminen.com&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The Iconic Work of Reid Miles</title>
      <link href="https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/"/>
      <updated>2015-11-14T00:00:00Z</updated>
      <id>https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/</id>
      <content type="html">&lt;p&gt;Reid Miles was an American modernist designer, a genius of his time, best known for his work for &lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_Note_Records&quot;&gt;Blue Note Records&lt;/a&gt; through the 1950’s and 60’s. During this period he designed almost 500 record covers for the label. This article is a tribute to Miles, who’s work contin­ues to inspire me and many others.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/miles/reid-miles.jpg&quot; style=&quot;max-width:70%;padding:0.6em;&quot; alt=&quot;Reid Miles in the 1970s.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Reid Miles in the 1970s. Image credit: Blue&amp;nbsp;Note&amp;nbsp;Records.&lt;/span&gt;
&lt;h2 id=&quot;the-backstory&quot;&gt;The Backstory &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#the-backstory&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s the summer of 1998 — a long wait has finally come to an end. After saving for months I’ve acquired my first turntable. It’s &lt;a href=&quot;https://en.wikipedia.org/wiki/Technics_SL-1200&quot;&gt;Technics &lt;span class=&quot;small-caps&quot;&gt;SL-&lt;/span&gt;1210 &lt;span class=&quot;small-caps&quot;&gt;MK II&lt;/span&gt;&lt;/a&gt; and I am carrying it uphill towards home that is nearly two and a half miles further. The package weighs 26 pounds, not an easy task for the scrawny teenager I was back then.&lt;/p&gt;
&lt;p&gt;I remember vividly how I after arriving tear apart the package, took out all the gleaming parts, put them together, and the great enthusiasm and eagerness I felt inside. I also remember how I connected the turntable to the speakers and played the first vinyls I had picked up months earlier.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;There I was, eyes closed, letting the unison of the brasses sink into my brain.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seventeen years later, that same turntable still looks and works like a brand new thing. It was and still is an amazingly well built piece. I feel the same about the work of &lt;a href=&quot;https://en.wikipedia.org/wiki/Reid_Miles&quot;&gt;Reid Miles&lt;/a&gt;. He was a genius, ahead of his time, and the way he treated the typography as visual elements that can be broken apart and form something new still feels fresh.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#cite1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I didn’t know it back then, but the day I bought the turntable and started collecting vinyls shaped my future career as a designer. Slowly through the years the jazz music and artworks of these 12&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; records became the main source of inspiration for me.&lt;/p&gt;
&lt;h2 id=&quot;miles%E2%80%99-early-days&quot;&gt;Miles’ Early Days &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#miles%E2%80%99-early-days&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reid Miles was born in Chicago on the 4th of July 1927, American Inde­pendence Day, making him only twelve years old when Blue Note was founded. When the &lt;a href=&quot;https://en.wikipedia.org/wiki/Wall_Street_Crash_of_1929&quot;&gt;Stock Market crashed&lt;/a&gt; in 1929, Miles’ parents divorced and he moved with his mother and younger sister to Long Beach, California. After high school Miles joined the Navy and, following his discharge, moved back to Los Angeles to enrol at &lt;a href=&quot;https://en.wikipedia.org/wiki/Chouinard_Art_Institute&quot;&gt;Chouinard Art Institute&lt;/a&gt;.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/chouinard.jpg&quot; alt=&quot;Chouinard Art Institute.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Chouinard Art Institute. Image credit: California Institute of the Arts.&lt;/span&gt;
&lt;p&gt;According to Miles himself, he didn’t enrol because of some lofty ambitions towards art. He told in a series of interviews that he did it because of a girl who he was dating at the time. Miles had also just returned from &lt;a href=&quot;https://en.wikipedia.org/wiki/World_War_II&quot;&gt;World War II&lt;/a&gt; and could use the &lt;a href=&quot;https://en.wikipedia.org/wiki/G.I._Bill&quot;&gt;G.I. Bill&lt;/a&gt; education benefits.&lt;/p&gt;
&lt;p&gt;To him, it felt like a better idea to go to an easy art school than somewhere else. The dating didn’t work out, — but three months later, things just clicked and Miles knew what he wanted to do.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#cite2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;After finishing his studies at the Chouinard Art Institute, Miles headed towards New York to look for a job with the biggest portfolio he could possibly find.&lt;/p&gt;
&lt;blockquote&gt;“If the portfolio didn’t fit on the desk, I wasn’t talking to the right person. You need a fierce competition to do good work and when I started out, I would be competing against 11 other people for a job as an assistant to an art director at a little agency.”&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://simple.wikipedia.org/wiki/John_Hermansader&quot;&gt;John Hermansader&lt;/a&gt;, an American painter and a graphic designer, gave Miles his first job in New York. One of Hermansader’s clients at the time was Blue Note Records, which eventually led to Miles’ involvement too.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#cite2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/photo.jpg&quot; style=&quot;max-width:100%;padding:0.3rem;&quot; alt=&quot;John Coltrane’s photograph by Francis Wolff and the final cover design by Reid Miles.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Photograph by Francis Wolff on the left and the final cover design by Reid Miles on the right. Image credit: Blue Note Records.&lt;/span&gt;
&lt;h2 id=&quot;blue-notes&quot;&gt;Blue Notes &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#blue-notes&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In 1951, when Blue Note began releasing 10&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; records, Hermansader — who later hired Miles — was one of their first designers. Many don’t know that Hermansader, along with &lt;a href=&quot;https://en.wikipedia.org/wiki/Paul_Bacon_(designer)&quot;&gt;Paul Bacon&lt;/a&gt;, were the ones who did the ground­work for Blue Note’s design style, which Miles then continued to develop further with his own unique twist.&lt;/p&gt;
&lt;p&gt;Late in 1955, Blue Note made the change to 12&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; record format. It was around this same time when the company hired Reid Miles as their Art Director and asked him to adapt their existing cover concepts to the new, larger format.&lt;/p&gt;
&lt;p&gt;Miles started his work from &lt;a href=&quot;https://en.wikipedia.org/wiki/File:BLP_1509_Jackson.jpg&quot;&gt;Blue Note &lt;span class=&quot;small-caps&quot;&gt;BLP-1509&lt;/span&gt;&lt;/a&gt; by Milt Jackson and The Thelonious Monk Quintet, and went on, designing almost 500 covers during a period of 15 years.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/milt.jpg&quot; alt=&quot;Blue Note BLP-1509 record cover.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Blue Note BLP-1509 record cover.&lt;/span&gt;
&lt;p&gt;In the Fifties, Miles often worked in close collabora­tion with &lt;a href=&quot;https://en.wikipedia.org/wiki/Andy_Warhol&quot;&gt;Andy Warhol&lt;/a&gt;, who helped him turn his concept designs to illustrations. One of the most famous results of this joint effort between the two is the cover of &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Congregation_(album)&quot;&gt;The Congregation&lt;/a&gt; by Johnny Griffin, which has reached an iconic status in the history of jazz. Later on Miles’ and Warhol’s relation­ship even led to him posing nude for one of Andy’s famous portraits.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#cite5&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/250.jpg&quot; alt=&quot;The cover of “The Congregation” album by Johnny Griffin.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;The cover of “The Congregation” album.&lt;/span&gt;
&lt;p&gt;Although Warhol and artists such as &lt;a href=&quot;https://en.wikipedia.org/wiki/Harold_Feinstein&quot;&gt;Harold Feinstein&lt;/a&gt; were also working for Blue Note, it wasn’t until Reid Miles took over as the Art Director that the label could match the design style with its legendary ‘Blue Note sound.’&lt;/p&gt;
&lt;p&gt;Whether this meant Miles’ creative use of black and white photographs or the way he treated the typography, “Miles made the cover sound like it knew what it lay in store for the listener” writes Felix Cromey in &lt;a href=&quot;http://www.amazon.com/Cover-Art-Blue-Note-Records/dp/1843405997/&quot;&gt;The Cover Art of Blue Note Records&lt;/a&gt;.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#cite3&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;blockquote&gt;“Fifty Bucks an album…they loved it, thought it was modern, they thought it went with the music…one or two colors to work with at that time and some outrageous graphics!”&lt;/blockquote&gt;
&lt;p&gt;Reid Miles’ association with the label ended around 1967 when &lt;a href=&quot;https://en.wikipedia.org/wiki/Alfred_Lion&quot;&gt;Alfred Lion&lt;/a&gt;, one of the founders of Blue Note, retired. Miles later returned permanently to Los Angeles, where he became famous for being paid $1,000,000/year to produce &lt;a href=&quot;http://www.coca-cola.com/&quot;&gt;Coca-Cola&lt;/a&gt; ads that mimicked &lt;a href=&quot;https://en.wikipedia.org/wiki/Norman_Rockwell&quot;&gt;Norman Rockwell&lt;/a&gt; paintings. Quite a contrast to the fifty bucks an album that he was paid by Blue Note.&lt;/p&gt;
&lt;p&gt;Miles continued working in his Hollywood studio for various clients until a massive coronary in 1993, which lead to &lt;a href=&quot;http://markfocus.blogspot.fi/2012/08/stories-of-photographers-passed-reid.html&quot;&gt;his somewhat dramatic death&lt;/a&gt;.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#cite4&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/alfred.jpg&quot; alt=&quot;Co-founder of Blue Note Records Alfred Lion and photographer Francis Wolff.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Co-founder of Blue Note Records Alfred Lion and photographer Francis Wolff. Image credit: Francis Wolff / Blue Note Records.&lt;/span&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;During the Fifties, when the design industry was in flux, Reid Miles pushed forward the way the typography is treated with his bold, playful designs, creative use of typefaces, and his distinct preference for contrast and asymmetry.&lt;/p&gt;
&lt;p&gt;Personally, I’d like to think, that Reid Miles did the same to modern typography, as &lt;a href=&quot;https://en.wikipedia.org/wiki/Charles_and_Ray_Eames&quot;&gt;Charles and Ray Eames&lt;/a&gt; did to modern architecture and furniture.&lt;/p&gt;
&lt;blockquote&gt;“I think typography in the early Fifties was in a renaissance period anyway. It happened especially on album covers because they were not so restrictive as advertising.”&lt;br /&gt;&lt;br /&gt;
— Reid Miles&lt;/blockquote&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/reid-miles.webp&quot; alt=&quot;Blue Note reunion concert in Town Hall, New York, February 22, 1985. From left to right: president and CEO of the Blue Note Label Group Bruce Lundvall, co-foudner of Blue Note Records Alfred Lion, designer Reid Miles, recording engineer Rudy Van Gelder and producer Michael Cuscuna.&quot; /&gt;
&lt;span class=&quot;desc&quot;&gt;Blue Note reunion concert in Town Hall, New York, February 22, 1985. From left to right: president and CEO of the Blue Note Label Group Bruce Lundvall, co-foudner of Blue Note Records Alfred Lion, designer Reid Miles, recording engineer Rudy Van Gelder and producer Michael Cuscuna. Image credit: Blue Note Records.&lt;/span&gt;
&lt;h2 id=&quot;designs&quot;&gt;Designs &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#designs&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A selection of Reid Miles’ designs from the 1950’s and 60’s. Most of these covers Miles designed for Blue Note, but there are few others included as well. Let the work speak for itself.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/02.png&quot; alt=&quot;Reid Miles’ cover design&quot; class=&quot;img&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/8.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/250.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/81.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/155.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/92.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/202.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/13.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/20.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/154.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/3.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/39.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/130.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/83.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/112.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/84.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/86.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/90.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/01.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/91.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/201.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/11.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/118.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/10.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/120.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/146.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/1.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/4.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/12.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/7.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/115.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/19.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/21.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/24.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/25.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/15.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/26.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/30.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/33.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/36.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/37.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/41.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/46.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/63.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/98.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/67.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/80.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/69.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/miles/251.jpg&quot; alt=&quot;Reid Miles&#39; cover design&quot; class=&quot;img heavy-load&quot; /&gt;
&lt;h2 id=&quot;references&quot;&gt;References &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/#references&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://retinart.net/artist-profiles/jazzy-blue-notes-reid-miles/&quot;&gt;The Jazzy Blue Notes of Reid Miles&lt;/a&gt; &lt;sup id=&quot;cite1&quot;&gt;[1]&lt;/sup&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.amazon.com/Cover-Art-Blue-Note-Records/dp/1855854163/&quot;&gt;The Cover Art of Blue Note Records, Volume II&lt;/a&gt; &lt;sup id=&quot;cite2&quot;&gt;[2]&lt;/sup&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.amazon.com/Cover-Art-Blue-Note-Records/dp/1843405997/&quot;&gt;The Cover Art of Blue Note Records, Volume I&lt;/a&gt; &lt;sup id=&quot;cite3&quot;&gt;[3]&lt;/sup&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://markfocus.blogspot.com/2012/08/stories-of-photographers-passed-reid.html&quot;&gt;Stories of Photographers passed… Reid Miles&lt;/a&gt; &lt;sup id=&quot;cite4&quot;&gt;[4]&lt;/sup&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.amazon.com/Andy-Warhol-Complete-Commissioned-Record/dp/3791354248&quot;&gt;Andy Warhol, The Complete Commissioned Record Covers&lt;/a&gt; &lt;sup id=&quot;cite5&quot;&gt;[5]&lt;/sup&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.people.com/people/archive/article/0,,20070186,00.html&quot;&gt;For $1 Million a Year, Reid Miles Does Those Ads with the Norman Rockwell Look&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_Note_Records_discography&quot;&gt;Blue Note Records discography&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_Note_Records&quot;&gt;History of Blue Note Records&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://simple.wikipedia.org/wiki/John_Hermansader&quot;&gt;John Hermansader&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Reid_Miles&quot;&gt;Reid Miles&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>The Many Faces of The Web</title>
      <link href="https://arielsalminen.com/2015/the-many-faces-of-the-web/"/>
      <updated>2015-04-27T00:00:00Z</updated>
      <id>https://arielsalminen.com/2015/the-many-faces-of-the-web/</id>
      <content type="html">&lt;p&gt;During the winter 2014, me and my family rented an apartment from San Diego, CA for few months through my work. While staying there, we had an &lt;a href=&quot;http://www.att.com/devices/netgear/unite-pro.html&quot;&gt;AT&amp;amp;T hotspot device&lt;/a&gt; that provided the network connection. For us, relying on this device, meant constant drops of connection, network latency like we’ve never seen before, and websites that were completely broken because Java­Script wasn’t loading at all. A part of this can be explained by the poor reception at the location where we were staying, but overall, the whole experience put me thinking.&lt;/p&gt;
&lt;p&gt;All these contexts, where our web­sites are viewed in, vary so wildly that we have to start paying more attention to how we design and build. The web is fragile and the situation isn’t going to change any time soon.&lt;/p&gt;
&lt;h2 id=&quot;stop-breaking-the-web&quot;&gt;Stop breaking the web &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-many-faces-of-the-web/#stop-breaking-the-web&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There’s this thought in my head that, like a broken record, keeps repeating to me and everyone around: &lt;em&gt;“Stop breaking the web.”&lt;/em&gt; And if I think about it more, I realize it’s related to this funda­mental idea that I have, which makes me want to push the web forward and make it a better place. Because isn’t that what we, the designers and developers of this medium, should strive for and be proud of?&lt;/p&gt;
&lt;p&gt;On a bigger scale, I mean things like making our websites accessible to everyone. Making them work with different input methods like touch, mouse, keyboard or voice. Making them load and perform fast. Providing everyone access to this vast network of connected things. And if we don’t strive for all of this, what’s the point of working on the web? To me, this is what the web is and has always been about. Making people’s lives better. Making information accessible to everyone—wherever, whenever and as fast as possible.&lt;/p&gt;
&lt;p&gt;The thing about the web that still fascinates me after all these years, is how universally accessible it is. How you can publish something out there and how someone on the other side of this planet can just pick up a connected device and access that content. Even more fascinating, use &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_accessibility&quot;&gt;assistive technology&lt;/a&gt; that reads the content for the user. But—it’s also so easy to break this connection if we don’t pay attention.&lt;/p&gt;
&lt;h2 id=&quot;how-we-build&quot;&gt;How we build &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-many-faces-of-the-web/#how-we-build&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I feel like there’s a growing trend in our industry to forget accessi­bility. To not pay attention. Forget progressively enhanced experiences. Forget the universality of the medium that we are working on. Forget that not every­one on this planet has the latest and greatest devices or the connection speeds that we, ourself, might have.&lt;/p&gt;
&lt;p&gt;This worries me and puts me thinking.&lt;/p&gt;
&lt;p&gt;Instead of coming up with all these new tools and JavaScript frame­works, shouldn’t we try to emphasize the importance of learning the underlying funda­mentals of the web? Teach those who are just stepping to this medium and starting their careers. By not making our stack more and more complex, but by telling about the best practices that should guide our work and the importance of basic things.&lt;/p&gt;
&lt;p&gt;Why accessibility is important and why does it make a difference. Why is progressive enhancement important. Why everyone doesn’t have to get the same experience and why it isn’t even a sane goal. Why do we need perfor­mance budgets. Why it’s important to make websites work even when JavaScript doesn’t load. Why we can’t rely on a browser feature to be available. Why we need to focus on features and constraints rather than browsers and devices. And so on and so on.&lt;/p&gt;
&lt;h2 id=&quot;embrace-the-medium&quot;&gt;Embrace the medium &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/the-many-faces-of-the-web/#embrace-the-medium&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The web is more than just a set of protocols and agreements—&lt;span class=&quot;small-caps&quot;&gt;HTTP, URLs, HTML.&lt;/span&gt; It’s also built with a set of principles that—much like the principles underlying the internet itself—are founded on ideas of universality and accessibility (as Jeremy Keith &lt;a href=&quot;https://adactio.com/journal/8245&quot;&gt;states it&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;We are designing and building experiences for a medium, where it’s not possible to control our user’s age, abilities, context, device, browser, screen size, operating system, connection speed, or even the input method they are using. The contexts, where our websites will be eventually viewed in, are a mix of variables we can’t control.&lt;/p&gt;
&lt;p&gt;Universality is in the core of the World Wide Web, so we should embrace it and build websites that are available to, and accessible by, everyone. We are designing and building for the many faces of the web.&lt;/p&gt;
&lt;p&gt;Dear Web,&lt;br /&gt;
I want to make you a better place.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Interview With Workspiration</title>
      <link href="https://arielsalminen.com/2015/interview-with-workspiration/"/>
      <updated>2015-04-13T00:00:00Z</updated>
      <id>https://arielsalminen.com/2015/interview-with-workspiration/</id>
      <content type="html">&lt;p&gt;I am Ariel Salminen, a designer and developer living in Helsinki, Finland. I have worked in the web industry for over a decade and have designed websites, applications, and large systems for start-ups and companies of all sizes. My core belief is that all content on the web should be accessible to anyone using any kind of device to access the internet.&lt;/p&gt;
&lt;p&gt;I am currently working as a Lead Frontend Designer at Adtile Technologies (San Diego based start-up). I am also an author at Smashing Magazine and the founder of Helsinki Device Lab, which was established to help web designers and developers to be able to test their work on the ever-growing range of mobile devices.&lt;/p&gt;
&lt;p&gt;I have created popular open source libraries such as Responsive Nav, Responsive Slides, Tiny Nav, Remote Preview and Molten Leading. These tools are being used by companies like AT&amp;amp;T, Converse, the jQuery Foundation, Microsoft, Ted, U.S. Government and Zynga.&lt;/p&gt;
&lt;h2 id=&quot;how-did-you-get-started-in-web-design&quot;&gt;How did you get started in web design? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/interview-with-workspiration/#how-did-you-get-started-in-web-design&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started off by studying traditional print design in two different schools. I have always been more interested about the web, but at the time I was studying (early 00’s) there wasn’t much to choose from if you wanted to learn web design.&lt;/p&gt;
&lt;p&gt;Basically, I have learned most of what I know now by following people on the web; design sites, blogs and studying other people’s markup and CSS. One of the sites that made a big influence on me on my early days was A List Apart in 2001 and CSS Zen Garden in 2003.&lt;/p&gt;
&lt;p&gt;They both encouraged people to forget table-based layouts and adopt this new technique that used semantic markup and CSS layouts. I was just graduated and starting my career as a freelance designer and the new way of doing things, separating the structure from the presentation, just made sense to me. It still does of course.&lt;/p&gt;
&lt;h2 id=&quot;what-hardware-and-software-do-you-use-for-your-work&quot;&gt;What hardware and software do you use for your work? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/interview-with-workspiration/#what-hardware-and-software-do-you-use-for-your-work&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have a 13&amp;quot; Retina Macbook Pro hooked up to a Cinema Display, but recently I have found myself working more and more just on the laptop because of the higher PPI screen.&lt;/p&gt;
&lt;p&gt;In addition to pen and paper, the tools I use most are Atom editor, iA Writer, Typecast and Browser’s built-in developer tools. I also spend a lot of time using Illustrator and Photoshop, but I am trying to move more towards Sketch.&lt;/p&gt;
&lt;h2 id=&quot;what-is-your-ideal-work-environment&quot;&gt;What is your ideal work environment? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/interview-with-workspiration/#what-is-your-ideal-work-environment&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I love working from home. That’s, for me, the most creative and productive environment in the whole world. We live right next to the Baltic Sea with windows facing the water, so it’s nice to take breaks and just stare outside.&lt;/p&gt;
&lt;h2 id=&quot;your-favorite-books-that-you-would-recommend&quot;&gt;Your favorite books that you would recommend &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/interview-with-workspiration/#your-favorite-books-that-you-would-recommend&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I would recommend everyone designing websites to read Nicely Said: Writing for the Web with Style and Purpose by Nicole Fenton and Kate Kiefer Lee.&lt;/p&gt;
&lt;h2 id=&quot;who-are-the-creatives-you-admire-most&quot;&gt;Who are the creatives you admire most? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2015/interview-with-workspiration/#who-are-the-creatives-you-admire-most&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I admire the work of &lt;a href=&quot;https://arielsalminen.com/2015/the-iconic-work-of-reid-miles/&quot;&gt;Reid Miles&lt;/a&gt;. He was an American modernist designer, best known for his iconic work for Blue Note Records through the 1950’s and 60’s.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Dashes in Web Typography</title>
      <link href="https://arielsalminen.com/2015/dashes-in-web-typography/"/>
      <updated>2015-03-09T00:00:00Z</updated>
      <id>https://arielsalminen.com/2015/dashes-in-web-typography/</id>
      <content type="html">&lt;p&gt;This is an experiment I did months ago, but eventually never ended up posting it here. I had already forgotten the whole thing until it few weeks ago suddenly started popping up on my Twitter and Facebook timelines via other people. It’s a simple one pager you can use for example as a cheatsheet for various dashes.&lt;/p&gt;
&lt;a href=&quot;https://arielsalminen.com/dashes/&quot; target=&quot;_blank&quot;&gt;
  &lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/dashes.png&quot; alt=&quot;Dashes in Web Typography&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://arielsalminen.com/dashes/&quot; target=&quot;_blank&quot;&gt;View demo&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Molten Leading</title>
      <link href="https://arielsalminen.com/2014/molten-leading/"/>
      <updated>2014-06-27T00:00:00Z</updated>
      <id>https://arielsalminen.com/2014/molten-leading/</id>
      <content type="html">&lt;p&gt;Manually adjusting line-height with media queries for optimum readability across vast number of screen sizes can be hard. What makes it even harder, is, that instead of the screen width, the line-height should be relative to its container’s width and its font settings in order to achieve proper readability and appropriate spacing.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://twitter.com/wilto&quot;&gt;@Wilto&lt;/a&gt;, there has been a jQuery plugin called “Molten Leading” around for quite some time already which makes it possible to automate this process and define a minimum width at which the adjustment starts, a maximum element width where it stops, and a minimum and maximum line-height to adjust through.&lt;/p&gt;
&lt;p&gt;I wanted to use something similar in one of my latest projects, but I didn’t want to introduce new dependencies to external JavaScript libraries just because of this one feature. I also wanted something that would have a bit better performance, so I decided to write a custom version of Molten Leading without any library dependencies. All this is now available on GitHub too, so &lt;a href=&quot;https://github.com/arielsalminen/Molten-Leading&quot;&gt;take a look and give it a spin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;features&quot;&gt;Features &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/molten-leading/#features&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Automatically adjust line-height based on element width.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Works in all browsers, including &lt;span class=&quot;small-caps&quot;&gt;IE6&lt;/span&gt; and up.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Uses requestAnimationFrame for the best possible performance.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Free to use in both commercial and non-commercial projects.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Doesn’t require external JavaScript libraries.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Supports &lt;code&gt;px&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt; and &lt;code&gt;rem&lt;/code&gt; &lt;span class=&quot;small-caps&quot;&gt;CSS&lt;/span&gt; units.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Weighs only 1.17kb minified and Gzip’ed.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Supports multiple instances.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/img/blog/moltenleading.gif&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/moltenleading-static.png&quot; alt=&quot;Responsive Line Height&quot; style=&quot;max-width:500px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;download&quot;&gt;Download &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/molten-leading/#download&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/arielsalminen/Molten-Leading&quot; class=&quot;read-the-article&quot;&gt;Molten Leading on GitHub&lt;span&gt;→&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Interview With .Net Magazine</title>
      <link href="https://arielsalminen.com/2014/interview-with-.net-magazine/"/>
      <updated>2014-05-01T00:00:00Z</updated>
      <id>https://arielsalminen.com/2014/interview-with-.net-magazine/</id>
      <content type="html">&lt;p&gt;I was recently interviewed by .Net Magazine (in issue 254) about how web experts manage cross-platform testing. There’s a quote from me in the article that I think is interesting:&lt;/p&gt;
&lt;blockquote&gt;“I believe in testing on real devices. Software simulators can be useful, but in the end they can only do that: simulate the experience. At home, I use a setup with six physical devices running continuously when I&#39;m designing something. I also tend to visit the nearby Open Device Lab a few times to make sure that everything works on a wider range of devices.”&lt;/blockquote&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://www.creativebloq.com/netmag/how-do-web-experts-manage-cross-platform-testing-51411505&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Fixed Single Page Navigation</title>
      <link href="https://arielsalminen.com/2014/fixed-single-page-navigation/"/>
      <updated>2014-03-03T00:00:00Z</updated>
      <id>https://arielsalminen.com/2014/fixed-single-page-navigation/</id>
      <content type="html">&lt;p&gt;Today, we are open sourcing the JavaScript code and the assets we used to build the responsive navigation on &lt;a href=&quot;https://github.com/adtile/fixed-nav&quot;&gt;Adtile’s website&lt;/a&gt;. The code and examples are hosted on GitHub and can be found &lt;a href=&quot;https://github.com/adtile/fixed-nav&quot;&gt;from here&lt;/a&gt;. There’s a live example too, under Adtile’s site, &lt;a href=&quot;https://github.com/adtile/fixed-nav&quot;&gt;give it a spin&lt;/a&gt;. Read more about the features provided from the link below.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://github.com/adtile/fixed-nav&quot; target=&quot;_blank&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>A Dive Into Plain JavaScript</title>
      <link href="https://arielsalminen.com/2014/a-dive-into-plain-javascript/"/>
      <updated>2014-01-16T00:00:00Z</updated>
      <id>https://arielsalminen.com/2014/a-dive-into-plain-javascript/</id>
      <content type="html">&lt;p&gt;While I’ve worked over a decade building various web services and systems, it has only been the past 3 years that I’ve started learning more on how to work with plain JavaScript, instead of using jQuery or similar libraries as the starting point when it comes to interactivity. The fact that I’m learning a dozen new things every day now, has made working on &lt;a href=&quot;http://www.adtile.me/&quot;&gt;Adtile’s JavaScript &lt;span class=&quot;small-caps&quot;&gt;SDK&lt;/span&gt;&lt;/a&gt; feel more like building an open source project than actual work, and I have to say I like that a lot.&lt;/p&gt;
&lt;p&gt;Today, I’m going to share some of the basic things I’ve learned during the past years, which will hopefully also help you to dive into the world of plain JavaScript, making it easier to decide whether or not you will need jQuery in your next project.&lt;/p&gt;
&lt;h2 id=&quot;progressive-enhancement&quot;&gt;Progressive Enhancement &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#progressive-enhancement&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While libraries like &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; help to forget most of the browser inconsistencies, you really become familiar with them once you start using plain JavaScript for everything. To avoid writing JavaScript that’s full of browser hacks and code which only solves browser compatibility issues, I recommend building a progressively enhanced experience using feature detection to only target the more modern browsers. This doesn’t mean that browsers like &lt;span class=&quot;small-caps&quot;&gt;IE7&lt;/span&gt; don’t see anything at all, it just means that they get a more basic experience without JavaScript enhancements.&lt;/p&gt;
&lt;h3 id=&quot;here%E2%80%99s-how-we%E2%80%99re-doing-it&quot;&gt;Here’s How We’re Doing It &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#here%E2%80%99s-how-we%E2%80%99re-doing-it&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We have a separate JavaScript partial which has all the feature tests. The actual list of tests is often much longer, but let’s get back to this a bit later. To rule out some of the older browsers we use these two tests:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; test &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;addEventListener&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;querySelectorAll&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;querySelectorAll&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, in the main application partial, we detect if these features are supported by using this simple &lt;code&gt;if&lt;/code&gt; statement below. If they aren’t supported, the browser won’t execute any of this code:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;querySelectorAll&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These two tests make sure that we have a native way of using &lt;span class=&quot;small-caps&quot;&gt;CSS&lt;/span&gt; selectors in our JavaScript &lt;code&gt;(querySelectorAll)&lt;/code&gt;, a way to easily add and remove events &lt;code&gt;(addEventListener)&lt;/code&gt; and also that the browser’s standards support is better than what &lt;span class=&quot;small-caps&quot;&gt;IE8&lt;/span&gt; has. Read more about this technique called “Cutting the mustard” from &lt;a href=&quot;http://responsivenews.co.uk/post/18948466399/cutting-the-mustard&quot;&gt;BBC’s blog&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;browser-support&quot;&gt;Browser Support &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#browser-support&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here’s a rough list of the browsers which support the features we are testing, and will hence keep executing the JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;span class=&quot;small-caps&quot;&gt;IE9+&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Firefox 3.5+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Opera 9+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Safari 4+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Chrome 1+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;iPhone and iPad iOS1+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Android phone and tablets 2.1+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Blackberry &lt;span class=&quot;small-caps&quot;&gt;OS6+&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Windows 7.5+&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mobile Firefox&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Opera Mobile&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-basics%2C-plain-javasript-way&quot;&gt;The Basics, Plain JavaSript Way &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#the-basics%2C-plain-javasript-way&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s start looking how the most basic and often needed functionalities work in plain JavaScript, compared to jQuery. For each example, I’m going to provide both the jQuery and plain JavaScript approach.&lt;/p&gt;
&lt;h3 id=&quot;document-ready&quot;&gt;Document Ready &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#document-ready&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With jQuery, many are probably used to using &lt;code&gt;document.ready&lt;/code&gt; like so:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But did you know that you can just put all of your JavaScript at the bottom of your page and that does basically the same thing? JavaScript has also an event listener for the DOM content loaded event which you can use instead of jQuery’s document.ready:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DOMContentLoaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;selectors-api&quot;&gt;Selectors API &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#selectors-api&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;JavaScript’s native selectors API is very good. It works with CSS selectors and is very similar to what jQuery provides. If you are used to writing this in jQuery:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can now replace that with:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or, to select all div’s inside some container:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; elements &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.container div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also query against a specific element to find it’s children:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; navigation &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;nav&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; navigation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quite straightforward, easy to understand, and doesn’t really require much more writing now does it? To go a little further, we could even build a tiny JavaScript library for ourselves for simple DOM querying. Here’s something that Andrew Lunny &lt;a href=&quot;http://remysharp.com/2013/04/19/i-know-jquery-now-what/#backToTheFutureToday-heading&quot;&gt;has came up with&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This gives us simple dollar function and event binding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token class-name&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;on &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This is how you use it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.element&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;touchstart&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleTouch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;traversing-the-dom&quot;&gt;Traversing the DOM &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#traversing-the-dom&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Traversing the DOM with plain JavaScript is a bit harder than it is with jQuery. But not too hard. Here are some simple examples:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Getting the parent node&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; parent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentNode&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Getting the next node&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; next &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nextSibling&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Getting the previous node&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; next &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;previousSibling&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Getting the first child element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; child &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;children&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Getting the last child&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; last &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lastElementChild&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;adding-and-removing-classes&quot;&gt;Adding and Removing Classes &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#adding-and-removing-classes&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With jQuery, adding, removing and checking if an element has certain classes is really simple. It’s a bit more complex with plain JavaScript, but not too much so. Giving element a class called &lt;code&gt;&amp;quot;foo&amp;quot;&lt;/code&gt; and replacing all the current classes:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Select an element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.some-class&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Give class &quot;foo&quot; to the element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding a class without replacing the current classes:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Removing &lt;code&gt;&amp;quot;no-js&amp;quot;&lt;/code&gt; class from html-element and replacing it with &lt;code&gt;&amp;quot;js&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;no-js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;……&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That was quite straightforward, right? Next step, removing only certain classes, is a bit more complex. I’ve been using this small helper function in a separate partial called util.js. It takes 2 parameters: element and the class you want to remove:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// removeClass, takes two params: element and classname&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; reg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(&#92;&#92;s|^)&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; cls &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(&#92;&#92;s|$)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;(^&#92;s*)|(&#92;s*$)&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, in the main application partial, I’ve been using it like so:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you also want to check an element against some class, kind of like jQuery’s &lt;code&gt;hasClass&lt;/code&gt; works, you could add this in your utils:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// hasClass, takes two params: element and classname&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hasClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(&#92;&#92;s|^)&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; cls &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(&#92;&#92;s|$)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…and use it like so:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Check if an element has class &quot;foo&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Show an alert message if it does&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Element has the class!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;introducing-html5-classlist-api&quot;&gt;Introducing HTML5 classList API &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#introducing-html5-classlist-api&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you only need to support more modern browsers like IE10+, Chrome, Firefox, Opera and Safari, you could also start using HTML5’s classList functionality which makes adding and removing classes even easier.&lt;/p&gt;
&lt;p&gt;This is something, that I ended up doing with our latest Developer Docs, as the functionality I was developing, was more like an enhancement to the UI and not really something that would break the experience if it wasn’t present.&lt;/p&gt;
&lt;p&gt;You can detect if the browser supports the classList API by using this simple &lt;code&gt;if&lt;/code&gt; statement:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;classList&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// classList is supported, now do something with it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding, removing and toggling classes with classList:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Adding a class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Removing a class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Checking if has a class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Toggle a class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toggle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;active&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One other benefit of using classList is that it will perform much better than using the raw className property. If you had an element like this:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one two three&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which you’d want to manipulate:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;addClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;two&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;four&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For each of these methods the className property would be read from and then written to, triggering a browser repaint. However, this is not the case if we use the relevant classList methods instead:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;two&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;four&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With classList the underlying className is only altered when necessary. Given that we are adding a class that is already present and removing a class that isn’t, the className is never touched, meaning we’ve just avoided two repaints!&lt;/p&gt;
&lt;h3 id=&quot;event-listeners&quot;&gt;Event Listeners &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#event-listeners&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Adding and removing event listeners from elements is almost as simple in plain JavaScript as it’s in jQuery. Things get a bit more complex when you have to add multiple event listeners, but I’ll explain that in a bit. The simplest example, which will just pop out an alert message when an element is clicked, is as follows:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;You clicked&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To achieve this same functionality on all of the elements on a given page, we have to loop through each element, and give them all eventListeners:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Select all links&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// For each link element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;links&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Add event listener&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;You clicked&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One of JavaScript’s greatest features related to event listeners is the fact that &lt;code&gt;addEventListener&lt;/code&gt; can take an object as a second argument that will automatically look for a method called &lt;code&gt;handleEvent&lt;/code&gt; and call it. &lt;a href=&quot;https://twitter.com/ryanseddon&quot;&gt;Ryan Seddon&lt;/a&gt; has covered this technique thoroughly &lt;a href=&quot;http://www.thecssninja.com/javascript/handleevent&quot;&gt;in his article&lt;/a&gt;, so I’m just gonna give a fast example and you can read more about it from his blog:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; object &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function-variable function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;touchstart&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function-variable function&quot;&gt;handleEvent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;touchstart&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token function-variable function&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Clicked or touched!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Init&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;manipulating-the-dom&quot;&gt;Manipulating the DOM &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#manipulating-the-dom&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Manipulating the DOM with plain JavaScript might sound like a horrible idea at first, but it really isn’t much more complex that using jQuery. Below, we have an example that selects an element from the DOM, clones it, manipulates the clone’s styles with JavaScript and then replaces the original element with the manipulated one.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Select an element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.class&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Clone it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; clone &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Do some manipulation off the DOM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;clone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;background &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Replaces the original element with the new cloned one&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentNode&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replaceChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;clone&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don’t want to replace anything in the DOM, but instead append the newly created div inside the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;, you could do it like this:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;clone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you feel like you’d want to read even more about different DOM methods, I’d suggest you to head over to Peter-Paul Koch’s &lt;a href=&quot;http://quirksmode.org/dom/core/&quot;&gt;DOM Core tables&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;diving-deeper&quot;&gt;Diving Deeper &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#diving-deeper&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m going to share two bit more advanced techniques here, which I’ve recently discovered. These are both functionalities we have needed while building &lt;a href=&quot;http://www.adtile.me/&quot;&gt;Adtile&lt;/a&gt;, so you might find these useful too.&lt;/p&gt;
&lt;h3 id=&quot;determining-max-width-of-responsive-images-in-js&quot;&gt;Determining Max-Width of Responsive Images in JS &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#determining-max-width-of-responsive-images-in-js&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is one of my own favorites, and it’s very useful if you ever need to manipulate fluid images with JavaScript. As browsers return the current &lt;strong&gt;resized&lt;/strong&gt; dimensions of an image by default, we have to come up with some other solution. Luckily, modern browsers now have a way of doing this:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; maxWidth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;naturalWidth&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will give us image’s &lt;code&gt;max-width: 100%&lt;/code&gt; value in pixels and it’s supported in IE9, Chrome, Firefox, Safari and Opera. We can also take this further and add support for older browsers by loading the image into an in-memory object:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Get image&#39;s max-width:100%; in pixels&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMaxWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; maxWidth&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Check if naturalWidth is supported&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;naturalWidth &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    maxWidth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;naturalWidth&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Not supported, use in-memory solution as fallback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; image &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    maxWidth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Return the max-width&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; maxWidth&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should note that the images must be fully loaded before checking for the width. This is what we’ve been using to make sure they have dimensions:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hasDimensions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;complete &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;naturalWidth &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;undefined&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;determining-if-an-element-is-in-the-viewport&quot;&gt;Determining if an Element is in the Viewport &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#determining-if-an-element-is-in-the-viewport&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can get the position of any element on the page using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect&quot;&gt;getBoundingClientRect&lt;/a&gt; method. Below is a simple function showing how simple and powerful it can be. This function takes one parameter, which is the element you want to check. It will return true when the element is visible:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Determine if an element is in the visible viewport&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isInViewport&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rect &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; html &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;top &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;left &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bottom &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHeight &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; html&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clientHeight&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;right &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerWidth &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; html&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clientWidth&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above function could be used by adding a &amp;quot;scroll&amp;quot; event listener to the window and then calling &lt;code&gt;isInViewport()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2014/a-dive-into-plain-javascript/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whether or not you should use &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; in your next project depends a lot on what you are building. If it’s something that requires large amounts of front-end code, you should probably use it. However, if you’re building a JavaScript plugin or a library, you might want to consider sticking with just plain JavaScript. Using plain JavaScript means fewer requests and less data to load. It also means that you aren’t forcing developers to add jQuery to their project just because of that dependency.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>A New Path</title>
      <link href="https://arielsalminen.com/2013/a-new-path/"/>
      <updated>2013-05-07T00:00:00Z</updated>
      <id>https://arielsalminen.com/2013/a-new-path/</id>
      <content type="html">&lt;p&gt;Today, after over two years, I’ll be leaving my position at &lt;a href=&quot;http://kiskolabs.com/&quot;&gt;Kisko Labs&lt;/a&gt;. I’ve started working on a new responsive advertising solution for smartphones and tablets called &lt;a href=&quot;http://www.adtile.me/&quot;&gt;Adtile&lt;/a&gt;. Another big news is, that we have just received a $2.7 million funding to bring this product to the market. There’s also a story about us on &lt;a href=&quot;http://techcrunch.com/2013/05/07/tenfarms-adtile-funding/&quot;&gt;TechCrunch&lt;/a&gt;, so check that out.&lt;/p&gt;
&lt;p&gt;Banner ads might still function well in print, but it’s clear that they just don’t work on screen and especially on mobile devices anymore. Instead of trying to make the current model work somehow, we decided to start with an entirely new idea and ditch the old model—and the annoying banners. As we are focusing on mobile and building a customizable &lt;span class=&quot;small-caps&quot;&gt;SDK&lt;/span&gt; for both web and native app developers, we will be also building another device lab soon only for this purpose.&lt;/p&gt;
&lt;p&gt;The company where I’ll be working at, &lt;a href=&quot;http://www.tenfarms.com/&quot;&gt;TenFarms&lt;/a&gt;, is based in Los Angeles, so I will be most likely spending time in the &lt;span class=&quot;small-caps&quot;&gt;US&lt;/span&gt; a lot more too. Besides Adtile, I’ll be soon revamping the whole web presence of our second product, &lt;a href=&quot;http://www.photopoll.me/&quot;&gt;Photopoll&lt;/a&gt; iOS application too.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://devicelab.fi/&quot;&gt;Helsinki Device Lab&lt;/a&gt;, which I established about 10 months ago, will still stay at the Kisko Labs offices and I will be still maintaining it together with the Kisko guys, so that’s one thing which won’t change because of all this. The Helsinki Device Lab will also soon be at the &lt;a href=&quot;http://webshaped.fi/&quot;&gt;Webshaped conference&lt;/a&gt;, so come say hello if you are coming there.&lt;/p&gt;
&lt;p&gt;Kudos to everyone at Kisko Labs and thank you for the past years! I don’t think that I’ve ever been so productive or learned so much new in such a little time. That’s all because of y’all. I will miss you a lot, but will also be visiting the office occasionally to check the devices, do some testing, and to have a chat &amp;amp; tea with you.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/balloon.png&quot; alt=&quot;A Hot Air Balloon&quot; /&gt;
</content>
    </entry>
    
    <entry>
      <title>Plugin For Responsive Navigation</title>
      <link href="https://arielsalminen.com/2013/responsive-nav-plugin/"/>
      <updated>2013-04-09T00:00:00Z</updated>
      <id>https://arielsalminen.com/2013/responsive-nav-plugin/</id>
      <content type="html">&lt;p&gt;Responsive Nav is a tiny JavaScript plugin which weighs only 1.6&lt;span class=&quot;small-caps&quot;&gt;KB&lt;/span&gt; minified and Gzip’ed, and helps you to create a toggled navigation for small screens. It uses touch events and &lt;span class=&quot;small-caps&quot;&gt;CSS&lt;/span&gt;3 transitions for the best possible performance.&lt;/p&gt;
&lt;p&gt;It also contains a “clever” workaround that makes it possible to transition to height: auto, which isn’t normally possible with &lt;span class=&quot;small-caps&quot;&gt;CSS&lt;/span&gt;3 transitions. The plugin, along the site, was released today on &lt;a href=&quot;http://www.smashingmagazine.com/2013/04/09/javascript-plugin-for-responsive-navigation/&quot;&gt;Smashing Magazine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;http://www.smashingmagazine.com/2013/04/09/javascript-plugin-for-responsive-navigation/&quot; target=&quot;_blank&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Prototyping Responsive Typography</title>
      <link href="https://arielsalminen.com/2013/prototyping-responsive-typography/"/>
      <updated>2013-02-25T00:00:00Z</updated>
      <id>https://arielsalminen.com/2013/prototyping-responsive-typography/</id>
      <content type="html">&lt;p&gt;The history of typography dates back about 5,000 years. It starts from a series of pictograms, which then evolved to hieroglyphs in Egypt and later around 1,200&lt;span class=&quot;small-caps&quot;&gt;BC&lt;/span&gt; to Phoenician alphabets. Almost 2,500 years later the Chinese invented first movable type which later revolutionized everything in the west when Gutenberg invented latin movable type. Many of the basic concepts of typesetting are still the same as 500 years ago.&lt;/p&gt;
&lt;p&gt;Web typography, and digital typography in general, is a huge step forward in this history. It has made setting type fast and easy compared with hand-setting metal type. Responsiveness, when added on top of this, makes this period of change we are living very fascinating. Not only is centuries old design theory being rewritten, but the process of how design happens is now changing too (as Mark Boulton &lt;a href=&quot;http://www.markboulton.co.uk/journal/theinbetween&quot;&gt;states it&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;When talking about “responsive typography,” I don’t just mean flexible body text, but also that all our decisions should be based on universality. Universality, as a design principle, should guide us when choosing web fonts and when testing how our type works on various devices and platforms. It should be the core principle behind all the work we do.&lt;/p&gt;
&lt;img src=&quot;https://arielsalminen.com/img/blog/letterpress.jpg&quot; class=&quot;image-padding&quot; alt=&quot;Movable Type&quot; /&gt;
&lt;h2 id=&quot;new-process&quot;&gt;New Process &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#new-process&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;About a year ago I wrote &lt;a href=&quot;https://arielsalminen.com/2012/responsive-workflow/&quot;&gt;Responsive Workflow&lt;/a&gt; article describing my responsive design process. It was an article that gathered a lot of buzz, but I think it just scratched the surface a bit and never really tried to fully describe what’s happening behind the curtains. In this article I’m going to open the curtain and explain a new phase which I would today add to my year old workflow drawing. The new design phase is somewhere between prototyping and visual design phases, and I call it the “Typography Prototyping Phase.”&lt;/p&gt;
&lt;p&gt;As I earlier in that article wrote, typography for the Web is really hard to design anywhere else than inside the browser. This is today even more true than it was a year ago. Typography prototype tries to solve this by doing the hard choices before jumping to other tools like Photoshop.&lt;/p&gt;
&lt;p&gt;Basically, a typography prototype is a single web page that consists of the project’s actual content. It’s designed in the browser using real web fonts and tools like &lt;a href=&quot;http://typecast.com/&quot;&gt;Typecast&lt;/a&gt;. A typography prototype includes font choices, styles for the basic text content and a typographic scale, but nothing else.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Content precedes design. Design in the absence of content is not design, it&#39;s decoration.”&lt;/p&gt;
&lt;p&gt;– Jeffrey Zeldman&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;planting-the-seed&quot;&gt;Planting the seed &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#planting-the-seed&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All our decisions should start from the content out, not canvas in. This means we shouldn’t start doing any design work before having the project’s actual content on hand (or something that is very near the actual content). That’s because the content and the language used has a big impact on how our typography will work. This is especially true with display type and headers, but also with paragraphs and line-lengths. Having the real content also helps to judge if the font choices fit the mood correctly.&lt;/p&gt;
&lt;p&gt;Below is an example of what the typography prototype looks like before any styles have been applied. This basic &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; page is already responsive on its own—by default, like Andy Hume &lt;a href=&quot;http://blog.andyhume.net/responsive-by-default/&quot;&gt;states it&lt;/a&gt;, so you can immediately start testing how it works on various devices:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/example1.jpg&quot; class=&quot;image-padding&quot; alt=&quot;Typography prototype, example 1&quot; /&gt;
&lt;h2 id=&quot;choosing-typefaces&quot;&gt;Choosing typefaces &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#choosing-typefaces&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Choosing type combinations, which are legible and readable across multiple devices and operating systems isn’t easy. Windows &lt;span class=&quot;small-caps&quot;&gt;XP&lt;/span&gt;, which still has relatively high usage percent globally (24.29% at the moment of writing), is notorious for its poor font rendering. By default it doesn’t have ClearType antialiasing on at all, except in &lt;span class=&quot;small-caps&quot;&gt;IE8&lt;/span&gt;. Fonts which haven’t been properly hinted for use on screen, tend to look like this when viewed there:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/winxp_rendering.png&quot; class=&quot;image-padding&quot; alt=&quot;Windows XP rendering&quot; /&gt;
&lt;p&gt;When choosing typefaces for the Web you should look out for the following qualities: Style and form, How easy it is to read, typeface’s intended usage—is it meant for longform reading or is it a display type, it’s character set, file size, OpenType font features, how it renders on different screens and if it is hinted for screen or not. Some good tools which can help with the process are &lt;a href=&quot;http://webfontspecimen.com/&quot;&gt;Web Font Specimen&lt;/a&gt;, &lt;a href=&quot;http://typecast.com/&quot;&gt;Typecast app&lt;/a&gt; and &lt;a href=&quot;https://typekit.com/fonts&quot;&gt;Typekit’s font browser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It’s important that we choose the typefaces before making any other decisions about the layout. This way we can later on determine what the optimal font sizes are for the project, based on how the selected typefaces render at different sizes. Below is an example of what the typography prototype looks like on various platforms after the typefaces have been picked and we start testing how they actually render:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/example2.jpg&quot; class=&quot;image-padding&quot; alt=&quot;Typography prototype, example 2&quot; /&gt;
&lt;h3 id=&quot;useful-resources%3A&quot;&gt;Useful Resources: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#useful-resources%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thinkingwithtype.com/contents/letter/#Mixing_Typefaces&quot;&gt;Thinking with type: Mixing Typefaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.kaelig.fr/post/33373448491/testing-font-face-support-on-mobile-and-tablet&quot;&gt;@font-face Support on Mobile and Tablet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jordanm.co.uk/tinytype&quot;&gt;Default system fonts across different mobile platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://typekit.com/lists/good-for-longform&quot;&gt;Typekit: Good for longform reading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fontdeck.com/typefaces/all/tags/handhinted/&quot;&gt;Fontdeck: Hand hinted fonts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;choosing-a-scale&quot;&gt;Choosing a scale &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#choosing-a-scale&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A scale, or more precisely, a modular scale, is a sequence of numbers that relate to one another in a meaningful way. A modular scale helps us to choose font sizes, line heights, margins, and more. Modular scales also make it easier to achieve a visual harmony in the whole design.&lt;/p&gt;
&lt;p&gt;I recommend calculating typographic scales using the ideal text size of the chosen body typeface + a ratio, which could for example be the Golden Ratio 1:1.618. I tend to use either Tim Brown’s &lt;a href=&quot;http://modularscale.com/&quot;&gt;Modular Scale Calculator&lt;/a&gt; to build a custom scale, or, if the sizes match, the scale described in my previous typography &lt;a href=&quot;https://arielsalminen.com/2012/on-typography/&quot;&gt;article&lt;/a&gt;:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/scale.png&quot; alt=&quot;Typographic scale&quot; /&gt;
&lt;p&gt;Tim, who also made the calculator I just mentioned, has written an in-depth guide about modular scales and how to use them on the Web. Tim’s methods are very similar to the ones I use myself too, and this is a short excerpt from his &lt;a href=&quot;http://alistapart.com/article/more-meaningful-typography&quot;&gt;article&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sizing type on the web is tricky because of the limited resolution involved. One pixel of font-size up or down can completely change how a typeface—and thus a whole text—looks. But once I found the size I liked, 18px, I had a number upon which to base my modular scale.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;sizing-type&quot;&gt;Sizing type &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#sizing-type&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are no absolute sizes when it comes to measuring web type. Everything is relative. That’s why you should avoid using absolute values like pixels and instead &lt;a href=&quot;http://filamentgroup.com/lab/how_we_learned_to_leave_body_font_size_alone/&quot;&gt;embrace the fluid nature&lt;/a&gt; of the Web using units like percents and EMs. The size of the type you should use depends on the reading distance, device’s resolution and the typeface used. Reading distance also varies depending on the device used—is it a device held in hand, is it a tablet or is it a desktop device? Or maybe it’s something in between these?&lt;/p&gt;
&lt;p&gt;A good starting point is to set the body font-size initially to 100%, which zeroes our scales to the “normal” of a given environment and then design and build for larger screens from that point upwards by using the modular scale we calculated earlier.&lt;/p&gt;
&lt;p&gt;I do this by using a function in &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; which automatically converts pixels to EMs so that I don’t have to manually calculate them. The function below works by taking two arguments, pixels and context. You can either use the default context and specify only the pixels you want to convert—or you can specify pixels and a context for the conversion:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;browser-context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; // Default&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$pixels&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $&lt;span class=&quot;token property&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $browser-context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@return&lt;/span&gt; #&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$pixels/$context&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;em&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…and then later in the CSS we can just pick numbers from the scale, 16/24/72, and they get automatically converted to EMs:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;p.intro&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;24&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;72&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Below is an example of what the typography prototype looks like now, when we have our scale and have applied some base font sizes from that, but haven’t really tweaked the leading or margins at all:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/example3.jpg&quot; alt=&quot;Typography prototype, example 3&quot; /&gt;
&lt;h2 id=&quot;leading-and-white-space&quot;&gt;Leading and white space &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#leading-and-white-space&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Leading (line-height in CSS) is the vertical distance between baselines of two lines of text. Leading has a big impact on the readability of a paragraph, so we should be careful when adjusting it. We should use tighter leading in a narrower paragraph, and looser in a wider one. This is to aid the readability and can be achieved by changing the line-height inside our media queries, or by using Mat Marquis’s plugin called &lt;a href=&quot;http://nicewebtype.com/notes/2012/02/03/molten-leading-or-fluid-line-height/&quot;&gt;Molten Leading&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;High &lt;span class=&quot;small-caps&quot;&gt;DPI&lt;/span&gt; screens add some extra complexity as they &lt;a href=&quot;https://twitter.com/jonikorpi/status/301329149946114048&quot;&gt;tend to require&lt;/a&gt; different line-heights than the lower &lt;span class=&quot;small-caps&quot;&gt;DPI&lt;/span&gt; screens. Joni Korpi &lt;a href=&quot;https://twitter.com/jonikorpi/status/301437326209449984&quot;&gt;thinks&lt;/a&gt; this is because the text looks visually thinner with the extra pixels in use. Less weight = less line height needed.&lt;/p&gt;
&lt;p&gt;In the example below, I’ve adjusted the leading of the header, para­graphs, margins, and also the line lengths to be more comfortable to the eye. Everything is based on the numbers found from the scale I created earlier. The example you see here is now basically a ready typography prototype which can be used as the base for the rest of our work:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/example4.jpg&quot; alt=&quot;Typography prototype, example 4&quot; /&gt;
&lt;h2 id=&quot;additional-tips&quot;&gt;Additional Tips &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#additional-tips&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Screens with different pixel densities require different grades of the same font, just like different papers in print do. In theory, this is a great idea, but in reality, there aren’t that many &lt;a href=&quot;http://typophile.com/node/81483&quot;&gt;fonts which would have grades&lt;/a&gt; (and hardly any have been designed for screen use). Newspapers have been using graded fonts for different papers for a long time, but it’s a quite &lt;a href=&quot;http://informationarchitects.net/blog/responsive-typography/&quot;&gt;new concept&lt;/a&gt; on the Web.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sometimes using different body fonts for different screen types is better than using the same font all the way. A List Apart’s new redesign is &lt;a href=&quot;http://alistapart.com/blog/post/a-list-apart-5-01&quot;&gt;experimenting&lt;/a&gt; with this idea. They are using Georgia Pro Condensed in the smallest breakpoint, to see if layouts are enhanced by fitting in more characters per line.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;If needed, use non-breaking spaces between last two words to avoid orphans in fluid paragraphs (&amp;amp;nbsp;).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Always use non-breaking spaces in expressions in which figures and abbreviations are separated by a space (e.g. 20 kg, 4:00 pm) and where text breaking across two lines might be disruptive to the reader.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Try to keep the line length between 45-75 characters per line.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2013/prototyping-responsive-typography/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The finished typography prototype will be used as the foundation for the rest of our work. We have the recipe, and now we need to start thinking how the colours and the layout will be cooked. This way, when we start our work from the most crucial parts—the content and the typography—and build everything else up from that point, there’s much less chance that we will get lost along the way.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>File Upload Support on Mobile</title>
      <link href="https://arielsalminen.com/2012/file-upload-support-on-mobile/"/>
      <updated>2012-12-18T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/file-upload-support-on-mobile/</id>
      <content type="html">&lt;p&gt;I were quite surprised few weeks ago when I found out with &lt;a href=&quot;http://twitter.com/matiaskorhonen&quot;&gt;Matt&lt;/a&gt;, my colleague, that no one has tested thoroughly which mobile browsers support input type=file and how to reliably detect the support. After an hour of Googling we literally gave up and decided to find it out ourselves. The results are shared here to everyone for future reference.&lt;/p&gt;
&lt;p&gt;For the detection part, I am using similar code as &lt;a href=&quot;http://modernizr.com/&quot;&gt;Modernizr&lt;/a&gt; does, but I’ve added a separate user agent regexp to check against browsers that falsely report support. There are quite many of those false positives really, at least all Windows Phone devices running &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; 7.0-8.0, Android devices running &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; 1.0-2.2, Kindle devices running &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; 1.0-3.0 and all WebOS devices running &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; 1.0-3.0.5 (Although the latter ones being quite old already).&lt;/p&gt;
&lt;h2 id=&quot;testing&quot;&gt;Testing &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/file-upload-support-on-mobile/#testing&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For the testing part, I used &lt;a href=&quot;https://arielsalminen.com/filetest/&quot;&gt;this page&lt;/a&gt; which was loaded on to all devices in our &lt;a href=&quot;http://devicelab.fi/&quot;&gt;device lab&lt;/a&gt;. Thanks to David Blooman, Juha Ristolainen and Mike Arvela, I were able to test this on older Blackberry devices, Windows RT tablet and on Windows Phone 8 too. Below is the JS part used for the detection, which can also be found &lt;a href=&quot;http://github.com/arielsalminen/isFileInputSupported.js&quot;&gt;from GitHub&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Detect file input support&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; isFileInputSupported &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Handle devices which falsely report support&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;userAgent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle&#92;/(1.0|2.0|2.5|3.0))&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// Create test element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; el &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;disabled&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Add &#39;fileinput&#39; class to html element if supported&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isFileInputSupported&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; fileinput&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Additionally, I tested manually on every device that the uploading actually works, and for that I used just basic html form:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.tipjar.com/cgi-bin/test&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;enctype&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;multipart/form-data&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;submit&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Upload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;test-results&quot;&gt;Test Results &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/file-upload-support-on-mobile/#test-results&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table class=&quot;responsive&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Works&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Android 1.0–2.1&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android 2.2+&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blackberry 1.0–5.0&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blackberry 6.0+&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blackberry Tablet 2.0+&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; 1.0&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 1.0–5.1.1&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 6.0–7.1.2&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 8.0&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 8.0.2+&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kindle 1.0–3.0&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maemo 5.0+&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meego 1.2+&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbian 9.1–10.1&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebOS 1.0–3.0.5&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Phone 7.0–8.0&lt;/td&gt;
&lt;td style=&quot;color:#ff7160&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Phone 8.1&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows RT&lt;/td&gt;
&lt;td style=&quot;color:#409349&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;notes&quot;&gt;Notes &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/file-upload-support-on-mobile/#notes&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Android devices which are running &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt;2.1 and under still support file uploads through Opera Mobile and Opera Mini, but not through the default Webkit based browser.&lt;/li&gt;
&lt;li&gt;Amazon Kindle Keyboard reports that it support file uploads, but when you click the “browse” button, the device displays an alert box saying “file uploads not supported.”&lt;/li&gt;
&lt;li&gt;On older Windows Phone &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; the file input shows up, but doesn’t respond to touch at all or give any kind of feedback that it isn’t supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/file-upload-support-on-mobile/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The support is actually quite good nowadays, Windows Phone &lt;span class=&quot;small-caps&quot;&gt;OS&lt;/span&gt; and older iOS being the biggest drawbacks. I were also quite surprised to notice that even our oldest Symbian devices from around 2004 supported file uploads. Also, with almost all of the test devices, if the upload worked on the default browser, it also worked on other browsers like Firefox Mobile and Opera Mobile/Mini too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 8 Jan 2013:&lt;/strong&gt; False positives on Modernizr are &lt;a href=&quot;https://github.com/Modernizr/Modernizr/issues/772&quot;&gt;now fixed&lt;/a&gt; and it&#39;s using the same &lt;span class=&quot;small-caps&quot;&gt;UA&lt;/span&gt; detection introduced in this post!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 28 Apr 2014:&lt;/strong&gt; Windows Phone 8.1 added.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Remote Preview</title>
      <link href="https://arielsalminen.com/2012/remote-preview/"/>
      <updated>2012-11-11T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/remote-preview/</id>
      <content type="html">&lt;p&gt;Remote preview is a tiny JavaScript based tool which I built for our &lt;a href=&quot;http://devicelab.fi/&quot;&gt;test lab&lt;/a&gt;. It allows you to preview any &lt;span class=&quot;small-caps&quot;&gt;URL&lt;/span&gt; on large number of mobile devices simultaneously. Just enter a &lt;span class=&quot;small-caps&quot;&gt;URL&lt;/span&gt;, hit enter, and new &lt;span class=&quot;small-caps&quot;&gt;URL&lt;/span&gt; gets automatically loaded on each device. Remote preview works on platforms like Android, Blackberry, iOS, Maemo, Meego, Symbian, Windows Phone and WebOS.&lt;/p&gt;
&lt;p&gt;Remote Preview works by making an ajax call every 1100ms to check if the url in the ‘url’ file is changed. If it is, the script will then change the src attribute of the iframe and load a new page into it. If there’s no changes, the script will just keep polling the url file until something changes. &lt;a href=&quot;https://github.com/arielsalminen/Remote-Preview&quot;&gt;Remote Preview&lt;/a&gt; allows very fast previewing of different &lt;span class=&quot;small-caps&quot;&gt;URL&lt;/span&gt;’s to check for possible layout problems, which can then be debugged using various other tools depending on the platform where they occur.&lt;/p&gt;
&lt;p&gt;There are some &lt;a href=&quot;https://github.com/arielsalminen/Remote-Preview#known-issues&quot;&gt;issues&lt;/a&gt; and limitations with the way it’s being done, but as there currently is no other tool which allows you to preview web pages on all these platforms, I think this can be a handy addition to any test lab’s toolset.&lt;/p&gt;
&lt;div class=&quot;video-container&quot;&gt;&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/7NvzRfyhd5Q&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;basic-usage&quot;&gt;Basic usage &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/remote-preview/#basic-usage&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Copy and paste all files to a public Dropbox folder/server/localhost, edit ‘url’ file and wait for devices to refresh. That’s all! You might also want to bookmark Remote Preview to your device’s home screen for fast &amp;amp; easy application like access later on (&lt;strong&gt;bonus:&lt;/strong&gt; If you moved all files to a server or localhost, you can control the devices via web browser by pointing your browser to the directory named ‘control’).&lt;/p&gt;
&lt;h2 id=&quot;browser-support&quot;&gt;Browser support &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/remote-preview/#browser-support&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Current version is tested to be working on at least:&lt;/p&gt;
&lt;table class=&quot;responsive&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Android 2.1 – 4.1.2&lt;/td&gt;
&lt;td&gt;Stock WebKit + Chrome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blackberry 7.0&lt;/td&gt;
&lt;td&gt;Stock Browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 4.2.1+&lt;/td&gt;
&lt;td&gt;Mobile Safari&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac &lt;span class=&quot;small-caps&quot;&gt;OS X&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Safari, Chrome, Firefox, Opera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maemo 5.0&lt;/td&gt;
&lt;td&gt;Stock WebKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meego 1.2&lt;/td&gt;
&lt;td&gt;Stock WebKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbian 3&lt;/td&gt;
&lt;td&gt;Stock WebKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbian Belle&lt;/td&gt;
&lt;td&gt;Stock WebKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebOS 3.0.5&lt;/td&gt;
&lt;td&gt;Stock WebKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Phone 7.5&lt;/td&gt;
&lt;td&gt;Internet Explorer Mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 7&lt;/td&gt;
&lt;td&gt;Internet Explorer 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;download&quot;&gt;Download &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/remote-preview/#download&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/arielsalminen/Remote-Preview&quot; class=&quot;read-the-article&quot;&gt;Remote Preview on GitHub&lt;span&gt;→&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Building A Device Stand</title>
      <link href="https://arielsalminen.com/2012/building-device-stand/"/>
      <updated>2012-11-05T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/building-device-stand/</id>
      <content type="html">&lt;p&gt;Not so long after the &lt;a href=&quot;http://devicelab.fi/&quot;&gt;device lab&lt;/a&gt; was born I realized that we need a much better way to store and charge all the 40+ devices. There didn’t seem to be any existing solution available which you could just buy, so I started thinking what would be the easiest way to do something like that myself. After some research I ran into this &lt;a href=&quot;http://www.64digital.co.uk/blog/66/the-64-digital-super-dooper-device-testing-station&quot;&gt;device testing station&lt;/a&gt; by 64 Digital and thought it looked like a perfect solution.&lt;/p&gt;
&lt;p&gt;The main idea is to provide a dynamic and secure way to store phones, tablets and other devices and make it possible to use them for testing without the need to actually remove them from the stand. Devices are held in place using Velcro tape which is attached both to the back of the phones and the stand. That makes it easy to detach the phones, but it also makes them stick securely to the wall. The whole stand system is done from two 800mm wide racks, and I’m planning to make a third one too so that we have available space to continue expanding our device collection.&lt;/p&gt;
&lt;p&gt;The wood materials for both racks cost under 30 euros. The Velcro tape was actually the most expensive part as 25 meters of it cost about 70 euros + shipping. I used two full work days to built these and third to paint them. I guess someone with actual experience might be a lot faster as about half of that time went into trial and error.&lt;/p&gt;
&lt;h3 id=&quot;see-the-process-below-and-grab-my-drawings%3A&quot;&gt;See the process below and grab my &lt;a href=&quot;https://arielsalminen.com/img/blog/drawings.pdf&quot;&gt;drawings&lt;/a&gt;: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/building-device-stand/#see-the-process-below-and-grab-my-drawings%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;a href=&quot;https://arielsalminen.com/img/blog/drawings.pdf&quot;&gt;
&lt;img alt=&quot;Stand drawings&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/0.png&quot; /&gt;
&lt;/a&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/1.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/1_2.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/2.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/3.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/4.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/5.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/6.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/7.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/8.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/9.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/10.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/11.jpg&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/12.jpg&quot; /&gt;
</content>
    </entry>
    
    <entry>
      <title>Establishing An Open Device Lab</title>
      <link href="https://arielsalminen.com/2012/establishing-open-device-lab/"/>
      <updated>2012-09-25T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/establishing-open-device-lab/</id>
      <content type="html">&lt;p&gt;I wrote an article to &lt;a href=&quot;http://www.smashingmagazine.com/2012/09/24/establishing-an-open-device-lab/&quot;&gt;Smashing Magazine&lt;/a&gt;. It’s an in-depth guide about how to establish an open device lab. The article gives practical tips about things like location, how to get devices, what devices to get and what software to use.&lt;/p&gt;
&lt;p&gt;It would not have been possible to write it without the help from Shaun Dunne, Jeremy Keith, David Blooman and Andre Jay Meissner. Thank you people, I owe you one.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;http://www.smashingmagazine.com/2012/09/24/establishing-an-open-device-lab/&quot; target=&quot;_blank&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Helsinki Open Device Lab</title>
      <link href="https://arielsalminen.com/2012/helsinki-open-device-lab/"/>
      <updated>2012-08-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/helsinki-open-device-lab/</id>
      <content type="html">&lt;p&gt;If you’ve been building websites during the past two years you must know that the web doesn’t live on a desk anymore. The reality is that we now need to test our work on multiple devices, instead of just few desktop browsers. All this is easier said than done. It&#39;s easy when you have a dozen devices laying on the desk in front of you, but what about the rest of us? Devices are expensive and the landscape is ever expanding.&lt;/p&gt;
&lt;p&gt;That is the reason why we decided to set up an open device lab to Kisko’s office. ‘Open’ meaning that anyone can pop round, use the devices freely and contribute by lending their old devices to us. The list isn’t very long yet, but it will grow over time. I am also planning to contact few device manufacturers to help us out here.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/jonikorpi&quot;&gt;Joni Korpi&lt;/a&gt; and I are leaving our spare devices at the office for testing purposes and we are hoping to see others to contribute too. &lt;a href=&quot;http://kiskolabs.com/&quot;&gt;Kisko Labs&lt;/a&gt; is also—in addition to the space—giving four devices for testing purposes. If you’ve got an old mobile device which you aren’t using anymore and it’s just gathering dust, then why not lend it to our lab. The device will of course remain yours all the time, and you can take it back whenever you want.&lt;/p&gt;
&lt;p&gt;I will post more info about the project either here or on Twitter once we get everything up and running. I also made a site for the lab which can be found at &lt;a href=&quot;http://devicelab.fi/&quot;&gt;devicelab.fi&lt;/a&gt;. Shout outs also to &lt;a href=&quot;http://twitter.com/adactio&quot;&gt;Jeremy Keith&lt;/a&gt; who started this whole ‘open device lab’ thing in the first place.&lt;/p&gt;
&lt;h3 id=&quot;how-things-are-looking-at-the-moment%3A&quot;&gt;How things are looking at the moment: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/helsinki-open-device-lab/#how-things-are-looking-at-the-moment%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/testlab.jpg&quot; alt=&quot;The Lab&quot; /&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/testlab2.jpg&quot; alt=&quot;The Lab, part 2&quot; /&gt;
&lt;h2 id=&quot;location&quot;&gt;Location &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/helsinki-open-device-lab/#location&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://kiskolabs.com/&quot;&gt;Kisko Labs&lt;/a&gt; is located downtown Helsinki, next to Katri Valas park. Our address is Vilhovuorenkatu 11D, 00500 Helsinki, FI. Before coming make sure we’re at the office by sending message to &lt;a href=&quot;http://twitter.com/kiskolabs&quot;&gt;@kiskolabs&lt;/a&gt; at least few days beforehand.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/map.png&quot; alt=&quot;Kisko Labs&#39; old location&quot; /&gt;
&lt;h2 id=&quot;current-devices&quot;&gt;Current devices &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/helsinki-open-device-lab/#current-devices&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Device list moved to &lt;a href=&quot;http://devicelab.fi/#devices&quot;&gt;devicelab.fi&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;our-wish-list&quot;&gt;Our wish list &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/helsinki-open-device-lab/#our-wish-list&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Android 3.x device&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SonyEricsson LT15i Xperia Arc&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Blackberry 5.x device&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Blackberry 6.x device&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Responsive Workflow</title>
      <link href="https://arielsalminen.com/2012/responsive-workflow/"/>
      <updated>2012-05-28T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/responsive-workflow/</id>
      <content type="html">&lt;p&gt;During the last week I was at the &lt;a href=&quot;http://webshaped.fi/&quot;&gt;Webshaped&lt;/a&gt; conference listening Stephen Hay’s talk about responsive design workflow. This post isn’t going to be strictly about that, but as Stephen’s way reminded somewhat the way I work myself, it made me want to write down some thoughts about my workflow and how it has evolved during the past two or three years and how it might still evolve in the future.&lt;/p&gt;
&lt;p&gt;About three or four years ago—when I mostly did just static width sites—my projects went through the different phases in the order illustrated below, which looks like a typical waterfall process. Back then there wasn’t much room for revisions, and what clients saw were either the wireframes or almost finished Photoshop designs.&lt;/p&gt;
&lt;img alt=&quot;Old workflow&quot; class=&quot;image-padding&quot; src=&quot;https://arielsalminen.com/img/blog/oldway.png&quot; /&gt;
&lt;p&gt;That model &lt;em&gt;kind of&lt;/em&gt; used to work back then, but now there’s just one problem. Waterfall model doesn’t make that much sense when combined with responsive design. Actually it wasn’t ever very optimal way to do web design, but as I and everyone around me were so used to delivering things in that specific order we never really tried to challenge that.&lt;/p&gt;
&lt;h2 id=&quot;the-new-way&quot;&gt;The new way &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#the-new-way&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the process I use today when doing responsive web design (illustrated below). I used Mark Boulton’s &lt;a href=&quot;http://www.markboulton.co.uk/journal/responsive-summit-workflow&quot;&gt;workflow article&lt;/a&gt; and Stephen Hay’s &lt;a href=&quot;http://www.slideshare.net/stephenhay/mobilism2012&quot;&gt;presentation&lt;/a&gt; as resources while writing this. My new process reminds more agile than waterfall model and I’m going to explain each step in more detail further on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workflow in short:&lt;/strong&gt; Starts from the content out and encourages to spend time to really think it through. After the first content drafts are done I convert them to &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; prototypes, open them up in a mobile browser, and look how the order of the content works there. I do sketching and visual design mostly before and after prototyping. After first sketches I usually go pretty fast back to the &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; prototype and start adding some &lt;span class=&quot;small-caps&quot;&gt;CSS&lt;/span&gt; to see how my ideas actually work. The whole process happens in iterations which usually go somewhat like this: sketch → prototype → design → test → discuss until it works. The order might not be this linear in reality, but I wanted to simplify my diagram for this article.&lt;/p&gt;
&lt;a href=&quot;https://arielsalminen.com/img/blog/workflow.png&quot;&gt;
&lt;img alt=&quot;New workflow&quot; class=&quot;image-padding&quot; src=&quot;https://arielsalminen.com/img/blog/workflow.png&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;discover&quot;&gt;Discover &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#discover&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first stage is about information gathering, getting to know the client and research work. The goal here is to gain better understanding of the client’s business, competitors and main goals of the project. Without proper knowledge it’s almost impossible to know what the client actually needs/wants.&lt;/p&gt;
&lt;p&gt;During this stage I ask a lot of questions like: “Why people would come to your site?”, “What is the main goal you are trying to achieve?”, “Who are your main competitors?” …and so on. You can get ideas on what to ask by browsing through project sheets of other design firms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://clearleft.com/canhelp/&quot;&gt;Clearleft’s Client Ideas Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.45royale.com/contact/rfp/&quot;&gt;45royale Inc’s Project Planner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.smashingmagazine.com/2010/11/26/web-design-questionnaires-project-sheets-and-work-sheets/&quot;&gt;Web Design Questionnaires, Project Sheets and Work Sheets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;plan&quot;&gt;Plan &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#plan&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Planning is done based on the knowledge that is gathered during the first stage. In this stage I usually start by refining the concept and move on to work on the user stories and the &lt;a href=&quot;http://www.guardian.co.uk/help/insideguardian/2010/feb/02/what-is-information-architecture&quot;&gt;information architecture&lt;/a&gt;. I also work on establishing and describing content elements, which can then be rated with a level of importance. Based on that importance we can then do rough &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; wireframes of the views. These last two steps are quite identical to Stephen’s workflow steps ‘Content inventory’ and ‘Content reference wireframes.’&lt;/p&gt;
&lt;h2 id=&quot;text-design&quot;&gt;Text design &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#text-design&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;margin-left:-0.3em;&quot;&gt;“&lt;/span&gt;Text design” here means that we write (design) all the contents of the website down in textual form. This is one of the most important stages in the whole process, and yet it’s probably also the most underrated step. I say this because in my opinion it doesn’t make much sense to go any further if we don’t have the actual content at hand. Content is the reason why people come to the website and the whole process should start from that.&lt;/p&gt;
&lt;p&gt;I often do this step in &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; without styles, as then we can instantly see how the content appears in a narrow single column layout and if the order is correct. This is also basically the way the site will be shown to users using screen readers.&lt;/p&gt;
&lt;p&gt;Keep in mind that it doesn’t have to be the final draft yet, as we can refine it during the prototyping. This step is also possible to accomplish using text documents which works almost equally well.&lt;/p&gt;
&lt;img alt=&quot;iA Writer application&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/markdown.jpg&quot; /&gt;
&lt;h2 id=&quot;sketch&quot;&gt;Sketch &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#sketch&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sketching ideas down is usually something which happens all the time, but it’s especially important before jumping to browser. I often test my sketches using the &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; text designs I did in the previous step (which basically mean that I add a few &lt;span class=&quot;small-caps&quot;&gt;CSS&lt;/span&gt; rules on top of them).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By spending a short time sketching you can save yourself hours on the computer. Not only will you save yourself hours, you may even afford yourself some peace of mind. (…) I challenge you to start employing sketching as a part of your process and you will see a dramatic decrease in the amount of times you hit that virtual wall of nothingness.”&lt;/p&gt;
&lt;p&gt;– Tara Roskell&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;prototype&quot;&gt;Prototype &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#prototype&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Prototyping early in &lt;span class=&quot;small-caps&quot;&gt;HTML/CSS&lt;/span&gt; is necessary as that’s the only way to truly see how the layout will respond to different viewport sizes. This also allows me to show the actual site much sooner to the client and react early to problems which the design might have.&lt;/p&gt;
&lt;p&gt;Unlike Stephen, I don’t really work on “breakpoint graphs” before the actual prototyping or design. It’s good to be aware of the various break­points and what works for different viewport sizes—or doesn’t, and it’s probably also a good idea to let the client know what the landscape is like, but I let the actual content in the browser to be the judge when making decisions.&lt;/p&gt;
&lt;p&gt;Below is a device breakpoint diagram which I did based on the &lt;a href=&quot;http://www.slideshare.net/yiibu/pragmatic-responsive-design&quot;&gt;Pragmatic responsive design&lt;/a&gt; by Stephanie Rieger and Metal Toad’s &lt;a href=&quot;http://www.metaltoad.com/blog/simple-device-diagram-responsive-design-planning&quot;&gt;Simple Device Diagram&lt;/a&gt;. I did it because I felt that the other one was too old and the other one was just completely missing Symbian devices which are quite popular around here (click the image to view a bigger &lt;span class=&quot;small-caps&quot;&gt;PDF&lt;/span&gt; version):&lt;/p&gt;
&lt;a href=&quot;https://arielsalminen.com/img/blog/device-map-2012.pdf&quot;&gt;
&lt;img class=&quot;image-padding&quot; src=&quot;https://arielsalminen.com/img/blog/breakpoints.png&quot; alt=&quot;Device breakpoint diagram&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;visual-design&quot;&gt;Visual Design &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#visual-design&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This step happens in iterations before and after &lt;a href=&quot;https://arielsalminen.com/2012/responsive-workflow/#workflow-prototype&quot;&gt;prototyping&lt;/a&gt;. I still use Photoshop to do most of the design, but I’m moving more and more towards design in a browser. Especially typography seems to be something which is really hard to get working anywhere else than inside the browser (Although at the same time I have noticed that if I do the jump too early, everything will end up looking flat, uninspiring and somehow cluttered).&lt;/p&gt;
&lt;p&gt;The most important part here is to use a tool which doesn’t restrain your creativity. It can be the browser, Photoshop, Fireworks, InDesign or anything else that feels right.&lt;/p&gt;
&lt;h2 id=&quot;test&quot;&gt;Test &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#test&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Introducing testing as a part of your process early will save you from having bigger problems later on. Just look at the &lt;a href=&quot;https://arielsalminen.com/img/blog/device-map-2012.pdf&quot;&gt;device breakpoint diagram&lt;/a&gt; I did and add all the browser quirks on top of that, and you should start to understand why it&#39;s almost impossible to build responsive sites without testing them on a number of actual devices. Testing should also include user testing as that’s really the easiest way to see how the prototype actually works in terms of usability and which parts of it might still need work.&lt;/p&gt;
&lt;p&gt;I mostly do all the testing with the devices I already have, but sometimes there’s a real need to bring in new devices or even go to a store and do some field testing there. That doesn’t cost anything, at least not yet…&lt;/p&gt;
&lt;img alt=&quot;Mobile devices&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/devices.jpg&quot; /&gt;
&lt;h2 id=&quot;discuss&quot;&gt;Discuss &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#discuss&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Discuss with the client during all iterations. Present the actual &lt;span class=&quot;small-caps&quot;&gt;HTML&lt;/span&gt; prototypes to the client and show how they work on actual devices. Avoid &lt;strong&gt;‘The Big Reveal’&lt;/strong&gt; like &lt;a href=&quot;http://www.markboulton.co.uk/journal/responsive-summit-workflow&quot;&gt;Mark Boulton said&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;iterate&quot;&gt;Iterate &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#iterate&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sketch → prototype → design → test → discuss until it works.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is no perfect workflow. What works for me, might not work for everyone, and I have a feeling that the changes in my workflow are just the start of the transition. What I described here works best when designing websites (large or small) but it might need some adjustments to work well with web application design which is somewhat different (depending, of course, what kind of application it is).&lt;/p&gt;
&lt;h2 id=&quot;resources&quot;&gt;Resources &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/responsive-workflow/#resources&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/stephenhay/mobilism2012&quot;&gt;Responsive Design Workflow: Mobilism 2012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.markboulton.co.uk/journal/responsive-summit-workflow&quot;&gt;Mark Boulton on Responsive workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bradfrostweb.com/blog/mobile/bdconf-stephen-hay-presents-responsive-design-workflow/&quot;&gt;Brad Frost’s notes from Stephen’s talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/yiibu/pragmatic-responsive-design&quot;&gt;Pragmatic responsive design by Stephanie Rieger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cennydd.co.uk/2011/editing-tips-for-designers/&quot;&gt;Text editing tips for designers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.smashingmagazine.com/2012/05/18/quick-course-on-effective-website-copywriting/&quot;&gt;Quick course on effective website copywriting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://typecastapp.com/&quot;&gt;Typecast app – Design in the browser with web fonts and real content&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Update 12 Jun 2012:&lt;/strong&gt; This post has been &lt;a href=&quot;http://habrahabr.ru/post/145680/&quot;&gt;translated to Russian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 13 Apr 2013:&lt;/strong&gt; Added &lt;a href=&quot;http://msalazar.aiux.cl/flujo-de-trabajo-para-sitios-responsivos/&quot;&gt;Spanish translation&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Modular Grids</title>
      <link href="https://arielsalminen.com/2012/modular-grids/"/>
      <updated>2012-05-08T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/modular-grids/</id>
      <content type="html">&lt;p&gt;Couple months ago while I were designing a website I remembered a technique I had long forgotten. I used to use this technique before I moved from print design to web design about eight years ago and it was, for me, an essential way to utilize modular grids better. Grids in design are kind of like the &lt;a href=&quot;http://en.wikipedia.org/wiki/Musical_scale&quot;&gt;scales&lt;/a&gt; in music. They give you a way to anchor your layout elements and typography to a certain rhythm.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-modular-grid&quot;&gt;What is a modular grid &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/modular-grids/#what-is-a-modular-grid&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A modular grid is a grid which has consistent horizontal divisions from top to bottom in addition to vertical divisions from left to right. Modular grids are created by positioning horizontal guidelines in relation to a baseline grid that governs the whole document. Baseline grids serve to anchor all (or nearly all) layout elements to a common rhythm. &lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2012/modular-grids/#cite1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;a href=&quot;http://www.thinkingwithtype.com/contents/grid/#Modular_Grid&quot;&gt;
&lt;img loading=&quot;lazy&quot; alt=&quot;Modular grid&quot; src=&quot;https://arielsalminen.com/img/blog/modular-grid.png&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;Illustration from the book titled &lt;a href=&quot;http://www.thinkingwithtype.com/&quot;&gt;Thinking with type&lt;/a&gt;, by Ellen Lupton.&lt;/p&gt;
&lt;h2 id=&quot;how-to-use-a-grid&quot;&gt;How to use a grid &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/modular-grids/#how-to-use-a-grid&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The thing is, I don’t actually even know the reason why I abandoned this good practice when I moved forward on my career. I might have unwittingly thought that the same practices wouldn’t work in the digital world, but oh boy, I was so wrong back then. This technique is also so bloody simple that I wouldn’t be surprised to hear if most of you are already doing something similar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My method is this:&lt;/strong&gt; While you are aligning the design elements to a grid, zoom out the layout (in a browser or a design tool) so much that the size of the layout is around 30-40% of the original and about the size of your phone’s screen in landscape orientation.&lt;/p&gt;
&lt;img alt=&quot;Zoomed to 33,3% in a design tool&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/photoshop-grid-works.jpg&quot; /&gt;
&lt;p&gt;This way it’s much easier to see the balance of the whole layout and if it works visually or not. I also promise that it will make you a much faster (and hopefully better) designer. At least that is how I feel it transformed my own process. Of course, after you’ve zoomed back in to see the layout in its real size, you then have to fine-tune elements and typography and start working on the smaller details.&lt;/p&gt;
&lt;p&gt;Remember that not all layouts work the same way though, and because of that, you shouldn’t always force elements to a grid.&lt;/p&gt;
&lt;h2 id=&quot;tools-to-get-you-started&quot;&gt;Tools to get you started &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/modular-grids/#tools-to-get-you-started&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is this tool called &lt;a href=&quot;http://modulargrid.org/&quot;&gt;Modular Grid Pattern&lt;/a&gt; which has a Photoshop extension which allows you to create modular grids directly inside Photoshop. Then there’s also this interesting &lt;a href=&quot;http://dinosaurswithlaserz.com/2011/07/18/fluid-squares-v2/&quot;&gt;experiment&lt;/a&gt; which uses a fluid modular grid framework. There are also a number of tools that allow you to &lt;a href=&quot;http://gridpak.com/&quot;&gt;create&lt;/a&gt; and &lt;a href=&quot;http://goldengridsystem.com/&quot;&gt;use&lt;/a&gt; responsive grids, but they are mostly multicolumn grids (with or without baseline grid) and not modular.&lt;/p&gt;
&lt;p&gt;Tools are just tools though and the best way to actually start learning is to pick or make a grid yourself and start using it. Check also my resources below, &lt;a href=&quot;http://www.thegridsystem.org/&quot;&gt;thegridsystem.org&lt;/a&gt; for example has a lot of interesting articles and templates if you want to dive deeper.&lt;/p&gt;
&lt;a href=&quot;http://modulargrid.org/&quot;&gt;
&lt;img alt=&quot;Modular Grid Pattern App&quot; loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/grid-app.jpg&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;Screenshot from the &lt;a href=&quot;http://modulargrid.org/&quot;&gt;Modular Grid Pattern&lt;/a&gt; app.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further reading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/modular-grids/#further-reading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ellenlupton.com/Thinking-with-Type&quot;&gt;Thinking With Type—A Modular Grid&lt;/a&gt; &lt;sup id=&quot;cite1&quot;&gt;[1]&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.smashingmagazine.com/2007/04/14/designing-with-grid-based-approach/&quot;&gt;Designing With Grid-Based Approach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://24ways.org/2008/making-modular-layout-systems&quot;&gt;Making Modular Layout Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thegridsystem.org/&quot;&gt;The Grid System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hyphenpress.co.uk/2000/08/22/typography_is_a_grid/&quot;&gt;Typography is a grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/2012/on-typography/&quot;&gt;My article about Responsive Typographic Scales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jonikorpi.com/golden-grid-system&quot;&gt;The Golden Grid System&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Extending CSS With Sass</title>
      <link href="https://arielsalminen.com/2012/extending-css-with-sass/"/>
      <updated>2012-04-15T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/extending-css-with-sass/</id>
      <content type="html">&lt;p&gt;CSS is designed primarily to enable the separation of content from presentation, including elements such as the layout, colors, and fonts. This separation improves content accessibility and provides more flexibility and control over the presentation. CSS is quite flexible language on its own, but as websites become more and more complex we sometimes need to have more control.&lt;/p&gt;
&lt;p&gt;I’m using &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; to extend the basic behavior of CSS and this post is mostly about some basic things I’m using. I’ll also assume that you know something about Sass already and that’s why I won’t dive deep into what it actually is. If you are running OS X, you can get Sass up and running using these two commands below. The first one installs Sass Ruby gem and the second one translates your .scss file into a .css file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install sass
sass --watch style.scss:style.css
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;partials&quot;&gt;Partials &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/extending-css-with-sass/#partials&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Using Sass’s @import you can organize your styles into a smaller partials. @import in Sass works a bit differently if compared to CSS @import statement. The difference is that when Sass is processed all the partials will be combined into a single CSS file which reduces unnecessary HTTP requests and speeds up the loading time. I usually have one “main” Sass file where I have all my variables, mixins, etc. and where I do the importing.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fontface&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reset&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;footer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;print&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This way you can separate different sections/features.&lt;/p&gt;
&lt;h2 id=&quot;variables&quot;&gt;Variables &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/extending-css-with-sass/#variables&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Variables are good when you need to, for example, use the same colors again and again. They allow you to specify widely used values in a single place and I usually specify them as the first thing in my main stylesheet.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;color-red&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;124&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;42&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;color-blue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;109&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;143&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;color-green&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;55&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;87&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;font-body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;font-headers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PTSansCustom&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Arial&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then later we can use them like this:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $font-headers&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $color-blue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The benefit of this is that when you need to later adjust or change that shade of blue, you only need to change it to one place.&lt;/p&gt;
&lt;h2 id=&quot;converting-pixels-to-ems&quot;&gt;Converting Pixels to EMs &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/extending-css-with-sass/#converting-pixels-to-ems&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the most useful features for me has been the ability to convert pixels to EMs without the need to use calculator. This function below does that and it works by taking two arguments, pixels and context. You can either use the default context and specify only the pixels you want to convert – or you can specify pixels and a custom context for the conversion.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;browser-context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; // Default&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$pixels&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $&lt;span class=&quot;token property&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $browser-context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@return&lt;/span&gt; #&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$pixels/$context&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;em&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then later this function can be used like below (converts 36px to EM units):&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;36&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you’ve converted all your pixels to EMs you can even scale the whole layout inside Media Queries with this simple percent conversion:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 60em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;percentage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;16 / 16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 80em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;percentage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;18 / 16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;making-a-simple-grid-system&quot;&gt;Making a simple grid system &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/extending-css-with-sass/#making-a-simple-grid-system&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Making your own grid system is also pretty straightforward in Sass. The following example is a Sass @mixin from &lt;a href=&quot;http://www.alistapart.com/articles/getting-started-with-sass/&quot;&gt;David Demaree’s article&lt;/a&gt; on A List Apart which takes one argument—$span—which will be passed into our @mixin as a variable:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;column-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 21em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;$&lt;span class=&quot;token property&quot;&gt;gutter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$span&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $gutter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $gutter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$column-width * $span&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; + &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$gutter * &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$span - 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then later that mixin can be used with containers using simple @include:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;aside&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To make this a bit easier to understand, our grid (layout) would now look like this when containers are laid on top of it:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; alt=&quot;Grid&quot; src=&quot;https://arielsalminen.com/img/blog/grid.png&quot; /&gt;
&lt;h2 id=&quot;more-resources&quot;&gt;More Resources &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/extending-css-with-sass/#more-resources&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m just scratching the surface here on what’s possible, and I suggest you to read more about some of these techniques from &lt;a href=&quot;http://www.alistapart.com/articles/getting-started-with-sass/&quot;&gt;A List Apart&lt;/a&gt; and from the resources I’ve provided below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://compass-style.org/&quot;&gt;Compass – CSS Authoring Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.alistapart.com/articles/getting-started-with-sass/&quot;&gt;Getting Started with Sass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thesassway.com/intermediate/responsive-web-design-part-1&quot;&gt;Responsive Web Design in Sass pt. I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thesassway.com/intermediate/responsive-web-design-part-2&quot;&gt;Responsive Web Design in Sass pt. II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thesassway.com/intermediate/responsive-web-design-in-sass-using-media-queries-in-sass-32&quot;&gt;Using Media Queries in Sass 3.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/standards/webdesign/htmlcss#whatcss&quot;&gt;What is CSS?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Scaling with EM units</title>
      <link href="https://arielsalminen.com/2012/scaling-with-em-units/"/>
      <updated>2012-03-05T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/scaling-with-em-units/</id>
      <content type="html">&lt;p&gt;Recently I started testing how proportional scaling of bigger layouts would work in reality and if it makes any sense. It’s possible when using &lt;a href=&quot;http://en.wikipedia.org/wiki/Em_(typography)#CSS&quot;&gt;EM units&lt;/a&gt; and then changing body’s font-size when viewport’s height grows above certain point. Basically that means, that I have to change only one or two css properties between @media queries which are targeting larger screen sizes.&lt;/p&gt;
&lt;p&gt;The reason why I started doing this, is that I wanted to rethink my current approach to responsive design and try something which would make the process at least a bit easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; You’ll need to view my &lt;a href=&quot;https://arielsalminen.com/demo/askos/&quot;&gt;demo&lt;/a&gt; on at least 24&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; or 27&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; monitor with 1920×1200 resolution or bigger. Otherwise you won’t see this method in full effect and it might be harder to understand the benefits.&lt;/p&gt;
&lt;h3 id=&quot;demo-viewed-on-27%22-and-15%22-screens%3A&quot;&gt;Demo viewed on 27&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; and 15&lt;span class=&quot;prime&quot;&gt;&amp;quot;&lt;/span&gt; screens: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/scaling-with-em-units/#demo-viewed-on-27%22-and-15%22-screens%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;a href=&quot;https://askos.fi/&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/askos1.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;The idea is that when the screen size grows, the demo still takes approxi­mately the same amount of screen estate.&lt;/p&gt;
&lt;h2 id=&quot;css-and-%40media-queries&quot;&gt;CSS and @media queries &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/scaling-with-em-units/#css-and-%40media-queries&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This method makes most sense when combined with &lt;a href=&quot;http://www.lukew.com/resources/mobile_first.asp&quot;&gt;mobile first&lt;/a&gt; approach. After you’ve reached the “optimal desktop size” you can start scaling the layout up for larger screen sizes. The most important thing is to specify all units in your stylesheet with EMs, so that we can scale everything by changing body’s font-size. That works because EMs are relative to parent element’s font-size.&lt;/p&gt;
&lt;p&gt;You can easily figure out the needed break points by scaling the window bigger and looking when the layout starts to break apart or look awkward. That’s the point when you’ll want the next @media query to trigger and scale the layout a bit bigger.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 81.25%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 68em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 53em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 87.5%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 75em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 57em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 93.75%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 80em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 62em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://arielsalminen.com/demo/askos/&quot;&gt;Check out my demo&lt;/a&gt; to get a better picture of this. Try also scaling the browser window bigger/smaller + remember to do the testing on a big screen.&lt;/p&gt;
&lt;h2 id=&quot;images&quot;&gt;Images &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/scaling-with-em-units/#images&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recommend using either &lt;a href=&quot;http://coding.smashingmagazine.com/2012/01/16/resolution-independence-with-svg/&quot;&gt;SVG&lt;/a&gt; or some sort of &lt;a href=&quot;http://adaptive-images.com/&quot;&gt;adaptive images&lt;/a&gt; approach with this technique. You can get going with just one image version, but you should remember that when you optimize for the largest size possible it’s usually way too heavy for mobile devices + can also look quite awkward when browsers scale it down too much.&lt;/p&gt;
&lt;a href=&quot;https://askos.fi/&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/askos2.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/a&gt;
&lt;h2 id=&quot;the-future&quot;&gt;The future &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/scaling-with-em-units/#the-future&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This method won’t work with all designs, but at least when combined with a design which has elements which are somehow relative to the viewport dimensions, it makes it much easier to adapt the layout to different sizes.&lt;/p&gt;
&lt;p&gt;Also: I &lt;a href=&quot;http://trac.webkit.org/changeset/109656&quot;&gt;heard&lt;/a&gt; two days ago that Webkit nightly builds started supporting &lt;a href=&quot;http://dev.w3.org/csswg/css3-values/#viewport-relative-lengths&quot;&gt;viewport-relative lengths&lt;/a&gt; through the “vw” and “vh” units in CSS. In addition to Webkit, IE9 is the only browser out there right now that supports these new units. We cannot probably start using them right away, but they’ll open up many new possibilities to make it much easier to scale elements according to the viewport. Before we reach the point where all major browsers support these units we can use this EM method.&lt;/p&gt;
&lt;h2 id=&quot;resources&quot;&gt;Resources &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/scaling-with-em-units/#resources&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/demo/askos/&quot;&gt;Demo layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/arielsalminen/Scale&quot;&gt;Scale CSS boilerplate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arielsalminen.com/2012/on-typography/&quot;&gt;On Typography&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please note that the demo layout I’m using is copyrighted work and cannot be used as a template/boilerplate for your work. &lt;del&gt;The actual site will be launched later on different URL.&lt;/del&gt; The actual site is &lt;a href=&quot;https://askos.fi/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Adaptive vs Responsive, What’s The Difference?</title>
      <link href="https://arielsalminen.com/2012/adaptive-vs-responsive-design/"/>
      <updated>2012-02-23T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/adaptive-vs-responsive-design/</id>
      <content type="html">&lt;p&gt;There seems to be some confusion about these terms and what they mean, so here’s my thoughts on the subject and few links to back them up. I’m usually not very keen when it comes to debating over what something is called, but this time I wanted to make it clear, as I hear this question quite often.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;margin-left:-0.3em;&quot;&gt;“&lt;/span&gt;Responsive design” is a subset of a larger concept which is called “Adaptive design.” When talking about responsive we refer to the layout only (Ethan Marcotte, fluid grids, flexible images &amp;amp; media queries).&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;margin-left:-0.3em;&quot;&gt;“&lt;/span&gt;Adaptive design” on the other hand includes much more than just fluid layout. In practice it means the same thing as &lt;a href=&quot;http://filamentgroup.com/dwpe/&quot;&gt;progressive enhancement&lt;/a&gt;, which means in short, that we aim to deliver the best possible experience to the widest possible audience. Also: “Adaptive design” shouldn’t be mixed with “Adaptive layout” which is a completely different thing.&lt;/p&gt;
&lt;p&gt;Finally, “Adaptive layout” means a layout done by combining multiple fixed widths. Right now, I feel that Adaptive layout—when done right and when fixed widths are combined with fluid widths—is one form of responsive design and not just an alternative to it. Zeldman shared a bit similar idea in his &lt;a href=&quot;http://www.zeldman.com/2011/07/06/responsive-design-i-dont-think-that-word-means-what-you-think-it-means/&quot;&gt;blog post&lt;/a&gt; from 2011.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/adaptive_map.png&quot; class=&quot;image-padding&quot; alt=&quot;Adaptive design explained&quot; /&gt;
&lt;h2 id=&quot;links%2Fsources%3A&quot;&gt;Links/sources: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/adaptive-vs-responsive-design/#links%2Fsources%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zeldman.com/2011/07/06/responsive-design-i-dont-think-that-word-means-what-you-think-it-means/&quot;&gt;Responsive Design. I don’t think that word means what you think it means.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.easy-designs.net/archives/2011/11/16/on-adaptive-vs-responsive-web-design/&quot;&gt;On Adaptive vs. Responsive Web Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lullabot.com/articles/responsive-adaptive-web-design&quot;&gt;Responsive &amp;amp; Adaptive Web Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://plus.google.com/103751101313992876152/posts/ezi7gr6T1kR&quot;&gt;Brad Frost on Google+&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Update v1.&lt;/strong&gt; If my post made things look more complicated than they actually are, then this all in short: Resposive design is a subset of adaptive design. Responsive design = fluid layout only, while adaptive design = fluid layout + progressive enhancement.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>On Typography</title>
      <link href="https://arielsalminen.com/2012/on-typography/"/>
      <updated>2012-01-21T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/on-typography/</id>
      <content type="html">&lt;p&gt;I have been intrigued by the idea of making a typographic scale out of a musical scale that would not only be very readable, but also aesthetically pleasing. This whole idea started after the launch of my new site. At first, I ignored to see it, but weeks later I started to notice that the textual content of the site is actually pretty harsh for the eyes and the reading experience isn’t that great.&lt;/p&gt;
&lt;p&gt;You can read it—I’m quite sure of that—but the longer you browse the content, the more your eyes start to hurt. &lt;em&gt;Literally.&lt;/em&gt; One reason for this is the contrast between the text and the background, but there’s also more to it than just that, so I started wondering:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;span&gt;How could I improve it?&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span&gt;How to make building of responsive typography easier?&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span&gt;Can typography look good and be readable on so wide range of&amp;nbsp;devices?&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span&gt;Are there any patterns where I could base my decisions on?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-foundation&quot;&gt;The foundation &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#the-foundation&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At the time I were thinking about the subject, I had a Skype chat open with &lt;a href=&quot;http://jonikorpi.com/&quot;&gt;Joni Korpi&lt;/a&gt; and we were discussing about similar problems in Responsive Design. Later on the evening, when I had already went to sleep, Joni pasted me a link to 24 Ways article about &lt;a href=&quot;http://24ways.org/2011/composing-the-new-canon&quot; rel=&quot;external&quot;&gt;Music, Harmony and Proportion&lt;/a&gt; in Web Design. The idea didn’t hit me instantly after I read it, but about a week or two later I was hooked and started studying how Musical Scales could help me to make the perfect Typographic Scale for the&amp;nbsp;Web.&lt;/p&gt;
&lt;p&gt;Since I’ve been following close-by music producers and artists—who compose their tracks with the help of a scale—for most of my youth, I felt pretty confident to base the rhythm and proportions on the chromatic scale. There are different versions of the scale and I decided to go with the Pythagorean one. That decision was mostly based on the information I could find from the&amp;nbsp;Web.&lt;/p&gt;
&lt;h3 id=&quot;the-chromatic-scale&quot;&gt;The Chromatic Scale &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#the-chromatic-scale&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The chromatic scale is a musical scale with twelve pitches, each a semitone apart. On a modern piano or other equal-tempered instrument, all the half steps are the same size. An equal tempered chromatic scale is a non-diatonic scale having no tonic because of the symmetry of its equally spaced&amp;nbsp;tones.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2012/on-typography/#cite1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The most common conception of the chromatic scale before the 13th century was the Pythagorean chromatic scale. Due to a different tuning technique, the twelve semitones in this scale have two slightly different sizes. Thus, the scale is not perfectly symmetric. Many other tuning systems, developed in the ensuing centuries, share a similar asymmetry.&lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2012/on-typography/#cite2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id=&quot;different-notes-and-their-ratio%2Fpitch%2Fmath%3A&quot;&gt;Different notes and their Ratio/Pitch/Math: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#different-notes-and-their-ratio%2Fpitch%2Fmath%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/posts/typography/img/pythagorean.png&quot; class=&quot;image-padding&quot; alt=&quot;The Pythagorean Scale&quot; /&gt;
&lt;h3 id=&quot;don%E2%80%99t-compose-without-a-scale&quot;&gt;Don’t compose without a scale &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#don%E2%80%99t-compose-without-a-scale&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;“In the sixteenth century, a series of common sizes developed among European typographers, and the series survived with little change and few additions for 400 years. [...] Use the old familiar scale, or use new scales of your own devising, but limit yourself, at first, to a modest set of distinct and related intervals.” &lt;sup&gt;[&lt;a href=&quot;https://arielsalminen.com/2012/on-typography/#cite3&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s an excerpt from a book called &lt;a href=&quot;http://webtypography.net/Harmony_and_Counterpoint/Size/3.1.1/&quot; rel=&quot;external&quot;&gt;The Elements of Typographic Style&lt;/a&gt; by Robert Bringhurst. Basically, the use of a scale in typography is something that have been practised for centuries. It’s not something that I just invented. Today you can see it, for example, in all word processing applications that let you choose font-size or change line-height.&lt;/p&gt;
&lt;p&gt;At this point, you might want to ask why did I even want to build a new scale if there’s a scale that have been used for centuries? How could I possibly build a better one?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; I never believed that I could do it better, but I wanted to learn more in-depth what is the foundation of good typography. I’ve always felt that typography is the most crucial part of a design and also the hardest thing to master.&lt;/p&gt;
&lt;h2 id=&quot;composing-the-layout&quot;&gt;Composing the layout &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#composing-the-layout&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first thing I did, is that I forgot pixels and started using EMs for everything. That’s because they give a lot more control for scaling and making the typography responsive. The chromatic scale is also easy to convert to EMs, so there are many arguments to support this decision.&lt;/p&gt;
&lt;p&gt;What I basically did first, is that I started testing different combinations and notes that play well together and started adding some calculations to the mix. After about a week of testing the results were quite interesting: No matter what combinations I used, I always ended up having a scale that’s very similar to the centuries old Typographic Scale described in Alex Charchar’s &lt;a href=&quot;http://retinart.net/typography/typographicscale/&quot; rel=&quot;external&quot;&gt;article&lt;/a&gt;.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/posts/typography/img/typographicscale.png&quot; class=&quot;image-padding&quot; alt=&quot;The Typographic Scale&quot; /&gt;
&lt;p&gt;That only covered the various font sizes though, but I added a 1.5em baseline grid into the mix and with the help of that calculated optimal white space needed for the headings, paragraphs and other elements.&lt;/p&gt;
&lt;p&gt;The result of all this is the page you are reading right now. &lt;del&gt;It’s using the same &amp;#8220;foundation&amp;#8221;&lt;/del&gt; which I’m going to share later on in this article. If you are eager, then go ahead and grab a copy of it from &lt;a href=&quot;https://github.com/arielsalminen/Scale&quot; rel=&quot;external&quot;&gt;GitHub&lt;/a&gt; and tweak/use it in any way you want. It might not be perfect yet, probably never will, but if it works for you I’m more than happy to share&amp;nbsp;it.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/posts/typography/img/screenshots.png&quot; class=&quot;image-padding&quot; alt=&quot;Template viewed at different widths&quot; /&gt;
&lt;h3 id=&quot;about-the-responsiveness&quot;&gt;About the responsiveness &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#about-the-responsiveness&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I started with a mobile first approach and wanted to make sure that the content preserves it’s readability from about 200px and up. So not only smartphones, but also &lt;abbr title=&quot;A feature phone is a mobile phone which at the time of manufacture is not a considered to be a smartphone, but nevertheless has additional functions over and above standard mobile services.&quot;&gt;feature phones&lt;/abbr&gt; that have slightly smaller screens.&lt;/p&gt;
&lt;p&gt;The interesting thing for me is, that the more I build responsive sites, the more the current way of building them feels complex and hard. I can, for example, choose to make a completely fluid layout or a set of static layouts. Or take a mixed approach that has both fluid and fixed widths (but this isn’t really the hard part&amp;nbsp;yet).&lt;/p&gt;
&lt;p&gt;There’s also often a lot of &amp;#8220;magic&amp;#8221; happening inside various Media Queries and we tend &lt;em&gt;(or tended) &lt;/em&gt;to think more device widths than what the layout can handle. Things get also interesting when you are building a site that runs on top of a CMS where your client does all the updating and even more so when you start adding advertising and dynamic content into the&amp;nbsp;mix.&lt;/p&gt;
&lt;p&gt;I tried to leave all these problems aside when thinking this, but I really couldn’t. The way which I might see myself working in the future is probably somehow based on the way how this template is built. It basically has only one one column layout which just scales up or down. Then the next layout after that—when the screen size is big enough—could be the more complex one, which includes more columns and &amp;#8220;richer&amp;#8221; experience (isn’t included in this template). So that’s two different fluid/fixed/mixed layouts which we can then scale up or down to create even more responsiveness.&lt;/p&gt;
&lt;p&gt;The thing which I kind of like in this approach, is that I’d only have to build one layout for the mobile and one for the desktop and anything in between (or bigger) would just scale. I know that there are more things to consider than just that, but if I could get going with only minimal CSS changes between the Media Queries, let’s say, only the body’s font-size, max-width and maybe some padding, &lt;em&gt;that would be&amp;nbsp;wonderful.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;final-layout&quot;&gt;Final layout &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#final-layout&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Below is the base CSS for the template I came up with. Different CSS declarations are explained below the&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BTW:&lt;/strong&gt; If you are using Firefox/Safari/Chrome to read this, and want to see the whole layout in effect, I suggest you to try Safari and install &lt;a href=&quot;https://mehlau.net/resizewindow/&quot; rel=&quot;external&quot;&gt;Resizer Extension&lt;/a&gt; so that you can see the narrowest layouts with your desktop browser (also a handy tool when building sites).&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;font&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 75%/1.5em Georgia&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 40.49984em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* styles for print */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15.652em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 87.5%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 19.9375em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 29.9375em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 34.3em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em 3em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 38em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4.5em 3em 7.59372em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 99.9375em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 34.43736em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.75em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 112.5%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CSS in short:&lt;/strong&gt; the first layout for feature phones is using 12px base font-size and the max-width and horizontal centering are there for browsers that don’t support Media Queries. Then inside next Media Queries the whole layout starts to scale slightly bigger just by changing the body’s font-size. This works because EMs are always relative to parent element’s font-size and I’m using EMs everywhere instead of&amp;nbsp;pixels.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Simple yet effective.&lt;/em&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/posts/typography/img/phones.jpg&quot; alt=&quot;Viewed on iPhone 4 and Nokia 6303i&quot; /&gt;
&lt;h2 id=&quot;get-the-code&quot;&gt;Get the code &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#get-the-code&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;span&gt;Point your browser to the &lt;a href=&quot;https://github.com/arielsalminen/Scale&quot; class=&quot;highlight&quot; rel=&quot;external&quot;&gt;GitHub project page&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span&gt;Read my newer blog post about the subject: &lt;a href=&quot;https://arielsalminen.com/2012/scaling-with-em-units/&quot; class=&quot;highlight&quot;&gt;Scaling with EM units&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span&gt;If you have questions &lt;a href=&quot;http://twitter.com/arielsalminen&quot; class=&quot;highlight&quot; rel=&quot;external me&quot;&gt;send me a&amp;nbsp;tweet&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references-and-links&quot;&gt;References and links &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2012/on-typography/#references-and-links&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First and foremost, I should thank &lt;em&gt;Iain Lamb &lt;/em&gt;for his exploration of &lt;a href=&quot;http://lamb.cc/typograph/&quot; rel=&quot;external&quot;&gt;scale and rhythm in typography&lt;/a&gt;. He was the one that gave me the idea to base my decisions on the Chromatic Scale. I should also thank &lt;em&gt;Alex Charchar &lt;/em&gt;for his article about &lt;a href=&quot;http://retinart.net/typography/typographicscale/&quot; rel=&quot;external&quot;&gt;Typographic Scale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then there is the 24 Ways article which I mentioned earlier, where it all kind of started: &lt;a href=&quot;http://24ways.org/2011/composing-the-new-canon&quot; rel=&quot;external&quot;&gt;Music, Harmony, Proportion&lt;/a&gt; in Web Design.&lt;/p&gt;
&lt;p&gt;&lt;sup id=&quot;cite1&quot; class=&quot;indent&quot;&gt;[1]&lt;/sup&gt; Benward &amp;amp; Saker (2003). Music: In Theory and Practice, Vol. I. Seventh Edition. ISBN 978-0072942620.&lt;/p&gt;
&lt;p&gt;&lt;sup id=&quot;cite2&quot; class=&quot;indent&quot;&gt;[2]&lt;/sup&gt; Excerpt from a &lt;a href=&quot;http://en.wikipedia.org/wiki/Chromatic_scale&quot; rel=&quot;external&quot;&gt;Wikipedia article&lt;/a&gt; about the Chromatic Scale.&lt;/p&gt;
&lt;p&gt;&lt;sup id=&quot;cite3&quot; class=&quot;indent&quot;&gt;[3]&lt;/sup&gt; Bringhurst, Robert (2003). The Elements of Typographic Style. Third edition. ISBN 978-0881792065.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Convert A List To A Select</title>
      <link href="https://arielsalminen.com/2012/convert-list-to-select/"/>
      <updated>2012-01-03T00:00:00Z</updated>
      <id>https://arielsalminen.com/2012/convert-list-to-select/</id>
      <content type="html">&lt;p&gt;I created another responsive jQuery plugin during the Christmas holidays. It’s called &lt;a href=&quot;http://tinynav.com/&quot;&gt;TinyNav&lt;/a&gt; and it can convert &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt; based navigation to a dropdown for small screen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TinyNav.js is a tiny jQuery plugin (304 bytes minified and gzipped) that converts &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt; navigations to a select dropdowns for small screen. It also automatically selects the current page and adds selected=&amp;quot;selected&amp;quot; for that item.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;http://tinynav.com/&quot; target=&quot;_blank&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Fluid Image Replacement Techniques</title>
      <link href="https://arielsalminen.com/2011/fluid-image-replacement/"/>
      <updated>2011-12-18T00:00:00Z</updated>
      <id>https://arielsalminen.com/2011/fluid-image-replacement/</id>
      <content type="html">&lt;p&gt;While you can find two dozen blog posts and articles about various image replacement techniques using Google, I couldn’t find any article that would help when you want the replacement to be fluid.&lt;/p&gt;
&lt;p&gt;If the term “image replacement” is unknown to you, it basically means that we replace some content on a page—usually text—with an image.&lt;/p&gt;
&lt;p&gt;I’m not a huge fan of using image replacements in the first place, but it’s often necessary to do so. One quite popular example is a logo. Logos—when used on a Web page—are usually images that have text inside them. If we want that text content to be visible to search engines, screen readers and text based browsers (&lt;a href=&quot;http://en.wikipedia.org/wiki/ELinks&quot;&gt;Elinks&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Lynx_(web_browser)&quot;&gt;Lynx&lt;/a&gt;, ...) we need to use some kind of image replacement technique.&lt;/p&gt;
&lt;p&gt;The most popular image replacement technique right now is probably this:&lt;/p&gt;
&lt;h3 id=&quot;html%3A&quot;&gt;HTML: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#html%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;css%3A&quot;&gt;CSS: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#css%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image.jpg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; no-repeat&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;text-indent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -9999px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think that the method described above is good if we just need to replace a logo, but what can we do when we want the replacement to be fluid and scale with the layout? Well, we could add a &lt;a href=&quot;http://davidwalsh.name/background-size&quot;&gt;background-size&lt;/a&gt; CSS property which is supported in Firefox, Safari, Chrome, Opera, and IE9+ to make it a bit better:&lt;/p&gt;
&lt;h3 id=&quot;css%3A-1&quot;&gt;CSS: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#css%3A-1&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;-webkit-background-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100% auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;-moz-background-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100% auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;background-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100% auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now by changing the width and height of the header between different Media Query trigger points we could change the size of the replacement image. That doesn’t help much though if we want/need the replacement to be completely fluid.&lt;/p&gt;
&lt;h2 id=&quot;back-to-the-past&quot;&gt;Back to the past &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#back-to-the-past&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because of the non-fluid nature of the last example, I’m suggesting an alternative method to “replace” the text, which, I think, is actually the way image replacement was done before all these CSS methods about 10 years ago (...now added with few improvements):&lt;/p&gt;
&lt;h3 id=&quot;html%3A-1&quot;&gt;HTML: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#html%3A-1&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;image.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Header&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;css%3A-2&quot;&gt;CSS: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#css%3A-2&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1 img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;-ms-interpolation-mode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bicubic&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;h1 img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;h1:after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Header&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This method also hides the image when you print the page and replaces it with the text from the image. This is something that’s really useful if the text inside the image is white as on my own home page. You might also want to add a max-width for the H1 or the IMG to avoid the image scaling too much.&lt;/p&gt;
&lt;p&gt;I’m not a SEO expert so I don’t know how this particular technique performs against H1 with real text content, but at least screen readers, text browsers and search engines see the text now (I tested if the ALT description used in this kind of example shows up in Google results by searching for my own site and the words inside ALT description. The text did, in fact, show up there).&lt;/p&gt;
&lt;h2 id=&quot;putting-more-thought-into-this&quot;&gt;Putting more thought into this &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#putting-more-thought-into-this&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started wondering if it&#39;s possible to automatically get the content of the ALT description for printing, so that we wouldn&#39;t have to write all the texts inside the stylesheet. This is what I came up with:&lt;/p&gt;
&lt;h3 id=&quot;css%3A-3&quot;&gt;CSS: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#css%3A-3&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;h1 img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;h1 img:after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;alt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That should work in all major browsers + now we don&#39;t have to worry so much about our stylesheet anymore.&lt;/p&gt;
&lt;h2 id=&quot;usage-of-an-h1-tag&quot;&gt;Usage of an H1 tag &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#usage-of-an-h1-tag&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’d say that you shouldn’t probably wrap a logo inside an H1 tag. The Example uses H1 just because the main header on this site uses an image replacement and this blog post kind of grew up from that particular use case. I’m using image replacement because I wanted to make the header look identical across multiple platforms/devices, also the ones that don’t have support for @font-face.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further reading &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/fluid-image-replacement/#further-reading&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;CSS-Tricks has an article about similar method (non-fluid), called &lt;a href=&quot;http://css-tricks.com/rethinking-css-image-replacement/&quot;&gt;Rethinking CSS Image Replacement&lt;/a&gt;, but I think that the “remaining problems” described there are incorrect. This method does show the alternative text when someone is browsing CSS turned on and images turned off, Webkit being the only exception. At least this was the case when I tested it.&lt;/p&gt;
&lt;p&gt;There are few caveats also: If you are worried about how Internet Explorer (prior to version IE8) and older mobile devices will render the image when it’s scaled down, then I suggest you to read Ethan Marcotte’s article called &lt;a href=&quot;http://unstoppablerobotninja.com/entry/fluid-images/&quot;&gt;Fluid images&lt;/a&gt;. There&#39;s a small script to fix the problem with Explorer.&lt;/p&gt;
&lt;p&gt;At this stage we (and I) should also probably think about how to implement responsive images and not just serve one big image for all screen sizes. Jeremy Keith has an interesting post titled &lt;a href=&quot;http://adactio.com/journal/4997/&quot;&gt;Responsible responsive images&lt;/a&gt; about that subject.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>ResponsiveSlides.js</title>
      <link href="https://arielsalminen.com/2011/responsive-slides-js/"/>
      <updated>2011-12-04T00:00:00Z</updated>
      <id>https://arielsalminen.com/2011/responsive-slides-js/</id>
      <content type="html">&lt;p&gt;I created &lt;a href=&quot;http://responsive-slides.arie.ls/&quot;&gt;this plugin&lt;/a&gt; while I were developing my own site and decided few days ago to release it as an open source version. Its basic function is to create responsive slideshow using images inside a container. The interesting thing is, that this is actually the very first JavaScript plugin I’ve done and that’s why I thought that I should write down some notes while I’m at it.&lt;/p&gt;
&lt;h2 id=&quot;basics-first&quot;&gt;Basics first &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/responsive-slides-js/#basics-first&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s start with the Markup and CSS. I used the same markup which I used on &lt;a href=&quot;http://blog.kiskolabs.com/post/5602656614/responsive-jquery-slideshow&quot;&gt;blog.kiskolabs.com&lt;/a&gt; as the foundation for this plugin, but I wanted to make it a bit better this time. The problem with my previous version was that if there was any content below the slideshow, you had to change the height between Media Query triggerpoints for it to work properly. Now we don’t have to specify/calculate height anymore, so this scales really smoothly.&lt;/p&gt;
&lt;h3 id=&quot;html%3A&quot;&gt;HTML: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/responsive-slides-js/#html%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;2.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;3.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;css%3A&quot;&gt;CSS: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/responsive-slides-js/#css%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#slides&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 800px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.img_visible&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The markup is really simple: you only need one container and few images inside that. Max-width on the container isn&#39;t necessary, but we might want to prevent images scaling too much.&lt;/p&gt;
&lt;p&gt;The last &lt;code&gt;img_visible&lt;/code&gt; class in CSS fixes the height problem I mentioned earlier. It’s basically applied to a slide when it fades in and removed when it fades out. The idea for using &lt;code&gt;position: relative&lt;/code&gt; on visible slide came from a comment on the previous &lt;a href=&quot;http://blog.kiskolabs.com/post/5602656614/responsive-jquery-slideshow&quot;&gt;blog post&lt;/a&gt;. &lt;code&gt;float: left&lt;/code&gt; makes the fix also work on IE6.&lt;/p&gt;
&lt;p&gt;That part is pretty straightforward, but what about JavaScript?&lt;/p&gt;
&lt;h2 id=&quot;making-it-a-plugin&quot;&gt;Making it a plugin &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/responsive-slides-js/#making-it-a-plugin&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There’s a pretty good tutorial on &lt;a href=&quot;http://docs.jquery.com/Plugins/Authoring&quot;&gt;docs.jquery.com&lt;/a&gt; about writing your own plugins. It’s a good place to start if you are interested to learn how it works. After you become familiar with the concept you can try something simple first and build up from there.&lt;/p&gt;
&lt;p&gt;I had three things in my mind when I started doing this. First, it should scale smoothly without any glitches, second, the whole plugin should be very light in file size and third, I wanted to avoid feature bloat. Because of the second and the third thing there isn’t very many options you can customize and I didn’t even plan to include much more in the future.&lt;/p&gt;
&lt;h3 id=&quot;hooking-it-up%3A&quot;&gt;Hooking it up: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/responsive-slides-js/#hooking-it-up%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#slides&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;responsiveSlides&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;           &lt;span class=&quot;token comment&quot;&gt;// Boolean: Animate automatically, true/false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;speed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;// Integer: Speed of the transition, in ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// Integer: Time between transitions, in ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;pager&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;// Boolean: Show pager, true or false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;nav&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;           &lt;span class=&quot;token comment&quot;&gt;// Boolean: Show navigation, true or false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;prevText&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Previous&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// String: Text for the &quot;previous&quot; button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;nextText&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Next&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// String: Text for the &quot;next&quot; button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;maxwidth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// Integer: Max-width of the slideshow, in px&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;controls&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;// Selector: Where controls should be appended&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rslides&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// String: change the default namespace used&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;was-it-worth-it&quot;&gt;Was it worth it? &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/responsive-slides-js/#was-it-worth-it&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think it was. I learned a ton about jQuery plugins + now I have something to use with new projects. I do know though, that there’s still a lot of things that I could probably do better, but given the time that I used for the development, I’m satisfied with the results. See the plugin in action on it’s &lt;a href=&quot;http://responsive-slides.arie.ls/&quot;&gt;homepage&lt;/a&gt; and check out the repository on &lt;a href=&quot;https://github.com/arielsalminen/ResponsiveSlides.js&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Decided to change the name “AdaptiveSlides.js” to “ResponsiveSlides.js”. That just makes more sense here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; I changed the markup to use unordered lists. Check out the &lt;a href=&quot;http://responsive-slides.arie.ls/&quot;&gt;new version&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>New Website</title>
      <link href="https://arielsalminen.com/2011/new-arielsalminen-com/"/>
      <updated>2011-11-20T00:00:00Z</updated>
      <id>https://arielsalminen.com/2011/new-arielsalminen-com/</id>
      <content type="html">&lt;p&gt;Since you are here, you have probably noticed that there’s a new design which I have been working on for some time now. I wanted to focus on the content and make something much more simple. I also wanted my site to work with various devices from smartphones to TV’s. That’s why I used the so called “&lt;a href=&quot;http://www.lukew.com/ff/entry.asp?933&quot;&gt;Mobile First&lt;/a&gt;” technique and made the whole site responsive from about 240px and up.&lt;/p&gt;
&lt;p&gt;As a starting point for the work I used the &lt;a href=&quot;http://www.stuffandnonsense.co.uk/projects/320andup/&quot;&gt;320 and up&lt;/a&gt; boilerplate, but I ended up changing almost everything to suit my own way of working (if you don’t know, the 320 and up is a boilerplate that prevents mobile devices from downloading desktop assets by using a tiny screen’s stylesheet as its starting point). I’m still using small parts of it like the folder structure, print styles and JavaScript helpers for iPhone, but that’s about it.&lt;/p&gt;
&lt;p&gt;When you are using tiny screen’s stylesheet as the starting point you have to design the mobile version first and build up from there progressively. The best thing in that approach is that it’s relatively easy to get the site working with large number of devices, even on devices that don’t support Media Queries. This “reversed” approach also forces you to think more about the content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Viewed on different devices:&lt;/strong&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://arielsalminen.com/img/blog/devices2.jpg&quot; alt=&quot;arielsalminen.com viewed on different devices&quot; /&gt;
&lt;h2 id=&quot;the-end-result&quot;&gt;The end result &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2011/new-arielsalminen-com/#the-end-result&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I created probably dozen different drafts before I started to work with the one design I really liked. At somepoint I even hand drew some of the texts using &lt;a href=&quot;http://www.losttype.com/font/?name=mensch&quot;&gt;Mensch&lt;/a&gt;. I&#39;m still not quite satisfied with the way this turned out to be, but I can improve things here along the way.&lt;/p&gt;
&lt;p&gt;Below is a quote from Jason Rhodes’ post titled “More Responsive Design, Please.” It holds the same meaning in it as the introduction on my home page, and I think it summarizes exquisitely what I was thinking while I were building this site, and how we—as a web designers—should be building the web.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You either build for a device or you build for the web. You can’t build a web-app that’s just for the iMac. If you try, people will access it from other devices and rightfully expect to be able to use it, because that’s what the web is. When we build for the web, our initial design should respond to what we know about our users, and the layout and content should be able to subtly respond to a user’s capabilities on the fly. That’s how we build a more responsive web. Not a mobile web, or a desktop web, or an iPad web, or any other kind of web we might try to predict.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; You can now browse older versions of this site via subdomains: &lt;a href=&quot;http://v1.arielsalminen.com/&quot; rel=&quot;nofollow&quot;&gt;v1.arielsalminen.com&lt;/a&gt; and &lt;a href=&quot;http://v2.arielsalminen.com/&quot; rel=&quot;nofollow&quot;&gt;v2.arielsalminen.com&lt;/a&gt;. I also fixed some accessibility issues: Now the navigation works properly on small screen when JavaScript is turned off.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Responsive jQuery Slideshow Revisited</title>
      <link href="https://arielsalminen.com/2011/responsive-jquery-slideshow/"/>
      <updated>2011-11-19T00:00:00Z</updated>
      <id>https://arielsalminen.com/2011/responsive-jquery-slideshow/</id>
      <content type="html">&lt;p&gt;I wrote a blog post about making responsive jQuery slideshow on 18 May 2010 (You can &lt;a href=&quot;https://arielsalminen.com/2010/responsive-jquery-slideshow/&quot;&gt;read it here&lt;/a&gt;). Since then  much has happened and there’s now quite a lot of options where you could choose from. I did a short summary for this blog post about the options out there right now.&lt;/p&gt;
&lt;p&gt;I’m myself using &lt;a href=&quot;https://github.com/Wilto/Dynamic-Carousel&quot;&gt;Dynamic carousel plugin&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/wilto&quot;&gt;Mat Marquis&lt;/a&gt; on the home page, but I made slight changes to how it handles the touch events and dragging. &lt;del&gt;If you want to try it out, head to the home page with either iPhone or iPad and try dragging the text caption under the big headline&lt;/del&gt;. &lt;strong&gt;Update:&lt;/strong&gt; I removed the slider from the home page. Mainly because it didn&#39;t make so much sense in that context.&lt;/p&gt;
&lt;p&gt;I also created a tiny script while developing my own site and despite it being really simple I decided to release it as a &lt;a href=&quot;http://responsive-slides.arie.ls/&quot;&gt;plugin&lt;/a&gt;. If all you need is fading (with pagination), then it might be what you want to use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://responsive-slides.arie.ls/&quot;&gt;ResponsiveSlides.js&lt;/a&gt;, this one I created while developing my site.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://csswizardry.com/2011/10/fully-fluid-responsive-css-carousel/&quot;&gt;Fully fluid, responsive CSS carousel&lt;/a&gt;. This one is pretty neat, it uses CSS keyframes.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://flex.madebymufffin.com/&quot;&gt;FlexSlider&lt;/a&gt;, a fully responsive jQuery slider plugin.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://www.photoswipe.com/&quot;&gt;Photo Swipe&lt;/a&gt;, Image gallery for mobile and touch devices.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/Wilto/Dynamic-Carousel&quot;&gt;Dynamic Carousel&lt;/a&gt;, a carousel plugin built for responsive layouts.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://marktyrrell.com/labs/blueberry/&quot;&gt;Blueberry&lt;/a&gt;, a simple, fluid, responsive jQuery image slider&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://tympanus.net/Development/Elastislide/&quot;&gt;Elastislide&lt;/a&gt;, a Responsive jQuery Carousel Plugin.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://brice.lechatellier.com/code-design/wmuslider/&quot;&gt;wmuSlider&lt;/a&gt;, a jQuery responsive slider.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Responsive jQuery Slideshow</title>
      <link href="https://arielsalminen.com/2010/responsive-jquery-slideshow/"/>
      <updated>2010-08-18T00:00:00Z</updated>
      <id>https://arielsalminen.com/2010/responsive-jquery-slideshow/</id>
      <content type="html">&lt;p&gt;This example makes it possible to have a fluid jQuery slideshow which scales responsively. This is the same method that I used on the new &lt;a href=&quot;https://www.kiskolabs.com/&quot;&gt;kiskolabs.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am using Jonathan Snook’s &lt;a href=&quot;https://snook.ca/archives/javascript/simplest-jquery-slideshow&quot;&gt;Simple jQuery Slideshow&lt;/a&gt; in this example, but you could really use any JavaScript solution with this HTML/CSS combo. I think it’s easiest if I just show the source code and provide live example for you to try out.&lt;/p&gt;
&lt;h3 id=&quot;html%3A&quot;&gt;HTML: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2010/responsive-jquery-slideshow/#html%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slideshow&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;2.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;3.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;css%3A&quot;&gt;CSS: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2010/responsive-jquery-slideshow/#css%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#slideshow&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 600px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;javascript%3A&quot;&gt;JavaScript: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2010/responsive-jquery-slideshow/#javascript%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;	&lt;span class=&quot;token comment&quot;&gt;// Simplest jQuery slideshow by Jonathan Snook&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;	&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#slideshow img:gt(0)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;	&lt;span class=&quot;token function&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;		&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#slideshow :first-child&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fadeOut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;			&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;img&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fadeIn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#slideshow&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s everything required.&lt;/p&gt;
&lt;h3 id=&quot;update%3A&quot;&gt;Update: &lt;a class=&quot;section-id&quot; href=&quot;https://arielsalminen.com/2010/responsive-jquery-slideshow/#update%3A&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I made an updated version of this, read the new &lt;a href=&quot;https://arielsalminen.com/2011/responsive-slides-js/&quot;&gt;blog post here&lt;/a&gt; and check out the plugin here: &lt;a href=&quot;http://responsiveslides.com/&quot;&gt;responsiveslides.com&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Google Favicon Re-Created with CSS</title>
      <link href="https://arielsalminen.com/2010/google-favicon-re-created-with-css/"/>
      <updated>2010-02-12T00:00:00Z</updated>
      <id>https://arielsalminen.com/2010/google-favicon-re-created-with-css/</id>
      <content type="html">&lt;p&gt;Forget CSS3, images, semantics, better methods and that it doesn’t make any sense. I did this just for fun. Larger versions are here for illustration purposes only. Use if you want, but I can’t really figure any real world use for this. Nevetheless, this is the 16×16px Google favicon re-created with 256 list items and no images:&lt;/p&gt;
&lt;div class=&quot;ico-wrap&quot;&gt;
&lt;ul class=&quot;ico&quot;&gt;&lt;li class=&quot;px1&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px2&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px3&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px4&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px5&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px6&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px7&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px8&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px9&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px10&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px11&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px12&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px13&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px14&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px15&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px16&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px17&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px18&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px19&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px20&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px21&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px22&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px23&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px24&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px25&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px26&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px27&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px28&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px29&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px30&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px31&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px32&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px33&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px34&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px35&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px36&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px37&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px38&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px39&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px40&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px41&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px42&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px43&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px44&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px45&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px46&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px47&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px48&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px49&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px50&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px51&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px52&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px53&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px54&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px55&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px56&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px57&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px58&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px59&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px60&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px61&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px62&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px63&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px64&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px65&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px66&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px67&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px68&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px69&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px70&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px71&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px72&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px73&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px74&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px75&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px76&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px77&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px78&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px79&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px80&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px81&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px82&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px83&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px84&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px85&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px86&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px87&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px88&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px89&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px90&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px91&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px92&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px93&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px94&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px95&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px96&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px97&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px98&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px99&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px100&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px101&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px102&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px103&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px104&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px105&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px106&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px107&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px108&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px109&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px110&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px111&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px112&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px113&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px114&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px115&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px116&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px117&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px118&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px119&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px120&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px121&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px122&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px123&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px124&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px125&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px126&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px127&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px128&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px129&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px130&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px131&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px132&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px133&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px134&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px135&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px136&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px137&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px138&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px139&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px140&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px141&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px142&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px143&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px144&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px145&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px146&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px147&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px148&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px149&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px150&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px151&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px152&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px153&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px154&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px155&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px156&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px157&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px158&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px159&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px160&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px161&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px162&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px163&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px164&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px165&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px166&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px167&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px168&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px169&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px170&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px171&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px172&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px173&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px174&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px175&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px176&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px177&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px178&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px179&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px180&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px181&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px182&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px183&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px184&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px185&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px186&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px187&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px188&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px189&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px190&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px191&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px192&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px193&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px194&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px195&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px196&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px197&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px198&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px199&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px200&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px201&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px202&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px203&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px204&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px205&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px206&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px207&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px208&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px209&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px210&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px211&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px212&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px213&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px214&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px215&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px216&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px217&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px218&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px219&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px220&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px221&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px222&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px223&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px224&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px225&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px226&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px227&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px228&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px229&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px230&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px231&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px232&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px233&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px234&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px235&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px236&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px237&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px238&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px239&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px240&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px241&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px242&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px243&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px244&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px245&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px246&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px247&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px248&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px249&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px250&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px251&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px252&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px253&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px254&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px255&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px256&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ul class=&quot;ico m&quot;&gt;&lt;li class=&quot;px1&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px2&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px3&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px4&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px5&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px6&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px7&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px8&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px9&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px10&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px11&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px12&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px13&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px14&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px15&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px16&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px17&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px18&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px19&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px20&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px21&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px22&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px23&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px24&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px25&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px26&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px27&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px28&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px29&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px30&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px31&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px32&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px33&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px34&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px35&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px36&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px37&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px38&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px39&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px40&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px41&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px42&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px43&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px44&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px45&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px46&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px47&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px48&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px49&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px50&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px51&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px52&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px53&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px54&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px55&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px56&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px57&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px58&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px59&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px60&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px61&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px62&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px63&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px64&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px65&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px66&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px67&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px68&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px69&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px70&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px71&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px72&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px73&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px74&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px75&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px76&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px77&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px78&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px79&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px80&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px81&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px82&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px83&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px84&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px85&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px86&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px87&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px88&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px89&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px90&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px91&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px92&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px93&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px94&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px95&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px96&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px97&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px98&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px99&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px100&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px101&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px102&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px103&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px104&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px105&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px106&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px107&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px108&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px109&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px110&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px111&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px112&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px113&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px114&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px115&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px116&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px117&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px118&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px119&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px120&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px121&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px122&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px123&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px124&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px125&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px126&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px127&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px128&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px129&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px130&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px131&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px132&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px133&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px134&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px135&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px136&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px137&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px138&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px139&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px140&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px141&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px142&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px143&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px144&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px145&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px146&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px147&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px148&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px149&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px150&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px151&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px152&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px153&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px154&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px155&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px156&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px157&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px158&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px159&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px160&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px161&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px162&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px163&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px164&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px165&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px166&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px167&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px168&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px169&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px170&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px171&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px172&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px173&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px174&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px175&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px176&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px177&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px178&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px179&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px180&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px181&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px182&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px183&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px184&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px185&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px186&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px187&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px188&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px189&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px190&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px191&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px192&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px193&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px194&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px195&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px196&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px197&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px198&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px199&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px200&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px201&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px202&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px203&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px204&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px205&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px206&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px207&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px208&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px209&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px210&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px211&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px212&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px213&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px214&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px215&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px216&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px217&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px218&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px219&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px220&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px221&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px222&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px223&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px224&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px225&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px226&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px227&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px228&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px229&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px230&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px231&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px232&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px233&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px234&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px235&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px236&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px237&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px238&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px239&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px240&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px241&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px242&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px243&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px244&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px245&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px246&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px247&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px248&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px249&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px250&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px251&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px252&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px253&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px254&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px255&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px256&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ul class=&quot;ico l&quot;&gt;&lt;li class=&quot;px1&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px2&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px3&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px4&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px5&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px6&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px7&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px8&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px9&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px10&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px11&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px12&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px13&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px14&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px15&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px16&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px17&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px18&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px19&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px20&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px21&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px22&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px23&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px24&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px25&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px26&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px27&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px28&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px29&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px30&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px31&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px32&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px33&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px34&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px35&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px36&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px37&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px38&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px39&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px40&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px41&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px42&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px43&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px44&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px45&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px46&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px47&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px48&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px49&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px50&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px51&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px52&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px53&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px54&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px55&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px56&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px57&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px58&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px59&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px60&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px61&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px62&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px63&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px64&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px65&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px66&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px67&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px68&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px69&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px70&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px71&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px72&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px73&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px74&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px75&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px76&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px77&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px78&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px79&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px80&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px81&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px82&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px83&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px84&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px85&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px86&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px87&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px88&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px89&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px90&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px91&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px92&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px93&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px94&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px95&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px96&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px97&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px98&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px99&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px100&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px101&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px102&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px103&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px104&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px105&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px106&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px107&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px108&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px109&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px110&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px111&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px112&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px113&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px114&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px115&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px116&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px117&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px118&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px119&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px120&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px121&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px122&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px123&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px124&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px125&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px126&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px127&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px128&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px129&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px130&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px131&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px132&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px133&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px134&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px135&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px136&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px137&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px138&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px139&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px140&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px141&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px142&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px143&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px144&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px145&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px146&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px147&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px148&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px149&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px150&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px151&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px152&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px153&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px154&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px155&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px156&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px157&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px158&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px159&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px160&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px161&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px162&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px163&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px164&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px165&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px166&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px167&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px168&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px169&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px170&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px171&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px172&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px173&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px174&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px175&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px176&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px177&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px178&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px179&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px180&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px181&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px182&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px183&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px184&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px185&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px186&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px187&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px188&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px189&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px190&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px191&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px192&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px193&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px194&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px195&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px196&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px197&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px198&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px199&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px200&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px201&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px202&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px203&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px204&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px205&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px206&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px207&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px208&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px209&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px210&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px211&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px212&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px213&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px214&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px215&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px216&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px217&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px218&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px219&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px220&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px221&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px222&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px223&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px224&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px225&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px226&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px227&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px228&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px229&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px230&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px231&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px232&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px233&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px234&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px235&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px236&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px237&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px238&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px239&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px240&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px241&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px242&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px243&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px244&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px245&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px246&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px247&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px248&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px249&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px250&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px251&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px252&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px253&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px254&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px255&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px256&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ul class=&quot;ico xl&quot;&gt;&lt;li class=&quot;px1&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px2&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px3&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px4&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px5&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px6&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px7&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px8&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px9&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px10&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px11&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px12&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px13&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px14&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px15&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px16&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px17&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px18&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px19&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px20&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px21&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px22&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px23&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px24&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px25&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px26&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px27&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px28&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px29&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px30&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px31&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px32&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px33&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px34&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px35&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px36&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px37&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px38&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px39&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px40&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px41&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px42&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px43&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px44&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px45&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px46&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px47&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px48&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px49&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px50&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px51&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px52&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px53&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px54&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px55&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px56&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px57&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px58&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px59&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px60&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px61&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px62&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px63&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px64&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px65&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px66&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px67&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px68&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px69&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px70&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px71&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px72&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px73&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px74&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px75&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px76&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px77&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px78&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px79&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px80&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px81&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px82&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px83&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px84&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px85&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px86&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px87&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px88&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px89&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px90&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px91&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px92&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px93&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px94&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px95&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px96&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px97&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px98&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px99&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px100&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px101&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px102&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px103&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px104&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px105&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px106&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px107&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px108&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px109&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px110&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px111&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px112&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px113&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px114&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px115&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px116&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px117&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px118&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px119&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px120&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px121&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px122&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px123&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px124&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px125&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px126&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px127&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px128&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px129&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px130&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px131&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px132&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px133&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px134&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px135&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px136&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px137&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px138&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px139&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px140&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px141&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px142&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px143&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px144&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px145&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px146&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px147&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px148&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px149&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px150&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px151&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px152&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px153&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px154&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px155&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px156&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px157&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px158&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px159&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px160&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px161&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px162&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px163&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px164&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px165&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px166&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px167&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px168&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px169&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px170&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px171&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px172&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px173&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px174&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px175&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px176&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px177&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px178&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px179&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px180&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px181&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px182&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px183&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px184&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px185&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px186&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px187&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px188&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px189&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px190&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px191&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px192&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px193&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px194&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px195&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px196&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px197&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px198&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px199&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px200&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px201&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px202&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px203&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px204&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px205&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px206&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px207&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px208&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px209&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px210&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px211&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px212&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px213&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px214&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px215&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px216&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px217&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px218&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px219&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px220&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px221&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px222&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px223&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px224&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px225&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px226&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px227&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px228&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px229&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px230&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px231&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px232&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px233&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px234&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px235&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px236&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px237&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px238&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px239&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px240&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px241&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px242&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px243&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px244&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px245&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px246&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px247&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px248&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px249&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px250&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px251&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px252&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px253&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px254&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px255&quot;&gt;&lt;/li&gt;&lt;li class=&quot;px256&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;style&gt;

.ico-wrap {
	display: flex;
	width: 100%;
	margin: 10% 0;
	}

.ico-wrap .ico {
	margin: 0 10px 0 0;
	padding: 0;
	border: 0;
	list-style-type: none;
	display: block;
	inline-size: 16px;
	block-size: 16px;
	background: transparent;
	}

.ico-wrap .ico li {
	margin: 0;
	padding: 0;
	border: 0;
	display: block;
	float: left;
	width: 1px;
	height: 1px;
	}

.ico-wrap .ico li::before {
  display: none;
}

.ico-wrap .m { width: 32px; height: 32px }
.ico-wrap .m li { width: 2px; height: 2px }

.ico-wrap .l { width: 64px; height: 64px }
.ico-wrap .l li { width: 4px; height: 4px }

.ico-wrap .xl { width: 128px; height: 128px }
.ico-wrap .xl li { width: 8px; height: 8px }

.px1 { background: transparent }
.px2 { background: #fbfcff }
.px3 { background: #ccdbe2 }
.px4 { background: #205fa6 }
.px5 { background: #044ca1 }
.px6 { background: #86acd1 }
.px7 { background: #fdfffc }
.px8 { background: #f9f1ef }
.px9 { background: #c33f3a }
.px10 { background: #d50100 }
.px11 { background: #fa0202 }
.px12 { background: #fd0000 }
.px13 { background: #fd0002 }
.px14 { background: #f60100 }
.px15 { background: #ee0000 }
.px16 { background: transparent }
.px17 { background: #fcfbff }
.px18 { background: #feffff }
.px19 { background: #5083b8 }
.px20 { background: #0057b9 }
.px21 { background: #0263cc }
.px22 { background: #0e62bc }
.px23 { background: #dce6f2 }
.px24 { background: #fffefc }
.px25 { background: #f6d4d5 }
.px26 { background: #e70c0a }
.px27 { background: #fd0000 }
.px28 { background: #fe0103 }
.px29 { background: #fd0100 }
.px30 { background: #f60100 }
.px31 { background: #ec0004 }
.px32 { background: #e00200 }
.px33 { background: #ffffff }
.px34 { background: #fbfbfb }
.px35 { background: #246cb6 }
.px36 { background: #0063c8 }
.px37 { background: #0066cf }
.px38 { background: #0059c1 }
.px39 { background: #83afd2 }
.px40 { background: #fffeff }
.px41 { background: #fefcff }
.px42 { background: #e04646 }
.px43 { background: #f90001 }
.px44 { background: #fc0300 }
.px45 { background: #f90101 }
.px46 { background: #f00003 }
.px47 { background: #eb0100 }
.px48 { background: #df0000 }
.px49 { background: #fefdff }
.px50 { background: #fffcff }
.px51 { background: #3b7cbe }
.px52 { background: #025dc6 }
.px53 { background: #0266c8 }
.px54 { background: #025ac4 }
.px55 { background: #578ece }
.px56 { background: #fffffb }
.px57 { background: #ffffff }
.px58 { background: #dd5350 }
.px59 { background: #f40004 }
.px60 { background: #ff0100 }
.px61 { background: #fd0003 }
.px62 { background: #f30100 }
.px63 { background: #e50000 }
.px64 { background: #da0203 }
.px65 { background: #fffffd }
.px66 { background: #fffffd }
.px67 { background: #82a9d2 }
.px68 { background: #0053b9 }
.px69 { background: #0464ca }
.px70 { background: #0258bd }
.px71 { background: #5990c8 }
.px72 { background: #fdfffe }
.px73 { background: #fff8ff }
.px74 { background: #c72928 }
.px75 { background: #c21906 }
.px76 { background: #b12611 }
.px77 { background: #b62011 }
.px78 { background: #cc1005 }
.px79 { background: #e10200 }
.px80 { background: #d50100 }
.px81 { background: #dbe1ed }
.px82 { background: #feffff }
.px83 { background: #e8f1f6 }
.px84 { background: #286cb5 }
.px85 { background: #0054bb }
.px86 { background: #0e5db9 }
.px87 { background: #b9cfe4 }
.px88 { background: #feffff }
.px89 { background: #99b19b }
.px90 { background: #1d7020 }
.px91 { background: #009537 }
.px92 { background: #03963d }
.px93 { background: #00933b }
.px94 { background: #098936 }
.px95 { background: #3a652d }
.px96 { background: #8a2b0f }
.px97 { background: #275e9f }
.px98 { background: #acbed6 }
.px99 { background: #fffdfe }
.px100 { background: #eff2f9 }
.px101 { background: #a0bfde }
.px102 { background: #dae2ed }
.px103 { background: #fdfffe }
.px104 { background: #85b899 }
.px105 { background: #00822c }
.px106 { background: #039a3b }
.px107 { background: #03983a }
.px108 { background: #009637 }
.px109 { background: #009639 }
.px110 { background: #01913a }
.px111 { background: #00933f }
.px112 { background: #018742 }
.px113 { background: #1556a8 }
.px114 { background: #104f9c }
.px115 { background: #426fa6 }
.px116 { background: #84a2be }
.px117 { background: #fffefc }
.px118 { background: #fffffb }
.px119 { background: #bfdac9 }
.px120 { background: #02771f }
.px121 { background: #009b35 }
.px122 { background: #009937 }
.px123 { background: #009a37 }
.px124 { background: #01943c }
.px125 { background: #01943c }
.px126 { background: #008f38 }
.px127 { background: #018b3d }
.px128 { background: #01873e }
.px129 { background: #2759a2 }
.px130 { background: #1c55a4 }
.px131 { background: #084a9e }
.px132 { background: #114898 }
.px133 { background: #dfe8f1 }
.px134 { background: #fefefe }
.px135 { background: #e1ece4 }
.px136 { background: #269a51 }
.px137 { background: #00942d }
.px138 { background: #029739 }
.px139 { background: #02973b }
.px140 { background: #009438 }
.px141 { background: #02923b }
.px142 { background: #018f3d }
.px143 { background: #028b3d }
.px144 { background: #008938 }
.px145 { background: #22498e }
.px146 { background: #385e9d }
.px147 { background: #567eb2 }
.px148 { background: #6e90c0 }
.px149 { background: #cfdaee }
.px150 { background: #fdfffe }
.px151 { background: #fefffd }
.px152 { background: #ebf2eb }
.px153 { background: #46a86b }
.px154 { background: #018d2d }
.px155 { background: #00963c }
.px156 { background: #00933b }
.px157 { background: #00933b }
.px158 { background: #008f3d }
.px159 { background: #008a3d }
.px160 { background: #00843d }
.px161 { background: #a6bbd0 }
.px162 { background: #ebeefd }
.px163 { background: #feffff }
.px164 { background: #faf0d5 }
.px165 { background: #e8ddb0 }
.px166 { background: #decf96 }
.px167 { background: #f7f3ea }
.px168 { background: #ffffff }
.px169 { background: #fafcfb }
.px170 { background: #49a66d }
.px171 { background: #018d2a }
.px172 { background: #009338 }
.px173 { background: #00903b }
.px174 { background: #028b39 }
.px175 { background: #00883c }
.px176 { background: #00853c }
.px177 { background: #fffdff }
.px178 { background: #f3e9d0 }
.px179 { background: #ceb038 }
.px180 { background: #dfb00a }
.px181 { background: #e3b500 }
.px182 { background: #e2ae02 }
.px183 { background: #d6a92a }
.px184 { background: #f1ecd9 }
.px185 { background: #fffefc }
.px186 { background: #d7e8e0 }
.px187 { background: #0d863f }
.px188 { background: #009039 }
.px189 { background: #038c3c }
.px190 { background: #02893d }
.px191 { background: #00853e }
.px192 { background: #00813e }
.px193 { background: #f8fbf4 }
.px194 { background: #cca637 }
.px195 { background: #efb400 }
.px196 { background: #fec502 }
.px197 { background: #fbc30a }
.px198 { background: #f6be09 }
.px199 { background: #eaaa00 }
.px200 { background: #dbb04a }
.px201 { background: #fefefe }
.px202 { background: #fefcff }
.px203 { background: #259155 }
.px204 { background: #008934 }
.px205 { background: #008d3b }
.px206 { background: #00863d }
.px207 { background: #058143 }
.px208 { background: #017d3e }
.px209 { background: #f2ecde }
.px210 { background: #d8a21b }
.px211 { background: #f7b910 }
.px212 { background: #f1b90c }
.px213 { background: #f2b50f }
.px214 { background: #f0b20f }
.px215 { background: #f4b31b }
.px216 { background: #e7ab2f }
.px217 { background: #fff9f3 }
.px218 { background: #f6fbfe }
.px219 { background: #1d854a }
.px220 { background: #008639 }
.px221 { background: #028541 }
.px222 { background: #00863c }
.px223 { background: #028040 }
.px224 { background: #007b3d }
.px225 { background: #fbfcfe }
.px226 { background: #dfb75f }
.px227 { background: #eca70c }
.px228 { background: #f0b116 }
.px229 { background: #f1b215 }
.px230 { background: #f4b31b }
.px231 { background: #f1aa1e }
.px232 { background: #eec47c }
.px233 { background: #feffff }
.px234 { background: #a9cab7 }
.px235 { background: #037631 }
.px236 { background: #01833b }
.px237 { background: #03823f }
.px238 { background: #007d3e }
.px239 { background: #007a3e }
.px240 { background: #007943 }
.px241 { background: transparent }
.px242 { background: #fbf4ec }
.px243 { background: #ebc57c }
.px244 { background: #efb64f }
.px245 { background: #f1b145 }
.px246 { background: #efb64d }
.px247 { background: #f6ce93 }
.px248 { background: #f9fbf6 }
.px249 { background: #d1e1de }
.px250 { background: #1c7849 }
.px251 { background: #007a34 }
.px252 { background: #027c3f }
.px253 { background: #007c40 }
.px254 { background: #007b3c }
.px255 { background: #007a41 }
.px256 { background: transparent }
&lt;/style&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://arielsalminen.com/work/google-favicon.zip&quot;&gt;Download code&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
</feed>