<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Hola SVG</title>
        <link>https://holasvg.com/feed.xml</link>
        <description>Articles about design and code</description>
        <lastBuildDate>Thu, 18 Dec 2025 13:42:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/nuxt-community/feed-module</generator>
        <item>
            <title><![CDATA[An Introduction To CSS Scroll-Driven Animations]]></title>
            <link>https://holasvg.com/posts/2024-12-11-An-Introduction-To-CSS-Scroll-Driven-Animations</link>
            <guid>https://holasvg.com/posts/2024-12-11-An-Introduction-To-CSS-Scroll-Driven-Animations</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>An Introduction To CSS Scroll-Driven Animations</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://www.smashingmagazine.com/2024/12/introduction-css-scroll-driven-animations/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/2024-12-11-An-Introduction-To-CSS-Scroll-Driven-Animations/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/2024-12-11-An-Introduction-To-CSS-Scroll-Driven-Animations/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 December 2024</span> <h1>An Introduction To CSS Scroll-Driven Animations</h1> <p class="inner-post-subtitle">Scroll And View Progress Timelines</p> <a href="/categories/css?type=posts" class="card-category"><span>#css</span></a><a href="/categories/animation?type=posts" class="card-category"><span>#animation</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-An-introduction-to-CSS-Scroll-driven-animations-02.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><h2 id="quick-introduction"><a href="#quick-introduction" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Quick Introduction</h2>
<p>It’s been 10 years since scroll-driven animations were introduced in a spec proposal, and after five years in development, we’re finally beginning to see pop up in websites. There are <a href="https://codepen.io/andrewrock/pen/NWoRavN" rel="nofollow noopener noreferrer" target="_blank">scrolly</a><a href="https://codepen.io/andrewrock/pen/NWoRavN" rel="nofollow noopener noreferrer" target="_blank">-</a><a href="https://codepen.io/andrewrock/pen/NWoRavN" rel="nofollow noopener noreferrer" target="_blank">telling</a> and <a href="https://codepen.io/amit_sheen/pen/ZENNgMw" rel="nofollow noopener noreferrer" target="_blank">maze games</a> as well as <a href="https://codepen.io/bramus/pen/GRdGoKy" rel="nofollow noopener noreferrer" target="_blank">cover flow animations</a> and <a href="https://codepen.io/leemeyer/pen/XWvrMBr" rel="nofollow noopener noreferrer" target="_blank">3D rotation with scroll</a>… but what exactly is new here? It’s not like we haven’t seen scroll animations before, <strong>but what we have now requires no JavsScript, no dependencies, no libraries —just pure CSS</strong>. And if that’s not exciting enough, these animations run off the <a href="https://www.smashingmagazine.com/2023/10/speedcurve-fight-main-thread/" rel="nofollow noopener noreferrer" target="_blank">main thread</a>, delivering smooth, high-performance, GPU-accelerated experiences.</p>
<h2 id="introduction"><a href="#introduction" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Introduction</h2>
<p>You can safely use scroll-driven animations in Chrome as of December 2024. Firefox supports them too, though you’ll need to enable a flag. Safari? Not yet, but don’t worry —you can still offer a seamless experience across all browsers with a <a href="https://github.com/flackr/scroll-timeline" rel="nofollow noopener noreferrer" target="_blank">polyfill</a>. Just keep in mind that adding a polyfill involves a JavaScript library, so you won’t get the same performance boost.</p>
<p>There are plenty of valuable resources to dive into scroll-driven animations, which I’ll be linking throughout the article. My starting point was <a href="https://www.youtube.com/playlist?list=PLNYkxOF6rcICM3ttukz9x5LCNOHfWBVnn" rel="nofollow noopener noreferrer" target="_blank">Bramus' video tutorial</a>, which pairs nicely with <a href="https://css-tricks.com/unleash-the-power-of-scroll-driven-animations/" rel="nofollow noopener noreferrer" target="_blank">Geoff</a> <a href="https://css-tricks.com/unleash-the-power-of-scroll-driven-animations/" rel="nofollow noopener noreferrer" target="_blank">Graham</a><a href="https://css-tricks.com/unleash-the-power-of-scroll-driven-animations/" rel="nofollow noopener noreferrer" target="_blank">'s in-depth</a> <a href="https://css-tricks.com/unleash-the-power-of-scroll-driven-animations/" rel="nofollow noopener noreferrer" target="_blank">notes</a> that build on the tutorial.</p>
<p>In this article, we’ll walk through the <a href="https://www.w3.org/TR/scroll-animations-1/" rel="nofollow noopener noreferrer" target="_blank">latest published version by the W3C</a> and explore the two types of scroll-driven timelines — <strong>scroll progress timelines</strong> and <strong>view progress timelines</strong>. By the end, I hope that you are familiar with both timelines, not only being able to tell them apart but also feeling confident enough to use them in your work.</p>
<p>Please note that all demos in this article only work in Chrome 116 or later at the time of writing.</p>
<h2 id="scroll-progress-timelines"><a href="#scroll-progress-timelines" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Scroll Progress Timelines</h2>
<p>The scroll progress timeline links an animation’s timeline to the scroll position of a scroll container along a specific axis. So, the animation is tied directly to scrolling. As you scroll forward so, too, does the animation. You’ll see me refer to them as <code>scroll-timeline</code> animations in addition to calling them scroll progress timelines.</p>
<p>Just as we have two types of scroll-driven animations, we have two types of <code>scroll-timeline</code> animations: <strong>anonymous timelines</strong> and <strong>named timelines</strong>.</p>
<h3 id="anonymous-scroll-timeline"><a href="#anonymous-scroll-timeline" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Anonymous <code>scroll-timeline</code></h3>
<p>Let’s start with a classic example: creating a scroll progress bar at the top of a blog post to track your reading progress.</p>
<p><a href="https://codepen.io/marianab/pen/Vwozevx" rel="nofollow noopener noreferrer" target="_blank">https://codepen.io/marianab/pen/Vwozevx</a></p>
<p>In this example, there’s a <code>&lt;div></code> with the ID "progress." At the end of the CSS file, you’ll see it has a background color, a defined width and height, and it’s fixed at the top of the page. There’s also an animation that scales it from <code>0</code> to <code>1</code> along the x-axis — pretty standard if you’re familiar with CSS animations!</p>
<p>Here’s the relevant part of the styles:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token id">#progress</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> progressBar <span class="token number">1</span><span class="token unit">s</span> linear<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>


    <span class="token atrule"><span class="token rule">@keyframes</span> progressBar</span> <span class="token punctuation">{</span>
      <span class="token selector">from</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scaleX</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>The <code>progressBar</code> animation runs once and lasts one second with a linear timing function. Linking this animation scrolling is just a single line in CSS:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">scroll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<p>No need to specify seconds for the duration — the scrolling behavior itself will dictate the timing. And that’s it! You’ve just created your first scroll-driven animation! Notice how the animation’s direction is directly tied to the scrolling direction — scroll down and the progress indicator grows wider; scroll up and it becomes narrower.</p>
<p><a href="https://codepen.io/marianab/pen/OJKjMVq" rel="nofollow noopener noreferrer" target="_blank">https://codepen.io/marianab/pen/OJKjMVq</a></p>
<h3 id="scroll-timeline-property-parameters"><a href="#scroll-timeline-property-parameters" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><code>scroll-timeline</code> Property Parameters</h3>
<p>In a <code>scroll-timeline</code> animation, the <code>scroll()</code> function is used inside the <code>animation-timeline</code> property. It only takes two parameters: <code>&lt;scroller></code> and <code>&lt;axis></code>.</p>
<ul>
<li><code>scroller></code> refers to the scroll container, which can be set as <code>nearest</code> (the default), <code>root</code>, or <code>self</code>.</li>
<li><code>&lt;axis></code> refers to the scroll axis, which can be <code>block</code> (the default), <code>inline</code>, <code>x</code>, or <code>y</code>.</li>
</ul>
<p>In the reading progress example above, we didn’t declare any of these because we used the defaults. But we could achieve the same result with:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">scroll</span><span class="token punctuation">(</span>nearest block<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<p>Here, the <code>nearest</code> scroll container is the root scroll of the HTML element. So, we could also write it this way instead:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">scroll</span><span class="token punctuation">(</span>root block<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<p>The <code>block</code> axis confirms that the scroll moves top to bottom in a left-to-right writing mode. If the page has a wide horizontal scroll, and we want to animate along that axis, we could use the <code>inline</code> or <code>x</code>  values (depending on whether we want the scrolling direction to always be left-to-right or adapt based on the writing mode).</p>
<p>We’ll dive into <code>self</code> and <code>inline</code> in more examples later, but the best way to learn is to play around with all the combinations and <a href="https://scroll-driven-animations.style/tools/scroll-timeline/params/" rel="nofollow noopener noreferrer" target="_blank">this tool</a> by Bramus lets you do exactly that. Spend a few minutes in before we jump into the next property associated with scroll timelines.</p>
<h3 id="the-animation-range-property"><a href="#the-animation-range-property" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The <code>animation-range</code> Property</h3>
<p>The <code>animation-range</code> for <code>scroll-timeline</code> defines which part of the scrollable content controls the start and end of an animation's progress, based on the scroll position. It allows you to decide when the animation starts or ends while scrolling through the container.</p>
<p>By default, the <code>animation-range</code> is set to <code>normal</code> which is shorthand for:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range-start</span><span class="token punctuation">:</span> normal<span class="token punctuation">;</span>
    <span class="token property">animation-range-end</span><span class="token punctuation">:</span> normal<span class="token punctuation">;</span>
</code></pre></div>
<p>This translates to <code>0%</code> (<code>start</code>) and <code>100%</code> (<code>end</code>) in a <code>scroll-timeline</code> animation:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> normal normal<span class="token punctuation">;</span>
</code></pre></div>
<p>…which is the same as:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token unit">%</span> <span class="token number">100</span><span class="token unit">%</span><span class="token punctuation">;</span>
</code></pre></div>
<p>You can declare any <a href="https://css-tricks.com/css-length-units/" rel="nofollow noopener noreferrer" target="_blank">CSS</a> <a href="https://css-tricks.com/css-length-units/" rel="nofollow noopener noreferrer" target="_blank">length</a> <a href="https://css-tricks.com/css-length-units/" rel="nofollow noopener noreferrer" target="_blank">units</a> or even <a href="https://www.smashingmagazine.com/2015/12/getting-started-css-calc-techniques/" rel="nofollow noopener noreferrer" target="_blank">calculations</a>. For example, let’s say I have a footer that’s <code>500px</code> tall. It’s filled with banners, ads, and related posts. I don’t want the scroll progress bar to include any of that as part of the reading progress. What I want is for the animation to start at the top and end <code>500px</code> before the bottom. Here we go:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token unit">%</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token unit">%</span> <span class="token operator">-</span> <span class="token number">500</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<iframe height="300" scrolling="no" title="Scroll Progress Timeline example - animation-timeline, animation-range" src="https://codepen.io/marianab/embed/QWXaZdB?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/QWXaZdB">
  Scroll Progress Timeline example - animation-timeline, animation-range&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>Just like that, we’ve covered the key properties of <code>scroll-timeline</code> animations. Ready to take it a step further?</p>
<h3 id="named-scroll-timeline"><a href="#named-scroll-timeline" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Named <code>scroll-timeline</code></h3>
<p>Let’s say I want to use the scroll position of a different scroll container for the same animation. The <code>scroll-timeline-name</code> property allows you to specify which scroll container the scroll animation should be linked to. You give it a name (a dashed-ident, e.g. <code>--my-scroll-timeline</code>) that maps to the scroll container you want to use. This container will then control the animation’s progress as the user scrolls through it.</p>
<p>Next, we need to define the scroll axis for this new container by using <code>scroll-timeline-axis</code> which tells the animation which axis will trigger the motion. Here’s how it looks in the code:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.my-class</span></span> <span class="token punctuation">{</span> 
      <span class="token comment">/* This is my new scroll-container */</span>
      <span class="token property">scroll-timeline-name</span><span class="token punctuation">:</span> <span class="token variable">--my-custom-name</span><span class="token punctuation">;</span>
      <span class="token property">scroll-timeline-axis</span><span class="token punctuation">:</span> inline<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>If you omit the axis, then the default <code>block</code> value will be used. However, you can also use the shorthand <code>scroll-timeline</code> property to combine both the name and axis in a single declaration:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.my-class</span></span> <span class="token punctuation">{</span> 
      <span class="token comment">/* Shorthand for scroll-container with axis */</span>
      <span class="token property">scroll-timeline</span><span class="token punctuation">:</span> <span class="token variable">--my-custom-name</span> inline<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>I think it’s easier to understand all this with a practical example. Here’s the same progress indicator we’ve been working with, but with inline scrolling (i.e. along the x-axis):</p>
<iframe height="300" scrolling="no" title="Named Scroll Progress Timeline" src="https://codepen.io/marianab/embed/GRVgQxy?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/GRVgQxy">
  Named Scroll Progress Timeline&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>We have two animations running:</p>
<ol>
<li>A progress bar grows wider when scrolling in an inline direction.</li>
<li>The container’s background color changes the further you scroll.</li>
</ol>
<p>The HTML structure looks like this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>gallery<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>gallery-scroll-container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>gallery-progress<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>progressbar<span class="token punctuation">"</span></span> <span class="token attr-name">aria-label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>progress<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>image1.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Alt text<span class="token punctuation">"</span></span> <span class="token attr-name">draggable</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>500<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>image2.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Alt text<span class="token punctuation">"</span></span> <span class="token attr-name">draggable</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>500<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>image3.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Alt text<span class="token punctuation">"</span></span> <span class="token attr-name">draggable</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>500<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>In this case, the <code>gallery-scroll-container</code> has horizontal scrolling and changes its background color as you scroll. Normally, we could just use <code>animation-timeline: scroll(self inline)</code> to achieve this. But we also want the <code>gallery-progress</code> element to use the same scroll for its animation.</p>
<p>The <code>gallery-progress</code> element is the first inside <code>gallery-scroll-container</code> and we will lose it when scrolling unless it’s absolutely positioned. But when we do this the element no longer occupies space in the normal document flow, and that affects how the element behaves with its parent and siblings. We need to specify which scroll container we want it to listen to.</p>
<p>That’s where naming the scroll container comes in handy. By giving <code>gallery-scroll-container</code> a <code>scroll-timeline-name</code> and <code>scroll-timeline-axis</code>, we can ensure both animations sync to the same scroll:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.gallery-scroll-container</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> bg <span class="token function">steps</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token property">scroll-timeline</span><span class="token punctuation">:</span> <span class="token variable">--scroller</span> inline<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>And is using that scrolling to define its own <code>animation-timeline</code>:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.gallery-scroll-container</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> bg <span class="token function">steps</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token property">scroll-timeline</span><span class="token punctuation">:</span> <span class="token variable">--scroller</span> inline<span class="token punctuation">;</span>
      <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--scroller</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>Now we can scale this name to the progress bar that is using a different animation but listening to the same scroll:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.gallery-progress</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> progressBar linear<span class="token punctuation">;</span>
      <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--scroller</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>This allows both animations (the growing progress bar and changing background color) to follow the same scroll behavior, even though they are separate elements and animations.</p>
<h3 id="the-timeline-scope-property"><a href="#the-timeline-scope-property" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The <code>timeline-scope</code> Property</h3>
<p>What happens if we want to animate something based on the scroll position of a sibling or even a higher ancestor? This is where the <code>timeline-scope</code> property comes into play. It allows us to extend the scope of a <code>scroll-timeline</code> beyond the current element's subtree. The value of <code>timeline-scope</code> must be a custom identifier, which again is a dashed-ident.</p>
<p>Let’s illustrate this with a new example. This time, scrolling in one container runs an animation inside another container:</p>
<iframe height="300" scrolling="no" title="Scroll Driven Animations - timeline-scope" src="https://codepen.io/marianab/embed/JjgoOOp?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/JjgoOOp">
  Scroll Driven Animations - timeline-scope&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>We can play the animation on the image when scrolling the text container because they are siblings in the HTML structure:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>main-container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sardinas-container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">...</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
    
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scroll-container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Long text...<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Here, only the <code>.scroll-container</code> has scrollable content, so let’s start by naming this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.scroll-container</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">overflow-y</span><span class="token punctuation">:</span> scroll<span class="token punctuation">;</span>
      <span class="token property">scroll-timeline</span><span class="token punctuation">:</span> <span class="token variable">--containerText</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>Notice that I haven’t specified the scroll axis, as it defaults to <code>block</code> (vertical scrolling) and that’s the value I want.</p>
<p>Let's move on to the image inside the <code>sardinas-container</code>. We want this image to animate as we scroll through the <code>scroll-container</code>. I’ve added a <code>scroll-timeline-name</code> to its <code>animation-timeline</code> property:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.sardinas-container</span> img</span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> moveUp <span class="token function">steps</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span> both<span class="token punctuation">;</span>
      <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--containerText</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>At this point, however, the animation still won’t work because the <code>scroll-container</code> is not directly related to the images. To make this work, we need to extend the <code>scroll-timeline-name</code> so it becomes reachable. This is done by adding the <code>timeline-scope</code> to the parent element (or a higher ancestor) shared by both elements:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.main-container</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">timeline-scope</span><span class="token punctuation">:</span> <span class="token variable">--containerText</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>With this setup, the scroll of the <code>scroll-container</code> will now control the animation of the image inside the <code>sardinas-container</code>!</p>
<p>Now that we’ve covered how to use <code>timeline-scope</code>, we’re ready to move on to the next type of scroll-driven animations, where the same properties will apply but with slight differences in how they behave.</p>
<h2 id="view-progress-timelines"><a href="#view-progress-timelines" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>View Progress Timelines</h2>
<p>We just looked at <strong>scroll progress animations</strong>. That’s the first type of scroll-driven animation of the two. Next, we’re turning our attention to <strong>view progress animations</strong>. There’s a lot of similarities between the two! But they’re different enough to warrant their own section for us to explore how they work. You’ll see me refer to these as <code>view-timeline</code> animations in addition to calling them view progress animations, as they revolve around a <code>view()</code> function.</p>
<p>The <strong>view progress timeline</strong> is the second type of type of scroll-driven animation that we’re looking at. It tracks an element as it enters or exits the scrollport (the visible area of the scrollable content). This behavior is quite similar to <a href="https://css-tricks.com/an-explanation-of-how-the-intersection-observer-watches/?ref=csslayout.news" rel="nofollow noopener noreferrer" target="_blank">how an IntersectionObserver works in JavaScript</a> but can be done entirely in CSS.</p>
<p>We have anonymous and named view progress timelines just as we have anonymous and named scroll progress animations. Let’s unpack those.</p>
<h3 id="anonymous-view-timeline"><a href="#anonymous-view-timeline" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Anonymous View Timeline</h3>
<p>Here’s a simple example to help us see the basic idea of anonymous view timelines. Notice how the image fades into view when you scroll down to a certain point on the page:</p>
<iframe height="300" scrolling="no" title="View Timeline Animation - view()" src="https://codepen.io/marianab/embed/mdNJbvp?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/mdNJbvp">
  View Timeline Animation - view()&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>Let’s say we want to animate an image that fades in as it appears in the scrollport. The image’s opacity will go from <code>0</code> to <code>1</code>. This is how you might write that same animation in classic CSS using <code>@keyframes</code>:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector">img</span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> fadeIn <span class="token number">1</span><span class="token unit">s</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    
    <span class="token atrule"><span class="token rule">@keyframes</span> fadeIn</span> <span class="token punctuation">{</span>
      <span class="token selector">from</span> <span class="token punctuation">{</span> <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
      <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>That’s great and all but we want the image to <code>fadeIn</code> when it’s in view. Otherwise, the animation is sort of like a tree that falls in a forest with no one there to witness it… did the animation ever happen? We’ll never know!</p>
<p>We have a <code>view()</code> function that makes this a view progress animation with a single line of CSS:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector">img</span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> fadeIn<span class="token punctuation">;</span>
      <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>And notice how we no longer need to declare an <code>animation-duration</code> like we did in classic CSS. The animation is no longer tied by time but by space. The animation is triggered as the image becomes visible in the scrollport.</p>
<h3 id="view-timeline-parameters"><a href="#view-timeline-parameters" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>View Timeline Parameters</h3>
<p>Just like the <code>scroll-timeline</code> property, the <code>view-timeline</code>  property accepts parameters that allow for more customization:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">view</span><span class="token punctuation">(</span>&lt;inset> &lt;axis><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<ul>
<li><code>&lt;inset></code>: Controls when the animation starts and ends relative to the element’s visibility within the scrollport. It defines the margin between the edges of the scrollport and the element being tracked. The default value is <code>auto</code>, but it can also take length percentages as well as start and end values.</li>
<li><code>&lt;axis></code>: This is similar to the scroll-timeline’s axis parameter. It defines which axis (horizontal or vertical) the animation is tied to. The default is <code>block</code>, which means it tracks the vertical movement. You can also use <code>inline</code> to track horizontal movement, or simple <code>x</code> or <code>y</code>.</li>
</ul>
<p>Here’s an example that uses both <code>inset</code> and <code>axis</code> to customize when and how the animation starts:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector">img</span> <span class="token punctuation">{</span>
      <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token unit">%</span> block<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>In this case:</p>
<ul>
<li>The animation starts when the image is 20% visible in the scrollport.</li>
<li>The animation is triggered by vertical scrolling (<code>block</code> axis).</li>
</ul>
<h2 id="parallax-effect"><a href="#parallax-effect" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Parallax Effect</h2>
<p>With the <code>view()</code> function, it's also easy to create parallax effects by simply adjusting the animation properties. For example, you can have an element move or scale as it enters the scrollport without any JavaScript:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector">img</span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> parallaxMove <span class="token number">1</span><span class="token unit">s</span><span class="token punctuation">;</span>
      <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    
    <span class="token atrule"><span class="token rule">@keyframes</span> parallaxMove</span> <span class="token punctuation">{</span>
      <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">-50</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>This makes it incredibly simple to create dynamic and engaging scroll animations with just a few lines of CSS.</p>
<iframe height="300" scrolling="no" title="Parallax effect with CSS Scroll driven animations - view()" src="https://codepen.io/marianab/embed/WNVbJyZ?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/WNVbJyZ">
  Parallax effect with CSS Scroll driven animations - view()&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="the-animation-range-property-1"><a href="#the-animation-range-property-1" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The <code>animation-range</code> Property</h2>
<p>Using the CSS <code>**animation-range**</code> property with view timelines defines how much of an element's visibility within the scrollport controls the start and end points of the animation's progress. This can be used to fine-tune when the animation begins and ends based on the element's visibility in the viewport.</p>
<p>While the default value is <code>normal</code>, in view timelines it translates to tracking the full visibility of the element, from the moment it starts entering the scrollport until it fully leaves. This is represented as:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> normal normal<span class="token punctuation">;</span>
    <span class="token comment">/* Equivalent to */</span>
    <span class="token property">animation-range</span><span class="token punctuation">:</span> cover <span class="token number">0</span><span class="token unit">%</span> cover <span class="token number">100</span><span class="token unit">%</span><span class="token punctuation">;</span>
</code></pre></div>
<p>Or, more simply:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span>
</code></pre></div>
<p>There are six possible values or <code>timeline-range-names:</code></p>
<ul>
<li><code>cover</code>: Tracks the full visibility of the element, from when it starts entering the scrollport to when it completely leaves it.</li>
<li><code>contain</code>: Tracks when the element is fully visible inside the scrollport, from the moment it’s fully contained until it no longer is.</li>
<li><code>entry</code>: Tracks the element from the point it starts entering the scrollport until it’s fully inside.</li>
<li><code>exit</code>: Tracks the element from the point it starts leaving the scrollport until it’s fully outside.</li>
<li><code>entry-crossing</code>: Tracks the element as it crosses the starting edge of the scrollport, from start to full crossing.</li>
<li><code>exit-crossing</code>: Tracks the element as it crosses the end edge of the scrollport, from start to full crossing.</li>
</ul>
<p>You can mix different <code>timeline-range-names</code> to control the start and end points of the animation range. For example, you could make the animation start when the element enters the scrollport and end when it exits:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> entry exit<span class="token punctuation">;</span>
</code></pre></div>
<p>You can also combine these values with percentages to define more custom behavior, such as starting the animation halfway through the element’s entry and ending it halfway through its exit:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token property">animation-range</span><span class="token punctuation">:</span> entry <span class="token number">50</span><span class="token unit">%</span> exit <span class="token number">50</span><span class="token unit">%</span><span class="token punctuation">;</span>
</code></pre></div>
<p>Exploring all these values and combinations is best done interactively. Tools like Bramus’ <a href="https://scroll-driven-animations.style/tools/view-timeline/ranges/" rel="nofollow noopener noreferrer" target="_blank">view-timeline range visualizer</a> make it easier to understand.</p>
<h3 id="target-range-inside-keyframes"><a href="#target-range-inside-keyframes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Target range inside <code>@keyframes</code></h3>
<p>One of the powerful features of <code>timeline-range-names</code> is their ability to be used inside <code>@keyframes</code>:</p>
<iframe height="300" scrolling="no" title="target range inside @keyframes - view-timeline, timeline-range-name" src="https://codepen.io/marianab/embed/mdNJKrO?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/mdNJKrO">
  target range inside @keyframes - view-timeline, timeline-range-name&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>Two different animations are happening in that demo:</p>
<ol>
<li><code>slideIn</code>: When the element enters the scrollport, it scales up and becomes visible.</li>
<li><code>slideOut</code>: When the element leaves, it scales down and fades out.</li>
</ol>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token atrule"><span class="token rule">@keyframes</span> slideIn</span> <span class="token punctuation">{</span>
      <span class="token selector">from</span> <span class="token punctuation">{</span>
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">.8</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token selector">to</span> <span class="token punctuation">{</span> 
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    
    <span class="token atrule"><span class="token rule">@keyframes</span> slideOut</span> <span class="token punctuation">{</span>
      <span class="token selector">from</span> <span class="token punctuation">{</span>
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">;</span>    
      <span class="token punctuation">}</span>
      <span class="token selector">to</span> <span class="token punctuation">{</span> 
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">.8</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">-100</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span> 
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>The new thing is that now we can merge these two animations using the <code>entry</code> and <code>exit</code> <code>timeline-range-names</code>, simplifying it into one animation that handles both cases:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token atrule"><span class="token rule">@keyframes</span> slideInOut</span> <span class="token punctuation">{</span>
      <span class="token comment">/* Animation for when the element enters the scrollport */</span>
      <span class="token selector">entry 0%</span> <span class="token punctuation">{</span>
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">.8</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token selector">entry 100%</span> <span class="token punctuation">{</span> 
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token comment">/* Animation for when the element exits the scrollport */</span>
      <span class="token selector">exit 0%</span> <span class="token punctuation">{</span>
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">;</span>    
      <span class="token punctuation">}</span>
      <span class="token selector">exit 100%</span> <span class="token punctuation">{</span> 
        <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">.8</span><span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span><span class="token number">-100</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<ul>
<li><code>entry 0%</code>: Defines the state of the element at the beginning of its entry into the scrollport (scaled down and transparent).</li>
<li><code>entry 100%</code>: Defines the state when the element has fully entered the scrollport (fully visible and scaled up).</li>
<li><code>exit 0%</code>: Starts tracking the element as it begins to leave the scrollport (visible and scaled up).</li>
<li><code>exit 100%</code>: Defines the state when the element has fully left the scrollport (scaled down and transparent).</li>
</ul>
<p>This approach allows us to animate the element’s behavior smoothly as it both enters and leaves the scrollport, all within a single <code>@keyframes</code> block.</p>
<h3 id="named-view-timeline-and-timeline-scope"><a href="#named-view-timeline-and-timeline-scope" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Named <code>view-timeline</code> and <code>timeline-scope</code></h3>
<p>The concept of using <code>view-timeline</code> with named timelines and linking them across different elements can truly expand the possibilities for scroll-driven animations. In this case, we are linking the scroll-driven animation of images with the animations of unrelated paragraphs in the DOM structure by using a <strong>named <code>view-timeline</code> and <code>timeline-scope</code></strong>.</p>
<p>The <code>view-timeline</code> property works similarly to the <code>scroll-timeline</code> property. It’s the shorthand for declaring the <code>view-timeline-name</code> and <code>view-timeline-axis</code> properties in one line. But the difference from <code>scroll-timeline</code> is that we can link the animation of an element when the linked elements enter the scrollport. I took the previous demo and added an animation to the paragraphs, you can see how the opacity of the text is animated when scrolling the images on the left:</p>
<iframe height="300" scrolling="no" title="View-timeline, timeline-scope" src="https://codepen.io/marianab/embed/MWNYPbx?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/MWNYPbx">
  View-timeline, timeline-scope&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>This one looks a bit verbose, but I found it hard to come up with a better example to show the power of it. Each image in the vertical scroll container is assigned a named <code>view-timeline</code> with a unique identifier:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.vertical-scroll-container</span> img<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">1</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">view-timeline</span><span class="token punctuation">:</span> <span class="token variable">--one</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.vertical-scroll-container</span> img<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">2</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">view-timeline</span><span class="token punctuation">:</span> <span class="token variable">--two</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.vertical-scroll-container</span> img<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">3</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">view-timeline</span><span class="token punctuation">:</span> <span class="token variable">--three</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.vertical-scroll-container</span> img<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">4</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">view-timeline</span><span class="token punctuation">:</span> <span class="token variable">--four</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
</code></pre></div>
<p>This makes the scroll timeline of each image have its own custom name, such as <code>--one</code> for the first image, <code>--two</code> for the second, and so on.</p>
<p>Next, we connect the animations of the paragraphs to the named timelines of the images. The corresponding paragraph should animate when the images enter the scrollport:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.vertical-text</span> p<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">1</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--one</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.vertical-text</span> p<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">2</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--two</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.vertical-text</span> p<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">3</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--three</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.vertical-text</span> p<span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">4</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token variable">--four</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
</code></pre></div>
<p>However, since the images and paragraphs are not directly related in the DOM, we need to declare a <code>timeline-scope</code> on their common ancestor. This ensures that the named timelines (<code>--one</code>, <code>--two</code>, etc.) can be referenced and shared between the elements:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.porto</span></span> <span class="token punctuation">{</span>
      <span class="token comment">/* ... */</span>
      <span class="token property">timeline-scope</span><span class="token punctuation">:</span> <span class="token variable">--one</span><span class="token punctuation">,</span> <span class="token variable">--two</span><span class="token punctuation">,</span> <span class="token variable">--three</span><span class="token punctuation">,</span> <span class="token variable">--four</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>By declaring the <code>timeline-scope</code> with all the named timelines (<code>--one</code>, <code>—two</code>, <code>--three</code>, <code>--four</code>), both the images and the paragraphs can participate in the same scroll-timeline logic, despite being in separate parts of the DOM tree.</p>
<h2 id="final-notes"><a href="#final-notes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Final Notes</h2>
<p>We’ve covered the vast majority of what’s currently defined in the <a href="https://drafts.csswg.org/scroll-animations-1/" rel="nofollow noopener noreferrer" target="_blank">CSS Scroll-Driven Animations Module Leve 1</a> <a href="https://drafts.csswg.org/scroll-animations-1/" rel="nofollow noopener noreferrer" target="_blank">spec</a><a href="https://drafts.csswg.org/scroll-animations-1/" rel="nofollow noopener noreferrer" target="_blank">ification</a> today in Decemeber 2024. But I want to highlight a few key takeaways that helped me better understand these new rules that you may not get directly from the spec:</p>
<ul>
<li><strong>Scroll container essentials</strong>: It may seem obvious, but a scroll container is necessary for scroll-driven animations to work. Issues often arise when elements like text or containers are resized, or when animations are tested on larger screens, causing the scrollable area to disappear.</li>
<li><strong>Impact of <code>position: absolute</code></strong>: Using absolute positioning can sometimes interfere with the intended behavior of scroll-driven animations. The relationship between elements and their parent elements gets tricky when <code>position: absolute</code> is applied.</li>
<li><strong>Tracking an element’s initial state</strong>: The browser evaluates the element’s state <em>before</em> any transformations (like <code>translate</code>) are applied. This affects when animations, particularly view timelines, begin. Your animation might trigger earlier or later than expected due to the initial state.</li>
<li><strong>Avoid hiding overflow</strong>: Using <code>overflow: hidden</code> can disrupt the scroll-seeking mechanism in scroll-driven animations. The recommended solution is to switch to <code>overflow: clip</code>. Bramus has <a href="https://www.bram.us/2024/02/14/scroll-driven-animations-you-want-overflow-clip-not-overflow-hidden/" rel="nofollow noopener noreferrer" target="_blank">a great article about this</a> and <a href="https://www.youtube.com/watch?v=72pUm4tQesw" rel="nofollow noopener noreferrer" target="_blank">a video from Kevin Powell</a> also suggests that we may no longer need <code>overflow: hidden</code>.</li>
<li><strong>Performance:</strong> For the best results, stick to animating GPU-friendly properties like transforms, opacity, and some filters. These skip the heavy lifting of recalculating layout and repainting. On the other hand, animating things like <code>width</code>, <code>height</code>, or <code>box-shadow</code> can slow things down since they require re-rendering. Bramus <a href="https://www.bram.us/2024/05/30/scroll-driven-animations-with-css-webexpo/" rel="nofollow noopener noreferrer" target="_blank">mentioned</a> that soon, more properties — like <code>background-color</code>, <code>clip-path</code>, <code>width</code>, and <code>height</code> — will be animatable on the compositor, making the performance even better.</li>
<li><strong>Use <code>will-change</code> wisely:</strong> Leverage this property to promote elements to the GPU, but use it sparingly. Overusing <code>will-change</code> can lead to excessive memory usage since the browser reserves resources even if the animations don’t frequently change.</li>
<li><strong>The order matters:</strong> If you are using the <code>animation</code> shorthand, always place the <code>animation-timeline</code> after it.</li>
<li><strong>Progressive enhancement and accessibility:</strong> Combine media queries for reduced motion preferences with the <code>@supports</code> rule to ensure animations only apply when the user has no motion restrictions and the browser supports them. For example:</li>
</ul>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token atrule"><span class="token rule">@media</span> screen <span class="token keyword">and</span> <span class="token punctuation">(</span><span class="token property">prefers-reduce-motion</span><span class="token punctuation">:</span> no-preference<span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token atrule"><span class="token rule">@supports</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">scroll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token punctuation">(</span><span class="token property">animation-range</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token unit">%</span> <span class="token number">100</span><span class="token unit">%</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span> 
        <span class="token selector"><span class="token class">.my-class</span></span> <span class="token punctuation">{</span>
          <span class="token property">animation</span><span class="token punctuation">:</span> moveCard linear both<span class="token punctuation">;</span>    
          <span class="token property">animation-timeline</span><span class="token punctuation">:</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span> 
    <span class="token punctuation">}</span>
</code></pre></div>
<p>My main struggle while trying to build the demos was more about CSS itself than the scroll animations. Sometimes building the layout and generating the scroll was more difficult than applying the scroll animation. Also, some things that confused me at the beginning as the spec keeps evolving and some of these are not there anymore (remember it has been under development for more than five years now!):</p>
<ul>
<li><strong>x and y axes</strong>: These used to be called the “horizontal” and “vertical” axes, and while Firefox may still support the old terminology, it has been updated.</li>
<li><strong>Old <code>@scroll-timeline</code> syntax</strong>: In the past, <code>@scroll-timeline</code> was used to declare scroll timelines, but this has changed in the most recent version of the spec.</li>
<li><strong>Scroll-driven vs. scroll-linked animations</strong>: Scroll-<em>driven</em> animations were originally called scroll-<em>linked</em> animations. If you come across this older term in articles, double-check whether the content has been updated to reflect the latest spec, particularly with features like <code>timeline-scope</code>.</li>
</ul>
<h2 id="more-information"><a href="#more-information" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>More information</h2>
<ul>
<li>All demos from this article can be found <a href="https://codepen.io/collection/WvVpQR" rel="nofollow noopener noreferrer" target="_blank">in this collection</a> and I might include <a href="https://codepen.io/marianab/pen/bGXdEoB" rel="nofollow noopener noreferrer" target="_blank">more</a> as I experiment further.</li>
<li>A collection of <a href="https://codepen.io/collection/aMgBZp" rel="nofollow noopener noreferrer" target="_blank">demos from CodePen</a> that I find interesting (send me yours and I’ll include it!)</li>
<li>This <a href="https://github.com/w3c/csswg-drafts/labels/scroll-animations-1" rel="nofollow noopener noreferrer" target="_blank">GitHub repo</a> is where you can report issues or join discussions about scroll-driven animations.</li>
<li><a href="https://scroll-driven-animations.style/" rel="nofollow noopener noreferrer" target="_blank">Demos, tools, videos</a>, and (even) more information from Bramus</li>
<li>Google Chrome <a href="https://www.youtube.com/playlist?list=PLNYkxOF6rcICM3ttukz9x5LCNOHfWBVnn" rel="nofollow noopener noreferrer" target="_blank">video tutorial</a></li>
</ul></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/6-fallas-comunes-en-SVG" data-v-5e4666ba>
      ←
      6 fallas comunes en SVG y cómo solucionarlas
    </a></div> <div data-v-5e4666ba><!----></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/2024-12-11-An-Introduction-To-CSS-Scroll-Driven-Animations/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 common SVG fails and how to fix them]]></title>
            <link>https://holasvg.com/posts/6-common-SVG-fails</link>
            <guid>https://holasvg.com/posts/6-common-SVG-fails</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>6 common SVG fails and how to fix them</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/6-common-svg-fails-and-how-to-fix-them/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/6-common-SVG-fails/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/6-common-SVG-fails/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">23 February 2023</span> <h1>6 common SVG fails and how to fix them</h1> <p class="inner-post-subtitle"></p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-6fails-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Someone recently asked me how I approach debugging inline SVGs. Because it is part of the DOM, we can inspect any inline SVG in any browser DevTools. And because of that, we have the ability to scope things out and uncover any potential issues or opportunities to optimize the SVG.</p>
<p>But sometimes, we can't even see our SVGs at all. In those cases, there are six specific things that I look for when I'm debugging.</p>
<h2 id="1-the-viewbox-values"><a href="#1-the-viewbox-values" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>1. The viewBox values</h2>
<p>The viewBox is a common point of confusion when working with SVG. It’s technically fine to use inline SVG without it, but we would lose one of its most significant benefits: scaling with the container. At the same time, it can work against us when improperly configured, resulting in unwanted clipping.</p>
<p>The elements are there when they’re clipped — they’re just in a part of the coordinate system that we don’t see. If we were to open the file in some graphics editing program, it might look like this:</p>
<figure>
    <img src="/blog/blog-6fails-02.png" alt="">
	<figcaption>Screenshot of SVG opened in Illustrator.</figcaption>
</figure>
<p>The easiest way to fix this? Add <code>overflow="visible"</code> to the SVG, whether it’s in our stylesheet, inline on the style attribute or directly as an SVG presentation attribute. But if we also apply a background-color to the SVG or if we have other elements around it, things might look a little bit off. In this case, the best option will be to edit the viewBox to show that part of the coordinate system that was hidden:</p>
<figure>
    <img src="/blog/blog-6fails-03.gif" alt="">
	<figcaption>Demo applying overflow="hidden" and editing the `viewBox`.</figcaption>
</figure>
<p>There are a few additional things about the <code>viewBox</code> that are worth covering while we're on the topic:</p>
<h3 id="how-does-the-viewbox-work"><a href="#how-does-the-viewbox-work" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>How does the <code>viewBox</code> work?</h3>
<p>SVG is an infinite canvas, but we can control what we see and how we see it through the <code>viewport</code> and the <code>viewBox</code>.</p>
<p>The <code>viewport</code> is a window frame on the infinite canvas. Its dimensions are defined by <code>width</code> and <code>height</code> attributes, or in CSS with the corresponding <code>width</code> and <code>height</code> properties. We can specify any length unit we want, but if we provide unitless numbers, they default to pixels.</p>
<p>The <code>viewBox</code> is defined by four values. The first two are the starting point at the upper-left corner (<code>x</code> and <code>y</code> values, negative numbers allowed). I’m editing these to reframe the image. The last two are the width and height of the coordinate system inside the viewport — this is where we can edit the scale of the grid (which we'll get into in the section on Zooming).</p>
<p>Here’s simplified markup showing the SVG <code>viewBox</code> and the <code>width</code> and <code>height</code> attributes both set on the <code>&lt;svg></code>:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 700 700<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token comment">&lt;!-- etc. --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<h3 id="reframing"><a href="#reframing" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Reframing</h3>
<p>So, this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 700 700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>...maps to this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>start-x-axis start-y-axis width height<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>The <code>viewport</code> we see starts where 0 on the <code>x-axis</code> and 0 on the <code>y-axis</code> meet.</p>
<p>By changing this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 700 700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>...to this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300 200 700 700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>...the <code>width</code> and <code>height</code> remain the same (700 units each), but the start of the coordinate system is now at the 300 point on the x-axis and 200 on the y-axis.</p>
<p>In the following video I’m adding a red <code>&lt;circle></code> to the SVG with its center at the 300 point on the <code>x-axis</code> and 200 on the <code>y-axis</code>. Notice how changing the <code>viewBox</code> coordinates to the same values also changes the circle’s placement to the upper-left corner of the frame while the rendered size of the SVG remains the same (700×700). All I did was “reframe” things with the viewBox.</p>
<figure>
    <img src="/blog/blog-6fails-04.gif" alt="">
</figure>
<h3 id="zooming"><a href="#zooming" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Zooming</h3>
<p>We can change the last two values inside the <code>viewBox</code> to zoom in or out of the image. The larger the values, the more SVG units are added to fit in the viewport, resulting in a smaller image. If we want to keep a 1:1 ratio, our <code>viewBox</code> width and height must match our <code>viewport</code> width and height values.</p>
<p>Let’s see what happens in Illustrator when we change these parameters. The artboard is the <code>viewport</code> which is represented by a white 700px square. Everything else outside that area is our infinite SVG canvas and gets clipped by default.</p>
<p>Figure 1 below shows a blue dot at 900 along the <code>x-axis</code> and 900 along the <code>y-axis</code>. If I change the last two viewBox values from 700 to 900 like this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300 200 900 900<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>...then the blue dot is almost fully back in view, as seen in Figure 2 below. Our image is scaled down because we increased the <code>viewBox</code> values, but the SVG's actual <code>width</code> and <code>height</code> dimensions remained the same, and the blue dot made its way back closer to the unclipped area.</p>
<figure>
    <img src="/blog/blog-6fails-05.png" alt="">
	<figcaption>Figure 1.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-6fails-06.png" alt="">
	<figcaption>Figure 2.</figcaption>
</figure>
<p>There is a pink square as evidence of how the grid scales to fit the <code>viewport</code>: the unit gets smaller, and more grid lines fit into the same <code>viewport</code> area. You can play with the same values in the following Pen to see that work in action:</p>
<iframe height="300" scrolling="no" title="cat viewbox" src="https://codepen.io/marianab/embed/bGKyprL?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/bGKyprL">
  cat viewbox&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="2-missing-width-and-height"><a href="#2-missing-width-and-height" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>2. Missing width and height</h2>
<p>Another common thing I look at when debugging inline SVG is whether the markup contains the <code>width</code> or <code>height</code> attributes. This is no big deal in many cases unless the SVG is inside a container with absolute positioning or a flexible container (as Safari computes the SVG width value with <code>0px</code> instead of <code>auto</code>). Excluding <code>width</code> or <code>height</code> in these cases prevents us from seeing the full image, as we can see by opening this CodePen demo and comparing it in Chrome, Safari, and Firefox (tap images for larger view).</p>
<figure>
    <img src="/blog/blog-6fails-07.png" alt="">
	<figcaption>Chrome, Safari and Firefox.</figcaption>
</figure>
<p>The solution? Add a <code>width</code> or <code>height</code>, whether as a presentation attribute, inline in the style attribute, or in CSS. Avoid using <code>height</code> by itself, particularly when it is set <code>to 100%</code> or <code>auto</code>. Another workaround is to<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/position" rel="nofollow noopener noreferrer" target="_blank"> set the right and left values</a>.</p>
<p>You can play around with <a href="https://codepen.io/marianab/pen/WNyBxYN" rel="nofollow noopener noreferrer" target="_blank">the following Pen</a> and combine the different options.</p>
<iframe height="300" scrolling="no" title="SVG inside position absolute or flex" src="https://codepen.io/marianab/embed/WNyBxYN?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/WNyBxYN">
  SVG inside position absolute or flex&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="3-inadvertent-fill-and-stroke-colors"><a href="#3-inadvertent-fill-and-stroke-colors" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>3. Inadvertent fill and stroke colors</h2>
<p>It may also be that we are applying color to the <code>&lt;svg></code> tag, whether it's an inline style or coming from CSS. That's fine, but there could be other color values throughout the markup or styles that conflict with the color set on the <code>&lt;svg></code>, causing parts to be invisible.</p>
<p>That's why I tend to look for the <code>fill</code> and <code>stroke</code> attributes in the SVG's markup and wipe them out. The following video shows an SVG I styled in CSS with a red fill. There are a couple of instances where parts of the SVG are filled in white directly in the markup that I removed to reveal the missing pieces.</p>
<figure>
    <img src="/blog/blog-6fails-08.gif" alt="">
</figure>
<h2 id="4-missing-ids"><a href="#4-missing-ids" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>4. Missing IDs</h2>
<p>This one might seem super obvious, but you’d be surprised how often I see it come up. Let’s say we made an SVG file in Illustrator and were very diligent about naming our layers so that you get nice matching IDs in the markup when exporting the file. And let’s say we plan to style that SVG in CSS by hooking into those IDs.</p>
<p>That’s a nice way to do things. But there are plenty of times where I’ve seen the same SVG file exported a second time to the same location and the IDs are different, usually when copy/pasting the vectors directly. Maybe a new layer was added, or one of the existing ones was renamed or something. Whatever the case, the CSS rules no longer match the IDs in the SVG markup, causing the SVG to render differently than you’d expect.</p>
<figure>
    <img src="/blog/blog-6fails-09.png" alt="">
	<figcaption>Pasting Illustrator's exported SVG file into SVGOMG.</figcaption>
</figure>
<p>In large SVG files we might find it difficult to find those IDs. This is a good time to open the DevTools, inspect that part of the graphic that’s not working, and see if those IDs are still matching.</p>
<p>So, I'd say it's worth opening an exported SVG file in a code editor and comparing it to the original before swapping things out. Apps like Illustrator, Figma, and Sketch are smart, but that doesn’t mean we aren’t responsible for vetting them.</p>
<h2 id="5-checklist-for-clipping-and-masking"><a href="#5-checklist-for-clipping-and-masking" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>5. Checklist for clipping and masking</h2>
<p>If an SVG is unexpectedly clipped and the <code>viewBox</code> checks out alright, I usually look at the CSS for <code>clip-path</code> or <code>mask</code> properties that might interfere with the image. It’s tempting to keep looking at the inline markup, but it’s good to remember that an SVG’s styling might be happening elsewhere.</p>
<p>CSS clipping and masking allow us to "hide" parts of an image or element. In SVG, <code>&lt;clipPath></code> is a vector operation that cuts parts of an image with no halfway results. The <code>&lt;mask></code> tag is a pixel operation that allows transparency, semi-transparency effects, and blurred edges.</p>
<p>This is a small checklist for debugging cases where clipping and masking are involved:</p>
<ul>
<li>
<p>Make sure the clipping path (or mask) and the graphic overlap one another. The overlapping parts are what gets displayed.</p>
</li>
<li>
<p>If you have a complex <code>path</code> that is not intersecting your graphic, try applying transforms until they match.</p>
</li>
<li>
<p>You can still inspect the inner code with the DevTools even though the <code>&lt;clipPath></code> or<code> &lt;mask></code> are not rendered, so use it!</p>
</li>
<li>
<p>Copy the markup inside <code>&lt;clipPath></code> and <code>&lt;mask></code> and paste it before closing the <code>&lt;/svg></code> tag. Then add a fill to those shapes and check the SVG's coordinates and dimensions. If you still do not see the image, try adding <code>overflow="hidden"</code> to the <code>&lt;svg></code> tag.</p>
</li>
<li>
<p>Check that a unique ID is used for the <code>&lt;clipPath></code> or<code> &lt;mask></code>, and that the same ID is applied to the shapes or group of shapes that are clipped or masked. A mismatched ID will break the appearance.</p>
</li>
<li>
<p>Check for typos in the markup between the <code>&lt;clipPath></code> or <code>&lt;mask></code> tags.</p>
</li>
<li>
<p><code>fill</code>, <code>stroke</code>, <code>opacity</code>, or some other styles applied to the elements inside <code>&lt;clipPath></code> are useless — the only useful part is the fill-region geometry of those elements. That's why if you use a <code>&lt;polyline></code> it will behave as a <code>&lt;polygon></code> and if you use a <code>&lt;line></code> you won't see any clipping effect.</p>
</li>
<li>
<p>If you don't see your image after applying a <code>&lt;mask></code>, make sure that the fill of the masking content is not entirely black. The luminance of the masking element determines the opacity of the final graphic. You'll be able to see through the brighter parts, and the darker parts will hide your image's content.</p>
</li>
</ul>
<p>You can play with masked and clipped elements <a href="https://codepen.io/marianab/pen/mdjdGZj" rel="nofollow noopener noreferrer" target="_blank">in this Pen</a>.</p>
<h2 id="6-namespaces"><a href="#6-namespaces" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>6. Namespaces</h2>
<p>Did you know that SVG is an XML-based markup language? Well, it is! The <code>namespace</code> for SVG is set on the xmlns attribute:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token comment">&lt;!-- etc. --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>There’s a lot to know about namespacing in XML and MDN has a great primer on it. Suffice to say, the namespace provides context to the browser, informing it that the markup is specific to SVG. The idea is that namespaces help prevent conflicts when more than one type of XML is in the same file, like SVG and XHTML. This is a much less common issue in modern browsers but could help explain SVG rendering issues in older browsers or browsers like Gecko that are strict when defining doctypes and namespaces.</p>
<p>The <code>SVG 2</code> specification does not require namespacing when using <code>HTML</code> syntax. But it’s crucial if support for legacy browsers is a priority — plus, it doesn’t hurt anything to add it. That way, when the <code>&lt;html></code> element’s <code>xmlns</code> attribute is defined, it will not conflict in those rare cases.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/1999/xhtml<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700px<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700px<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token comment">&lt;!-- etc. --></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>This is also true when using inline SVG in CSS, like setting it as a <code>background-image</code>. In the following example, a checkmark icon appears on the input after successful validation. This is what the CSS looks like:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">textarea<span class="token pseudo-class">:valid</span></span> <span class="token punctuation">{</span>
 <span class="token property">background</span><span class="token punctuation">:</span> <span class="token color">white</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'data:image/svg+xml,\
    &lt;svg xmlns="http://www.w3.org/2000/svg" width="26" height="26">\
    &lt;circle cx="13" cy="13" r="13" fill="%23abedd8"/>\
    &lt;path fill="none" stroke="white" stroke-width="2" d="M5 15.2l5 5 10-12"/>\
    &lt;/svg>'</span><span class="token punctuation">)</span></span> no-repeat <span class="token number">98</span><span class="token unit">%</span> <span class="token number">5</span><span class="token unit">px</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div>
<p>When we remove the namespace inside the SVG in the <code>background</code> property, the image disappears:</p>
<figure>
    <img src="/blog/blog-6fails-10.gif" alt="">
</figure>
<p>Another common namespace prefix is <code>xlink:href.</code> We use it a lot when referencing other parts of the SVG like: patterns, filters, animations or gradients. The recommendation is to start replacing it with <code>href</code> as the other one is being deprecated since <code>SVG 2</code>, but there might be compatibility issues with older browsers. In that case, we can use both. Just remember to include the namespace <code>xmlns:xlink="http://www.w3.org/1999/xlink"</code> if you are still using <code>xlink:href</code>.</p>
<h2 id="level-up-your-svg-skills"><a href="#level-up-your-svg-skills" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Level up your SVG skills!</h2>
<p>I hope these tips help save you a ton of time if you find yourself troubleshooting improperly rendered inline SVGs. These are just the things I look for. Maybe you have different red flags you watch for — if so, tell me in the comments!</p>
<p>The bottom line is that it pays to have at least a basic understanding of <a href="https://css-tricks.com/using-svg/" rel="nofollow noopener noreferrer" target="_blank">the various ways SVG can be used</a>. <a href="https://codepen.io/challenges" rel="nofollow noopener noreferrer" target="_blank">CodePen Challenges</a> often incorporate SVG and offer good practice. Here are a few more resources to level up:</p>
<ul>
<li>
<p><a href="https://www.oreilly.com/library/view/using-svg-with/9781491921968/" rel="nofollow noopener noreferrer" target="_blank">Using SVG with CSS3 and HTML5</a> (Amelia Bellamy-Royds, Kurt Cagle, Dudley Storey) — I consider it the SVG Bible.</p>
</li>
<li>
<p>Lea Verou has a wealth of SVG knowledge and <a href="https://lea.verou.me/speaking/" rel="nofollow noopener noreferrer" target="_blank">has spoken on the topic quite a bit</a> (like <a href="https://www.youtube.com/watch?v=6qSN50Qk_54&ab_channel=FrontendUnited" rel="nofollow noopener noreferrer" target="_blank">this video</a> from Frontend United 2019).</p>
</li>
<li>
<p><a href="https://www.oreilly.com/library/view/svg-animations/9781491939697/" rel="nofollow noopener noreferrer" target="_blank">SVG Animations</a> (Sarah Drasner)</p>
</li>
<li>
<p><a href="https://www.oreilly.com/library/view/svg-essentials-2nd/9781491945308/" rel="nofollow noopener noreferrer" target="_blank">SVG Essentials</a> (Amelia Bellamy-Royds, J. David Eisenberg)</p>
</li>
<li>
<p><a href="https://abookapart.com/products/practical-svg" rel="nofollow noopener noreferrer" target="_blank">Practical SVG</a> (Chris Coyier)</p>
</li>
</ul>
<p>There are a few people I suggest following for SVG-related goodness:</p>
<ul>
<li>
<p><a href="https://www.sarasoueidan.com/" rel="nofollow noopener noreferrer" target="_blank">Sara Soueidan</a></p>
</li>
<li>
<p><a href="https://www.snorkl.tv/" rel="nofollow noopener noreferrer" target="_blank">Carl Schoof</a></p>
</li>
<li>
<p><a href="https://www.cassie.codes/" rel="nofollow noopener noreferrer" target="_blank">Cassie Evans</a></p>
</li>
<li>
<p><a href="https://valhead.com/" rel="nofollow noopener noreferrer" target="_blank">Val Head</a></p>
</li>
<li>
<p><a href="https://codepen.io/thebabydino" rel="nofollow noopener noreferrer" target="_blank">Ana Tudor</a></p>
</li>
</ul>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/6-common-svg-fails-and-how-to-fix-them/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> thanks to the edits from <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/8-trucos-para-optimizar-SVG" data-v-5e4666ba>
      ←
      8 trucos para optimizar SVG
    </a></div> <div data-v-5e4666ba><a href="/posts/6-fallas-comunes-en-SVG" data-v-5e4666ba>
      6 fallas comunes en SVG y cómo solucionarlas
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/6-common-SVG-fails/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[8 tricks for SVG optimization]]></title>
            <link>https://holasvg.com/posts/8-tricks-for-SVG-optimization</link>
            <guid>https://holasvg.com/posts/8-tricks-for-SVG-optimization</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>8 tricks for SVG optimization</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://uxdesign.cc/8-tricks-for-svg-optimization-c2c519c10c1e"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/8-tricks-for-SVG-optimization/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/8-tricks-for-SVG-optimization/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">23 August 2022</span> <h1>8 tricks for SVG optimization</h1> <p class="inner-post-subtitle"></p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/optimization?type=posts" class="card-category"><span>#optimization</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-8ways-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Many online tools help us optimize SVG files before getting the code into our projects. But what if I tell you that the way we draw every element has an impact on the exported code? Understanding the code generated from graphic software will help us gain more control over it. Here are some tricks that can save us time when manipulating SVG code on our projects.</p>
<p>Although the examples are on Illustrator, I will also cover ways to improve the code from <a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noopener noreferrer" target="_blank">SVGOMG</a>, and I hope most of them apply to any software you are using to create graphics that will become part of a web or app later on. Some of these tips may sound too picky, but if you are in a project where every bit counts, they might serve you well.</p>
<h3 id="1-startsmall"><a href="#1-startsmall" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>1. Start small</h3>
<p>A tiny thing we can do is to design small. As the name implies, SVG scales infinitely without losing quality, which is one of its main advantages. Sometimes we forget about the canvas size while creating, and sometimes we design on big screens with things that need to be at scale. Before exporting, I found it helpful to scale the design and minimize it to a reasonable size. This way, we will reduce many numbers on coordinates that use more than 1 or 2 digits. Of course, the bigger the file, the bigger the impact.</p>
<h3 id="2-avoid-magicnumbers"><a href="#2-avoid-magicnumbers" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>2. Avoid "magic" numbers</h3>
<p>Following the previous point, after moving our design around, scaling and collapsing, we might end with many decimal numbers when exporting the results (especially on the stroke attribute). In case it applies, there is a checkbox option that can be used to prevent our stroke and effects to scale with the shape.</p>
<figure>
    <img src="/blog/blog-8ways-02.png" alt="">
	<figcaption>Scale Strokes & Effects box in Illustrator.</figcaption>
</figure>
<ul>
<li><strong>In Illustrator,</strong> it is possible to choose how many decimals from 0 to 5 the vectors will have after choosing the <em>'Export As'</em> option:</li>
</ul>
<figure>
    <img src="/blog/blog-8ways-03.png" alt="">
	<figcaption>'Export As' options box in Illustrator.</figcaption>
</figure>
<ul>
<li><strong>In SVGOMG,</strong> there is an option that I like: '<em>Round/rewrite numbers</em>'. Take a look at the <code>stroke-width</code> in the example below. In the end, I am editing the Precision to reduce one more decimal to the stroke; let's review this option further in the next one.</li>
</ul>
<figure>
    <img src="/blog/blog-8ways-04.gif" alt="">
	<figcaption>Rounding numbers on SVGOMG.</figcaption>
</figure>
<h3 id="3-simplifypaths"><a href="#3-simplifypaths" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>3. Simplify paths</h3>
<p>Every point counts. When reducing the nodes of our illustration, we are reducing the file size by generating less SVG code. These are two different ways of doing this:</p>
<ul>
<li><strong>In Illustrator</strong>, we select the path we want to edit, then in the menu, click '<em>Object > Path > Simplify'</em></li>
</ul>
<figure>
    <img src="/blog/blog-8ways-05.gif" alt="">
	<figcaption>See how it goes from 1549 to 545pts and the graphic looks the same.</figcaption>
</figure>
<ul>
<li><strong>In SVGOMG</strong>, after pasting the code, a sidebar will appear on the right with a slider under the name "<em>Precision</em>" to play with how many nodes we want to keep while observing the changes on the graphic</li>
</ul>
<figure>
    <img src="/blog/blog-8ways-06.gif" alt="">
	<figcaption>With the optimization applied is almost half of the size now.</figcaption>
</figure>
<p>Sometimes we won't even notice the difference. Other times this is not an option: unfortunately, I didn't find a way to reduce nodes in a way that keeps a perfect fit like, for example, in a political map where we need the limits to match perfectly.</p>
<figure>
    <img src="/blog/blog-8ways-07.jpg" alt="">
	<figcaption>On the right, the green background is visible on some parts of the map.</figcaption>
</figure>
<h3 id="4-extra-letter-spacing-in-svgtext"><a href="#4-extra-letter-spacing-in-svgtext" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>4. Extra letter-spacing in SVG text</h3>
<p>When using text in SVG, the code exported includes tons of <code>&lt;tspan></code> with <code>letter-spacing</code> between the letters. Which is very annoying when we want to edit those texts in the code. I used to remove those by hand. That is until I found that the default setting for kerning between characters is '<em>Auto</em>' (which is the Illustrator solution to adjust visually some pair of letters), and to revert it back to its original spacing, we need to select '<em>0</em>'. This will avoid those extra <code>tspans</code> with letter spacing and simplify our code a lot.</p>
<ul>
<li><strong>With kerning Auto:</strong></li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>text</span> <span class="token attr-name">font-family</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Arial<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">letter-spacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-.01em<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>L<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5.5<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>o<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>12.08<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">letter-spacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-.01em<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>r<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>15.89<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>em ipsum<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>text</span><span class="token punctuation">></span></span>
</code></pre></div>
<ul>
<li><strong>With Kerning 0:</strong></li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>text</span> <span class="token attr-name">font-family</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Arial<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Lorem ipsum<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>text</span><span class="token punctuation">></span></span>
</code></pre></div>
<h3 id="5-mergeexpand-shapes"><a href="#5-mergeexpand-shapes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>5. Merge/expand shapes</h3>
<p>Let's say we have many shapes on top of each other, creating a complex figure: as we export this drawing, every shape will have its code, and all the shapes will remain there. A good amount of code will be reduced if we merge the shapes that share the same attributes to make them a single shape. To do that in Illustrator with the figures selected, we go to the Pathfinder panel and click the first option '<em>Unite</em>'.</p>
<figure>
    <img src="/blog/blog-8ways-08.gif" alt="">
	<figcaption>Unite shapes in Illustrator.</figcaption>
</figure>
<p>If some of those shapes are paths and they are on top of each other, we have the option '<em>Merge paths'</em> on SVGOMG that will collapse those paths into one. For basic shapes, we'll need to check the option '<em>Shapes to (smaller) path</em>'. But this is not something that works as I expected, as I can't seem to make all shapes merge, and I wonder if it has to be with the position of the elements:</p>
<figure>
    <img src="/blog/blog-8ways-09.gif" alt="">
	<figcaption>Merging paths on SVGOMG.</figcaption>
</figure>
<h3 id="6-radius-onrects"><a href="#6-radius-onrects" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>6. Radius on rects</h3>
<p>When we add corners to a <code>&lt;rect></code>, Illustrator turns the <code>&lt;rect></code> into a <code>&lt;path></code>. Even if the radius is big enough to turn the square into a circle, it will always return a path in the code. But there are many cases where we want to keep the basic shapes as they are. In the case of the circle, the only solution will be to draw it with the ellipse tool, but in any other case, we can use the rectangle tool, and instead of rounding the corners in Illustrator we can add the attributes <code>rx</code> and/or <code>ry</code> to the code later. That will also save us some bytes.</p>
<ul>
<li><strong>In Illustrator,</strong> with rounded corners:</li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M60 100H40C17.9 100 0 82.1 0 60V40C0 17.9 17.9 0 40 0h20c22.1 0 40 17.9 40 40v20c0 22.1-17.9 40-40 40z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<ul>
<li><strong>In the code,</strong> rounded corners with <code>rx</code>:</li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">rx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<h3 id="7-rotation-ofrects"><a href="#7-rotation-ofrects" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>7. Rotation of rects</h3>
<p>How we draw on Illustrator determines many things. If I'm drawing a <code>rect</code> 10 units width and 50 units tall, and then I decide to rotate it 90 degrees, the shape will be exported with a transform rotation inside and <strong>with the attributes swapped</strong>:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(90 25 5)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<p>The first number in the transform represents the angle (90 because I rotated it clockwise) but should be -90 if I'd made it anticlockwise. The other two numbers set the coordinates of the <code>transform-origin</code> to the middle of the rectangle.</p>
<p>The only way I found to reset this is by changing the transforms and width/height in Illustrator, which is better than doing it directly in the code, where the <code>x</code> and <code>y</code> positions might have changed too.</p>
<blockquote>
<p>This doesn't happen with one or few rects only, but on the rects that belong to a composition that is rotated later in the process.</p>
</blockquote>
<h3 id="8-direction-ofshapes"><a href="#8-direction-ofshapes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><strong>8. Direction of shapes</strong></h3>
<p>Let's say that I kept the transform rotation <code>transform="rotate(90 25 5)"</code> from the example above. Every time I change the width of the bar, it will grow from right to left; as I was building a bar chart, I needed them to grow the opposite way. Here are some options to change this:</p>
<ul>
<li><strong>In Illustrator,</strong> rotate the shape in a different direction (anticlockwise)</li>
<li><strong>In the code,</strong> change the rotation from 90 to -90</li>
<li><strong>In Illustrator,</strong> reverse the path direction <em>Object > Path > Reverse path direction</em></li>
</ul>
<h3 id="bonus-track"><a href="#bonus-track" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Bonus track</h3>
<ul>
<li>The <code>&lt;use></code> element is something to keep in mind for cases where a part of the graphic is repeated; here <a href="https://css-tricks.com/going-beyond-automatic-svg-compression-with-the-use-element/" rel="nofollow noopener noreferrer" target="_blank">is an article</a> with an example of how this element can save us many lines of code.</li>
<li>The attribute <code>stroke-miterlimit="10"</code> by default appears many times in exported paths from Illustrator where the <code>stroke-linejoin</code> is round and is not doing anything. <a href="https://css-tricks.com/mastering-svgs-stroke-miterlimit-attribute/" rel="nofollow noopener noreferrer" target="_blank">Here is a complete article</a> about this attribute.</li>
<li>Many other articles go further on SVG code optimization, like <a href="https://css-tricks.com/optimizing-svg-patterns/" rel="nofollow noopener noreferrer" target="_blank">this one</a> by <a href="https://twitter.com/finnhvman" rel="nofollow noopener noreferrer" target="_blank">Bence Szabó</a> that dives deeply into manual optimization of a pattern while learning many things about SVG syntax.</li>
</ul>
<p>I feel there are so many tips and tricks to explore. Do you have any to share?</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/mastering-SVGs-stroke-miterlimit-Attribute" data-v-5e4666ba>
      ←
      Mastering SVG's stroke-miterlimit Attribute
    </a></div> <div data-v-5e4666ba><a href="/posts/8-trucos-para-optimizar-SVG" data-v-5e4666ba>
      8 trucos para optimizar SVG
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/8-tricks-for-SVG-optimization/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 fallas comunes en SVG y cómo solucionarlas]]></title>
            <link>https://holasvg.com/posts/6-fallas-comunes-en-SVG</link>
            <guid>https://holasvg.com/posts/6-fallas-comunes-en-SVG</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>6 fallas comunes en SVG y cómo solucionarlas</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/6-common-svg-fails-and-how-to-fix-them/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/6-fallas-comunes-en-SVG/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/6-fallas-comunes-en-SVG/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">23 February 2023</span> <h1>6 fallas comunes en SVG y cómo solucionarlas</h1> <p class="inner-post-subtitle"></p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-6fails-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Alguien me preguntó recientemente cómo debuggeo SVGs inline. Debido a que son parte del DOM, podemos inspeccionar cualquier SVG inline en cualquier navegador con las DevTools. Gracias a eso, tenemos la capacidad de analizar los elementos y descubrir cualquier problema u oportunidad potencial para optimizar el SVG.</p>
<p>Pero hay veces que ni siquiera podemos ver nuestros SVG. En esos casos, hay seis cosas específicas que busco cuando estoy depurando.</p>
<h2 id="1-los-valores-de-viewbox"><a href="#1-los-valores-de-viewbox" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>1. Los valores de viewBox</h2>
<p>El <code>viewBox</code> es un punto común de confusión cuando se trabaja con SVG. Está técnicamente bien usar SVG inline sin él, pero perderíamos uno de sus beneficios más significativos: escalar con el contenedor. Al mismo tiempo, puede ser contraproducente cuando se configura de forma incorrecta, generando un recorte no deseado.</p>
<p>Los elementos están ahí cuando están clipeados, solo que están en una parte del sistema de coordenadas que no vemos. Si abriéramos el archivo en algún programa de edición de gráficos, se vería algo así:</p>
<figure>
    <img src="/blog/blog-6fails-02.png" alt="">
	<figcaption>Captura de pantalla de SVG abierto en Illustrator.</figcaption>
</figure>
<p>¿La forma más fácil de arreglar esto? Agregar <code>overflow="visible"</code> al SVG, ya sea en nuestra hoja de estilo, inline en el atributo de estilo o directamente como un atributo de presentación SVG. Pero si también aplicamos un color de fondo al SVG o si tenemos otros elementos a su alrededor, las cosas pueden verse un poco mal. En este caso, la mejor opción será editar <code>viewBox</code> para mostrar esa parte del sistema de coordenadas que estaba oculta:</p>
<figure>
    <img src="/blog/blog-6fails-03.gif" alt="">
	<figcaption>Demostración aplicando `overflow="hidden"` y editando `viewBox`.</figcaption>
</figure>
<p>Hay algunos puntos adicionales sobre el <code>viewBox</code> que vale la pena mencionar mientras estamos en el tema:</p>
<h3 id="cómo-funciona-el-viewbox"><a href="#c%C3%B3mo-funciona-el-viewbox" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¿Cómo funciona el viewBox?</h3>
<p>SVG es un lienzo infinito, pero podemos controlar lo que vemos y cómo lo vemos a través del <code>viewport</code> y el <code>viewBox</code>.</p>
<p>El <code>viewport</code> es un marco de ventana en un canvas infinito. Sus dimensiones se definen por atributos <code>width</code> y <code>heigh</code>, o en CSS con las propiedades de <code>width</code> y <code>heigh</code> correspondientes. Podemos especificar cualquier unidad de longitud que queramos, pero si proporcionamos números sin unidades, por defecto serán equivalentes a píxeles.</p>
<p>El <code>viewBox</code> está definido por cuatro valores. Los dos primeros son el punto de partida en la esquina superior izquierda (valores <code>x</code> e <code>y</code>, se permiten números negativos). Edito estos valores para reencuadrar la imagen. Los dos últimos son el ancho y la altura del sistema de coordenadas dentro de la ventana gráfica — aquí es donde podemos editar la escala de la cuadrícula (que abordaremos en la sección sobre Zoom).</p>
<p>Acá hay un ejemplo simplificado que muestra el <code>viewBox</code> SVG y los atributos de width y height establecidos en <code>&lt;svg></code> :</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 700 700<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token comment">&lt;!-- etc. --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<h3 id="reencuandre"><a href="#reencuandre" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Reencuandre</h3>
<p>Así que esto:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 700 700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>…equivale a esto:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>comienzo-eje-x comienzo-eje-y ancho alto<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>El <code>viewport</code> (o ventana) que vemos comienza donde se encuentran 0 en el eje <code>x</code> y 0 en el eje <code>y</code>.</p>
<p>Cambiando esto:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 700 700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>…a esto:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300 200 700 700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>…el ancho y la altura siguen siendo los mismos (700 unidades cada uno), pero el inicio del sistema de coordenadas ahora está en el punto 300 en el eje <code>x</code> y 200 en el eje <code>y</code>.</p>
<p>En el siguiente video, agrego un <code>&lt;circle></code> rojo al SVG con su centro en el punto 300 en el eje <code>x</code> y 200 en el eje <code>y</code>. Se puede observar cómo al cambiar las coordenadas de <code>viewBox</code> a los mismos valores, también cambia la ubicación del círculo en la esquina superior izquierda del marco, mientras que el tamaño representado del SVG sigue siendo el mismo (700 × 700). Todo lo que hice fue “reencuadrar” los elementos con <code>viewBox</code>.</p>
<figure>
    <img src="/blog/blog-6fails-04.gif" alt="">
</figure>
<h3 id="zoom"><a href="#zoom" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Zoom</h3>
<p>Podemos cambiar los dos últimos valores dentro de <code>viewBox</code> para acercar o alejar la imagen. Cuanto mayores sean los valores, más unidades SVG se agregan para que quepan en el <code>viewport</code>, lo que da como resultado una imagen más pequeña. Si queremos mantener una proporción de 1: 1, el ancho y la altura de nuestro <code>viewBox</code> deben coincidir con los valores de ancho y alto de nuestro viewport.</p>
<p>Veamos qué sucede en Illustrator cuando cambiamos estos parámetros. El artwork es igual al <code>viewport</code> que está representada por un cuadrado blanco de 700px. Todo lo demás fuera de esa área es nuestro canvas SVG infinito y queda recortada por default.</p>
<p>La Figura 1 a continuación muestra un punto azul en 900 en eleje <code>x</code> y 900 en el eje <code>y</code>. Si cambio los dos últimos valores de <code>viewBox</code> de 700 a 900 así:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300 200 900 900<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>… entonces el punto azul vuelve a estar casi completamente a la vista, como se ve en la Figura 2 a continuación. Nuestra imagen se redujo porque aumentamos los valores de <code>viewBox</code>, pero las dimensiones reales de ancho y alto del SVG se mantuvieron iguales, y el punto azul volvió a acercarse al área sin recortar.</p>
<figure>
    <img src="/blog/blog-6fails-05.png" alt="">
	<figcaption>Figure 1.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-6fails-06.png" alt="">
	<figcaption>Figure 2.</figcaption>
</figure>
<p>Hay un cuadrado rosa como evidencia de cómo la cuadrícula se escala para ajustarse a la ventana gráfica: la unidad se vuelve más pequeña y más líneas de cuadrícula encajan en la misma área del <code>viewport</code>. Dejo un Pen acá abajo para jugar con los mismos valores y ver ese trabajo en acción:</p>
<iframe height="300" scrolling="no" title="cat viewbox" src="https://codepen.io/marianab/embed/bGKyprL?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/bGKyprL">
  cat viewbox&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="2-width-y-height-ausentes"><a href="#2-width-y-height-ausentes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>2. Width y height ausentes</h2>
<p>Otra cosa común que miro al depurar SVG en línea es si el archivo contiene los atributos de ancho o alto. Esto no es gran cosa en muchos casos, a menos que el SVG esté dentro de un contenedor con position absolute o un contenedor flex (ya que Safari calcula el valor de ancho de SVG con <code>0px</code> en lugar de <code>auto</code>). Excluir el width o el height en estos casos nos impide ver la imagen completa, como podemos ver al abrir esta demostración de CodePen y compararla en Chrome, Safari y Firefox.</p>
<figure>
    <img src="/blog/blog-6fails-07.png" alt="">
	<figcaption>Chrome, Safari and Firefox.</figcaption>
</figure>
<p>¿La solución? Agregar un <code>width</code> o <code>height</code>, ya sea como un atributo de presentación, inline en el atributo de estilo o en CSS. Evitar usar <code>height</code> sólo, especialmente cuando está configurado al <code>100%</code> o en <code>auto</code>. Otra solución es <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/position" rel="nofollow noopener noreferrer" target="_blank">declarar los valores <code>right</code> y <code>left</code></a>.
Se puede jugar con <a href="https://codepen.io/marianab/pen/WNyBxYN" rel="nofollow noopener noreferrer" target="_blank">el siguiente Pen</a> y combinar las diferentes opciones.</p>
<iframe height="300" scrolling="no" title="SVG inside position absolute or flex" src="https://codepen.io/marianab/embed/WNyBxYN?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/WNyBxYN">
  SVG inside position absolute or flex&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="3-colores-de-fill-and-stroke-involuntarios"><a href="#3-colores-de-fill-and-stroke-involuntarios" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>3. Colores de fill and stroke involuntarios</h2>
<p>También puede ser que estemos aplicando color a la etiqueta <code>&lt;svg></code>, ya sea un estilo inline o proveniente de CSS. Eso está bien, pero podría haber otros valores de color a lo largo del código interno o estilos que entren en conflicto con el conjunto de colores en el <code>&lt;svg></code>, causando que las partes sean invisibles.</p>
<p>Es por eso que tiendo a buscar los atributos de <code>fill</code> y <code>stroke</code> en el código del SVG y los elimino. El siguiente video muestra un SVG que tiene estilos en CSS con un <code>fill</code> rojo. Hay un par de instancias en la que partes del SVG se pintan de blanco directamente en el código; las eliminé para revelar las piezas que faltan.</p>
<figure>
    <img src="/blog/blog-6fails-08.gif" alt="">
</figure>
<h2 id="4-ids-faltantes"><a href="#4-ids-faltantes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>4. IDs faltantes</h2>
<p>Este puede parecer súper obvio, pero es sorprendente la frecuencia con la que lo veo surgir. Digamos que creamos un archivo SVG en Illustrator y fuimos muy diligentes en nombrar nuestras capas para que obtengan IDs en el código al exportar el archivo. Y digamos que planeamos estilear ese SVG en CSS conectando con estos IDs.</p>
<p>Esa es una buena manera de hacer las cosas. Pero hay muchas ocasiones en las que he visto el mismo archivo SVG exportado por segunda vez a la misma ubicación y los IDs son diferentes, generalmente al copiar/pegar los vectores directamente. Tal vez se agregó una nueva capa, o se cambió el nombre de una de las existentes o algo así. Cualquiera que sea el caso, las reglas de CSS ya no coinciden con los IDs del código SVG, lo que hace que el SVG se presente de manera diferente a lo esperado.</p>
<figure>
    <img src="/blog/blog-6fails-09.png" alt="">
	<figcaption>Pegando el archivo de Illustrator exportado a SVG en SVGOMG.</figcaption>
</figure>
<p>En archivos SVG de gran tamaño, puede que nos resulte difícil encontrar esos IDs. Este es un buen momento para abrir DevTools, inspeccionar la parte del gráfico que no funciona y ver si esos IDs aún coinciden o cambiaron su nombre con alguna versión <code>_1_</code> por ejemplo.</p>
<h2 id="5-checklist-para-clipping-y-masking"><a href="#5-checklist-para-clipping-y-masking" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>5. Checklist para clipping y masking</h2>
<p>Si encuentro un SVG recortado inesperadamente pero el <code>viewBox</code> funciona bien, normalmente busco en el CSS las propiedades de <code>clip-path</code> o <code>mask</code> que podrían interferir con la imagen. Es tentador seguir mirando el código inline, pero es bueno recordar que el estilo de un SVG podría estar ocurriendo en otro lugar.</p>
<p>El recorte y el enmascaramiento de CSS nos permiten “ocultar” partes de una imagen o elemento. En SVG, <code>&lt;clipPath></code> es una operación vectorial que corta partes de una imagen sin resultados intermedios. La etiqueta <code>&lt;mask></code> es una operación de píxeles que permite transparencia, efectos de semitransparencia y bordes borrosos.</p>
<p>Esta es una pequeña checklist para depurar casos en los que están involucrados el <code>clip-path</code> y/o <code>mask</code>:</p>
<ul>
<li>Asegurarse de que el clipping path (o mask) y el gráfico se superpongan entre sí. Las partes superpuestas son las que se muestran.</li>
<li>Si hay un <code>path</code> complejo que no se cruza con nuestro gráfico, internar aplicar transformaciones hasta que coincidan.</li>
<li>Todavía se puede inspeccionar el código interno con DevTools aunque <code>&lt;clipPath></code> o <code>&lt;mask></code> no se renderizen, podemos ver su caja.</li>
<li>Copiar el código dentro del <code>&lt;clipPath></code> o <code>&lt;mask></code> y pegarlo antes de cerrar la etiqueta <code>&lt;/svg></code>. Luego agregar un <code>fill</code> a esas formas y verificar las coordenadas y dimensiones del SVG. Si aún no se ve la imagen, intentar agregar <code>overflow="visible"</code> a la etiqueta <code>&lt;svg></code>.</li>
<li>Verificar que se use un ID único para <code>&lt;clipPath></code> o <code>&lt;mask></code>, y que el mismo ID se aplique a las formas o grupo de formas que están recortadas o enmascaradas. Un ID que no coincida romperá la apariencia.</li>
<li>Comprobar si hay errores tipográficos en el código entre las etiquetas <code>&lt;clipPath></code> o <code>&lt;mask></code>.</li>
<li><code>fill</code>, <code>stroke</code>, <code>opacity</code> o algunos otros estilos aplicados a elementos dentro de <code>&lt;clipPath></code> son inútiles — la única parte útil es la geometría de la región de relleno de esos elementos. Es por eso que si usamos un <code>&lt;polyline></code> se comportará como un <code>&lt;polygon></code> y si usamos una <code>&lt;line></code> no se verá ningún efecto de recorte.</li>
<li>Si no se ve la imagen después de aplicar una <code>&lt;mask></code>, hay que asegurarse de que el relleno del contenido de la máscara no sea completamente negro. La luminancia del elemento de la máscara determina la opacidad del gráfico final. Podremos ver a través de las partes más brillantes y las partes más oscuras ocultarán el contenido de la imagen.</li>
</ul>
<p><a href="https://codepen.io/marianab/pen/mdjdGZj" rel="nofollow noopener noreferrer" target="_blank">En este Pen</a> se puede jugar con elementos enmascarados y recortados.</p>
<h2 id="6-namespaces"><a href="#6-namespaces" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>6. Namespaces</h2>
<p>¿Sabías que SVG es un lenguaje de markup basado en XML? ¡Bueno, lo es! El <code>namespace</code> para SVG se establece en el atributo xmlns:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token comment">&lt;!-- etc. --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Hay mucho que saber sobre los namespaces en XML y MDN tiene una gran introducción al respecto. Basta con decir que el namespace proporciona contexto al navegador, informándole que el marcado es específico de SVG. La idea es que los namespaces ayuden a evitar conflictos cuando hay más de un tipo de XML en el mismo archivo, como SVG y XHTML. Este es un problema mucho menos común en los navegadores modernos, pero podría ayudar a explicar los problemas de renderizado de un SVG en navegadores más antiguos o navegadores como Gecko que son estrictos al definir tipos de documentos y namespaces.</p>
<p>La especificación <code>SVG 2</code> no requiere namespaces cuando se utiliza la sintaxis <code>HTML</code>. Pero es crucial si la compatibilidad con los navegadores anteriores es una prioridad, en esos casos no está de más agregarlo. De esa forma, cuando se define el atributo <code>xmlns</code> del elemento <code>&lt;html></code>, no entrará en conflicto en esos casos excepcionales.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/1999/xhtml<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700px<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>700px<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token comment">&lt;!-- etc. --></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Esto también es cierto cuando se usa SVG inline en CSS, como cuando lo usamos de <code>background-image</code>. En el siguiente ejemplo, aparece un icono de checkmark en el input después de una validación exitosa. Así es como se ve el CSS:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">textarea<span class="token pseudo-class">:valid</span></span> <span class="token punctuation">{</span>
 <span class="token property">background</span><span class="token punctuation">:</span> <span class="token color">white</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'data:image/svg+xml,\
    &lt;svg xmlns="http://www.w3.org/2000/svg" width="26" height="26">\
    &lt;circle cx="13" cy="13" r="13" fill="%23abedd8"/>\
    &lt;path fill="none" stroke="white" stroke-width="2" d="M5 15.2l5 5 10-12"/>\
    &lt;/svg>'</span><span class="token punctuation">)</span></span> no-repeat <span class="token number">98</span><span class="token unit">%</span> <span class="token number">5</span><span class="token unit">px</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div>
<p>Cuando eliminamos el namespace dentro del SVG en la propiedad de <code>background</code>, la imagen desaparece:</p>
<figure>
    <img src="/blog/blog-6fails-10.gif" alt="">
</figure>
<p>Otro prefijo de namespace común es <code>xlink:href</code>. Lo usamos mucho cuando hacemos referencia a otras partes del SVG como: patterns, filtros, animaciones o gradientes. La recomendación es comenzar a reemplazarlo con <code>href</code> ya que el otro está en desuso desde <code>SVG 2</code>, pero puede haber problemas de compatibilidad con navegadores más antiguos. En ese caso, podemos usar ambos. Solo hay que recordar incluir el namespace <code>xmlns:xlink=”http://www.w3.org/1999/xlink"</code> si todavía vamos a usar <code>xlink:href</code>.</p>
<h2 id="seguir-aprendiendo-svg"><a href="#seguir-aprendiendo-svg" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¡Seguir aprendiendo SVG!</h2>
<p>Espero que estos consejos te ayuden a ahorrar mucho tiempo si te encuentras con problemas de renderizado de SVG inline. Estas son algunas de las cosas que busco. Tal vez tengas otras diferentes — si es así, ¡dímelo en los comentarios!</p>
<p>La conclusión es que vale la pena tener al menos una comprensión básica de <a href="(https://css-tricks.com/using-svg/)">las diversas formas en que se puede usar SVG</a>. <a href="https://codepen.io/challenges" rel="nofollow noopener noreferrer" target="_blank">CodePen Challenges</a> a menudo incorpora SVG y ofrece buenas prácticas. Aquí hay algunos recursos más para subir de nivel:</p>
<ul>
<li>
<p><a href="https://www.oreilly.com/library/view/using-svg-with/9781491921968/" rel="nofollow noopener noreferrer" target="_blank">Using SVG with CSS3 and HTML5</a> (Amelia Bellamy-Royds, Kurt Cagle, Dudley Storey) —Este es para mí la Biblia SVG.</p>
</li>
<li>
<p>Lea Verou tiene un gran conocimiento de SVG y<a href="(https://lea.verou.me/speaking/)"> ha hablado bastante sobre el tema</a> (como <a href="(https://www.youtube.com/watch?v=6qSN50Qk_54&ab_channel=FrontendUnited)">este video</a> de Frontend United 2019).</p>
</li>
<li>
<p><a href="https://www.oreilly.com/library/view/svg-animations/9781491939697/" rel="nofollow noopener noreferrer" target="_blank">SVG Animations</a> (Sarah Drasner)</p>
</li>
<li>
<p><a href="https://www.oreilly.com/library/view/svg-essentials-2nd/9781491945308/" rel="nofollow noopener noreferrer" target="_blank">SVG Essentials</a> (Amelia Bellamy-Royds, J. David Eisenberg)</p>
</li>
<li>
<p><a href="https://abookapart.com/products/practical-svg" rel="nofollow noopener noreferrer" target="_blank">Practical SVG</a> (Chris Coyier)</p>
</li>
</ul>
<p>Hay otras personas más que sugiero seguir por la cantidad de conocimiento e información que comparten relacionada con SVG:</p>
<ul>
<li>
<p><a href="https://www.sarasoueidan.com/" rel="nofollow noopener noreferrer" target="_blank">Sara Soueidan</a></p>
</li>
<li>
<p><a href="https://www.snorkl.tv/" rel="nofollow noopener noreferrer" target="_blank">Carl Schoof</a></p>
</li>
<li>
<p><a href="https://www.cassie.codes/" rel="nofollow noopener noreferrer" target="_blank">Cassie Evans</a></p>
</li>
<li>
<p><a href="https://valhead.com/" rel="nofollow noopener noreferrer" target="_blank">Val Head</a></p>
</li>
<li>
<p><a href="https://codepen.io/thebabydino" rel="nofollow noopener noreferrer" target="_blank">Ana Tudor</a></p>
</li>
</ul>
<blockquote>
<p>Este artículo se publicó por primera vez en <a href="https://css-tricks.com/6-common-svg-fails-and-how-to-fix-them/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a>. Gracias a las ediciones de <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/6-common-SVG-fails" data-v-5e4666ba>
      ←
      6 common SVG fails and how to fix them
    </a></div> <div data-v-5e4666ba><a href="/posts/2024-12-11-An-Introduction-To-CSS-Scroll-Driven-Animations" data-v-5e4666ba>
      An Introduction To CSS Scroll-Driven Animations
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/6-fallas-comunes-en-SVG/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[8 trucos para optimizar SVG]]></title>
            <link>https://holasvg.com/posts/8-trucos-para-optimizar-SVG</link>
            <guid>https://holasvg.com/posts/8-trucos-para-optimizar-SVG</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>8 trucos para optimizar SVG</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://uxdesign.cc/8-tricks-for-svg-optimization-c2c519c10c1e"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/8-trucos-para-optimizar-SVG/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/8-trucos-para-optimizar-SVG/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">23 August 2022</span> <h1>8 trucos para optimizar SVG</h1> <p class="inner-post-subtitle"></p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/optimization?type=posts" class="card-category"><span>#optimization</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-8ways-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Muchas herramientas online nos ayudan a optimizar archivos SVG antes de incluir el código en nuestros proyectos. Pero, ¿qué pasa si te digo que la forma en que dibujamos cada elemento tiene un impacto en el código exportado? Comprender el código generado por el programa que usemos para dibujar, nos ayudará a tener más control sobre él. Aquí hay algunos trucos que pueden ahorrarnos tiempo a la hora de manipular código SVG en nuestros proyectos.</p>
<p>Los ejemplos están en Illustrator, pero también cubriré formas de mejorar el código de <a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noopener noreferrer" target="_blank">SVGOMG</a>, y espero que la mayoría de estos ejemplos apliquen a cualquier software que estés usando para crear gráficos que luego serán parte de una web o app. Algunos de estos consejos pueden sonar demasiado extremos, pero si estás en un proyecto en el que cada bit cuenta, pueden serte útiles.</p>
<h3 id="1-comenzar-en-pequeño"><a href="#1-comenzar-en-peque%C3%B1o" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>1. Comenzar en pequeño</h3>
<p>Alg simple que podemos hacer es diseñar pequeño. Como su nombre lo indica, SVG escala infinitamente sin perder calidad, y esta es una de sus principales ventajas. A veces nos olvidamos del tamaño del lienzo mientras creamos, o diseñamos en pantallas grandes con cosas que deben estar a escala. Antes de exportar, puede ser útil escalar el diseño y minimizarlo a un tamaño razonable. De esta manera, reduciremos muchos números en coordenadas que usan más de 1 o 2 dígitos. Por supuesto, cuanto más grande es el archivo, mayor es el impacto.</p>
<h3 id="2-evitar-números-mágicos"><a href="#2-evitar-n%C3%BAmeros-m%C3%A1gicos" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>2. Evitar números "mágicos"</h3>
<p>Siguiendo con el punto anterior, después de mover nuestro diseño, escalarlo y contraerlo, podríamos terminar con muchos números decimales al exportar los resultados (especialmente en el atributo de trazo o stroke). Si queremos evitarlo, existe un checkbox que se puede deseleccionar para evitar que nuestro trazo y efectos se escalen al manipularlos.</p>
<figure>
    <img src="/blog/blog-8ways-02.png" alt="">
	<figcaption>Caja de trazos y efectos de escala en Illustrator.</figcaption>
</figure>
<ul>
<li><strong>En Illustrator,</strong> es posible elegir cuántos decimales del 0 al 5 tendrán los vectores después de elegir la opción <em>'Exportar como'</em>:</li>
</ul>
<figure>
    <img src="/blog/blog-8ways-03.png" alt="">
	<figcaption>Cuadro de opciones "Exportar como" en Illustrator.</figcaption>
</figure>
<ul>
<li><strong>En SVGOMG,</strong> hay una opción que es muy útil: '<em>Redondear/reescribir números</em>'. Mirá el <code>stroke-width</code> en el siguiente ejemplo. Al final, estoy editando la Precisión para reducir un decimal más al trazo; amplío esto en la próxima sección.</li>
</ul>
<figure>
    <img src="/blog/blog-8ways-04.gif" alt="">
	<figcaption>Redondeo de números en SVGOMG.</figcaption>
</figure>
<h3 id="3-simplificar-paths"><a href="#3-simplificar-paths" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>3. Simplificar paths</h3>
<p>Cada punto cuenta. Al reducir los nodos de nuestra ilustración, estamos reduciendo el tamaño del archivo al generar menos código SVG. Estas son dos maneras diferentes de hacer esto:</p>
<ul>
<li><strong>En Illustrator</strong>, seleccionamos el path que queremos editar, luego en el menú, hacemos clic en '<em>Objeto> Path> Simplificar'</em></li>
</ul>
<figure>
    <img src="/blog/blog-8ways-05.gif" alt="">
	<figcaption>Acá se ve cómo pasa de 1549 a 545 puntos y el gráfico se ve igual.</figcaption>
</figure>
<ul>
<li><strong>En SVGOMG</strong>, después de pegar el código, aparecerá una barra lateral a la derecha con un slider bajo el nombre "<em>Precisión</em>" que podemos mover para ver cuántos nodos queremos mantener mientras observamos los cambios en el gráfico.</li>
</ul>
<figure>
    <img src="/blog/blog-8ways-06.gif" alt="">
	<figcaption>Con la optimización aplicada, ahora es casi la mitad del tamaño.</figcaption>
</figure>
<p>A veces ni siquiera notamos la diferencia. Otras veces, esto no es una opción: desafortunadamente, no encontré forma de reducir los nodos de una manera que se ajuste perfectamente como, por ejemplo, en un mapa político donde necesitamos que los límites coincidan perfectamente.</p>
<figure>
    <img src="/blog/blog-8ways-07.jpg" alt="">
	<figcaption>A la derecha, el fondo verde es visible en algunas partes del mapa.</figcaption>
</figure>
<h3 id="4-extra-interletrado-en-textosvg"><a href="#4-extra-interletrado-en-textosvg" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>4. Extra interletrado en texto SVG</h3>
<p>Cuando se usa texto en SVG, el código exportado incluye toneladas de <code>&lt;tspan></code> con <code>letter-spacing</code> entre las letras. Lo cual es muy molesto cuando queremos editar esos textos en el código. Solía quitarlos a mano. Eso fue hasta que descubrí que la configuración predeterminada para el interletraje entre caracteres es '<em>Auto</em>' (que es la solución de Illustrator para ajustar visualmente algunos pares de letras), y para revertirlo a su espaciado original, debemos seleccionar '* 0*'. Esto evitará esos 'tspans' adicionales con espaciado de letras y simplificará mucho nuestro código.</p>
<ul>
<li><strong>Con interletrado automático:</strong></li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>text</span> <span class="token attr-name">font-family</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Arial<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">letter-spacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-.01em<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>L<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5.5<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>o<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>12.08<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">letter-spacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-.01em<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>r<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tspan</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>15.89<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>em ipsum<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tspan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>text</span><span class="token punctuation">></span></span>
</code></pre></div>
<ul>
<li><strong>Con interletrado 0:</strong></li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>text</span> <span class="token attr-name">font-family</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Arial<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Lorem ipsum<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>text</span><span class="token punctuation">></span></span>
</code></pre></div>
<h3 id="5-fusionarexpandir-formas"><a href="#5-fusionarexpandir-formas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>5. Fusionar/expandir formas</h3>
<p>Digamos que tenemos muchas formas una encima de la otra, creando una figura compleja: cuando exportemos este dibujo, cada forma tendrá su código y todas las formas permanecerán independientes. Pero reduciríamos una buena cantidad de código si fusionamos las formas que comparten los mismos atributos para convertirlas en una sola. Para hacer eso en Illustrator con las figuras seleccionadas, vamos al panel de Pathfinder y hacemos clic en la primera opción '<em>Unir</em>'.</p>
<figure>
    <img src="/blog/blog-8ways-08.gif" alt="">
	<figcaption>Unir formas en Illustrator.</figcaption>
</figure>
<p>Si algunas de esas formas son paths y están uno encima del otro, tenemos la opción '<em>Merge paths'</em> en SVGOMG que los combinará en uno solo. Para formas básicas, necesitaremos marcar la opción '<em>Shapes to (smaller) path</em>'. Esto no funciona exactamente como esperaba, fusiona algunas formas y otras no, y me pregunto si esto tiene que ser con la posición de los elementos:</p>
<figure>
    <img src="/blog/blog-8ways-09.gif" alt="">
	<figcaption>Fusión de paths en SVGOMG.</figcaption>
</figure>
<h3 id="6-radius-enrects"><a href="#6-radius-enrects" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>6. Radius en rects</h3>
<p>Cuando añadimos esquinas a un <code>&lt;rect></code>, Illustrator convierte el <code>&lt;rect></code> en un <code>&lt;path></code>. Incluso si el radio es lo suficientemente grande como para convertir el cuadrado en un círculo, siempre devolverá un path en el código. Pero hay muchos casos en los que queremos mantener las formas básicas como están. En el caso del círculo, la única solución será dibujarlo con la herramienta ellipse, pero en cualquier otro caso podemos usar la herramienta rectángulo, y en lugar de redondear las esquinas en Illustrator podemos agregar los atributos <code>rx</code> y /o <code>ry</code> al código más tarde. Eso también nos ahorrará algunos bytes.</p>
<ul>
<li><strong>En Illustrator,</strong> con esquinas redondeadas:</li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M60 100H40C17.9 100 0 82.1 0 60V40C0 17.9 17.9 0 40 0h20c22.1 0 40 17.9 40 40v20c0 22.1-17.9 40-40 40z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<ul>
<li><strong>En el código,</strong> esquinas redondeadas con <code>rx</code>:</li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">rx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<h3 id="7-rotación-de-rects"><a href="#7-rotaci%C3%B3n-de-rects" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>7. Rotación de rects</h3>
<p>Cómo dibujamos en Illustrator determina muchas cosas. Si estoy dibujando un <code>rect</code> de 10 unidades de ancho y 50 unidades de alto, y luego decido rotarlo 90 grados, la forma se exportará con una transformación de rotación adentro y <strong>con los atributos intercambiados</strong>:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(90 25 5)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<p>El primer número en la transformación representa el ángulo (90 porque lo giré en el sentido de las agujas del reloj) pero debería ser -90 si lo hubiera hecho en el sentido contrario a las agujas del reloj. Los otros dos números establecen las coordenadas del <code>transform-origin</code> en el centro del rectángulo.</p>
<p>La única forma que encontré para restablecer esto es cambiando las transformaciones y el ancho/alto en Illustrator, que es mejor que hacerlo directamente en el código, donde las posiciones <code>x</code> e <code>y</code> también podrían haber cambiado.</p>
<blockquote>
<p>Esto no ocurre solo con uno o pocos rects, sino con los rects que pertenecen a una composición que se rota más adelante en el proceso.</p>
</blockquote>
<h3 id="8-dirección-de-las-formas"><a href="#8-direcci%C3%B3n-de-las-formas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>8. Dirección de las formas</h3>
<p>Digamos que mantuve la rotación de transformación <code>transform="rotate(90 25 5)"</code> del ejemplo anterior. Cada vez que cambio el ancho de la barra, crecerá de derecha a izquierda; como estaba construyendo un gráfico de barras, necesitaba que crecieran de manera opuesta. Aquí hay algunas opciones para cambiar esto:</p>
<ul>
<li><strong>En Illustrator,</strong> rota la forma en una dirección diferente (en sentido contrario a las agujas del reloj)</li>
<li><strong>En el código,</strong> cambia la rotación de 90 a -90</li>
<li><strong>En Illustrator,</strong> invertir la dirección de la ruta <em>Objeto > Path > Invertir dirección del path</em></li>
</ul>
<h3 id="bonus-track"><a href="#bonus-track" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Bonus track</h3>
<ul>
<li>El elemento <code>&lt;use></code> es algo a tener en cuenta para los casos en los que se repite una parte del gráfico; aquí <a href="https://css-tricks.com/going-beyond-automatic-svg-compression-with-the-use-element/" rel="nofollow noopener noreferrer" target="_blank">hay un artículo</a> con un ejemplo de cómo este elemento puede ahorrarnos muchas líneas de código .</li>
<li>El atributo <code>stroke-miterlimit="10"</code> por defecto aparece muchas veces en las rutas exportadas de Illustrator donde no está haciendo nada ya que el <code>stroke-linejoin</code> es redondo. <a href="https://css-tricks.com/mastering-svgs-stroke-miterlimit-attribute/" rel="nofollow noopener noreferrer" target="_blank">Aquí hay un artículo completo</a> sobre este atributo.</li>
<li>Muchos otros artículos van más allá sobre la optimización del código SVG, como <a href="https://css-tricks.com/optimizing-svg-patterns/" rel="nofollow noopener noreferrer" target="_blank">este</a> de <a href="https://twitter.com/finnhvman" rel="nofollow noopener noreferrer" target="_blank">Bence Szabó</a> que profundiza en la optimización manual de un patrón mientras aprende muchas cosas sobre la sintaxis SVG.</li>
</ul>
<p>Siento que hay tantos consejos y trucos para explorar. ¿Tenes alguno para compartir?</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/8-tricks-for-SVG-optimization" data-v-5e4666ba>
      ←
      8 tricks for SVG optimization
    </a></div> <div data-v-5e4666ba><a href="/posts/6-common-SVG-fails" data-v-5e4666ba>
      6 common SVG fails and how to fix them
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/8-trucos-para-optimizar-SVG/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Add a Double Border to SVG Shapes]]></title>
            <link>https://holasvg.com/posts/add-double-border-to-SVG</link>
            <guid>https://holasvg.com/posts/add-double-border-to-SVG</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>How to Add a Double Border to SVG Shapes</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/how-to-add-a-double-border-to-svg-shapes/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/add-double-border-to-SVG/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/add-double-border-to-SVG/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 April 2021</span> <h1>How to Add a Double Border to SVG Shapes</h1> <p class="inner-post-subtitle">Exploring 7 different ways with CSS and SVG syntax.</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-double-border-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Let’s say someone asks you to add a double border to some random geometric SVG shapes. For some reason, you can’t use any graphic editor — they need to be generated at runtime — so you have to solve it with CSS or within the SVG syntax.</p>
<p>Your first question might be: Is there anything like stroke-style: double in SVG? Well, the answer is not yet and it’s not that easy. But I’ll attempt it anyway to see what methods I can uncover. I’ll explore the possibilities of three different basic shapes: circle, rectangle, and polygon. Pointing the ones that can keep a transparent color in the middle of the two lines.</p>
<blockquote>
<p><strong>Spoiler alert:</strong> all the results have their downsides, at least with CSS and SVG, but let me walk you through my intents.</p>
</blockquote>
<h2 id="the-simple-solutions"><a href="#the-simple-solutions" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The simple solutions</h2>
<p>These don’t work with all shapes, but they are the easiest of the solutions.</p>
<h3 id="outline-and-box-shadow"><a href="#outline-and-box-shadow" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><code>outline</code> and <code>box-shadow</code></h3>
<p>The CSS properties <code>outline</code> and <code>box-shadow</code> only apply to the bounding box of the shape or SVG, and so both are great solutions <strong>only for squares and rectangles</strong>. They also allow flexible colors using custom properties.</p>
<p>It only takes two lines of CSS with <code>outline</code>, plus it keeps the background color visible through the shape.</p>
<ul>
<li>🙁 Solution only for one shape.</li>
<li>✅ Simple code</li>
<li>✅ Borders are smooth</li>
<li>✅ Transparent background</li>
</ul>
<p><code>box-shadow</code> only needs one line of CSS, but we have to <strong>make sure that each shape has its own SVG</strong> as we can’t apply <code>box-shadow</code> directly to the shapes. Another thing to consider is that we have to apply the color of the background in the declaration.</p>
<ul>
<li>🙁 Solution only for one shape</li>
<li>✅ Simple code</li>
<li>✅ Borders are smooth</li>
<li>🙁 No transparent background</li>
</ul>
<iframe height="500" scrolling="no" title="SVG double border with CSS" src="https://codepen.io/marianab/embed/LYxLJJr?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/LYxLJJr">
  SVG double border with CSS&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="svg-gradients"><a href="#svg-gradients" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>SVG gradients</h3>
<p>SVG radial gradients only work on circles ☺️. We can directly apply the gradient on the stroke, but it’s better to use variables as we have to declare the colors many times in the code.</p>
<ul>
<li>🙁 Solution only for one shape</li>
<li>✅ Simple code</li>
<li>🙁 Borders are smooth</li>
<li>🙁 No transparent background</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border with SVG gradients" src="https://codepen.io/marianab/embed/bGgRzNE?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/bGgRzNE">
  SVG double border with SVG gradients&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="solutions-for-all-shapes"><a href="#solutions-for-all-shapes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Solutions for all shapes</h2>
<p>These will work with all shapes, but the code could become bloated or complex.</p>
<h3 id="filter-drop-shadow"><a href="#filter-drop-shadow" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><code>filter: drop-shadow()</code></h3>
<p>Finally, one solution for all shapes! We must have each shape in its own <code>&lt;svg></code> since the <code>filter</code> won’t apply directly to the shapes. We are using one declaration in CSS and have flexible colors using variables. The downside? The borders don’t look very smooth.</p>
<ul>
<li>✅ One solution for all shapes</li>
<li>✅ Simple code</li>
<li>🙁 Borders look pixelated</li>
<li>🙁 No transparent background</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double stroke with CSS filters" src="https://codepen.io/marianab/embed/eYgRxrK?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/eYgRxrK">
  SVG double stroke with CSS filters&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="svg-filters"><a href="#svg-filters" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>SVG filters</h3>
<p>This is a very flexible solution. We can create a filter and add it to the shapes through SVG’s <code>filter</code> attribute. The complicated part here is the filter itself. We’ll need three paintings, one for the outside border, one for the background flood, and the last one to paint the shape on the front. The result looks better than using <code>drop-shadow</code>, but the borders are still pixelated.</p>
<ul>
<li>✅ One solution for all shapes</li>
<li>🙁 Complex code</li>
<li>🙁 Borders look pixelated</li>
<li>🙁 No transparent background</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border with SVG filters" src="https://codepen.io/marianab/embed/vYgZPBG?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/vYgZPBG">
  SVG double border with SVG filters&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="reusing-shapes"><a href="#reusing-shapes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Reusing shapes</h3>
<p>There are a couple of possible options here.</p>
<h4 id="option-1-transforms"><a href="#option-1-transforms" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Option 1: Transforms</h4>
<p>This solution requires transforms. We place one figure over the other, where the main figure has a fill color and a stroke color, and the other figure has no fill, a red stroke, and is scaled and repositioned to the center. We defined our shapes on the &lt;<code>defs></code>. The trick is to <strong>translate half of the <code>viewBox</code> to the negative space</strong> so that, when we scale them, we can do it from the center of the figure.</p>
<ul>
<li>✅ One solution for all shapes</li>
<li>🙁 Duplicated code</li>
<li>✅ Borders are smooth</li>
<li>✅ Transparent background</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border - use and translate" src="https://codepen.io/marianab/embed/poRwYPQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/poRwYPQ">
  SVG double border - use and translate&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h4 id="option-2-use"><a href="#option-2-use" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Option 2: <code>&lt;use></code></h4>
<p>I found a <a href="http://schepers.cc/svg/double-stroke2.svg" rel="nofollow noopener noreferrer" target="_blank">clever solution</a> in the <a href="https://lists.w3.org/Archives/Public/www-svg/2013Jan/0005.html" rel="nofollow noopener noreferrer" target="_blank">www-svg mailing list</a> by Doug Schepers that uses SVG <code>&lt;use></code>. Again, it requires defining the shapes once and referring to them twice using <code>&lt;use></code>. This time the main shape has a bigger stroke. The second shape has half the stroke of the main shape, no fill, and a stroke matching the background color.</p>
<ul>
<li>✅ One solution for all shapes</li>
<li>🙁 Duplicated code</li>
<li>✅ Borders are smooth</li>
<li>🙁 No transparent background</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border - use and translate" src="https://codepen.io/marianab/embed/poRwYPQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/poRwYPQ">
  SVG double border - use and translate&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="here-are-the-full-results"><a href="#here-are-the-full-results" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Here are the full results!</h2>
<p>Just so you have them all in one place. Let me know if you can think of other possible solutions!</p>
<figure>
<table class="table-simple"><thead><tr><th>Solution</th><th>All shapes</th><th>Simple code</th><th>Smooth borders</th><th>Transparent background</th></tr></thead><tbody><tr><td><code><strong><a href="https://codepen.io/marianab/pen/LYxLJJr">outline</a></strong></code></td><td>🙁</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td><code><strong><a href="https://codepen.io/marianab/pen/LYxLJJr">box-shadow</a></strong></code></td><td>🙁</td><td>✅</td><td>✅</td><td>🙁</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/bGgRzNE">SVG gradients</a></strong></td><td>🙁</td><td>✅</td><td>🙁</td><td>🙁</td></tr><tr><td><code><strong><a href="https://codepen.io/marianab/pen/eYgRxrK">filter: drop-shadow()</a></strong></code></td><td>✅</td><td>✅</td><td>🙁</td><td>🙁</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/vYgZPBG">SVG filters</a></strong></td><td>✅</td><td>🙁</td><td>🙁</td><td>🙁</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/poRwYPQ">Reusing shapes:<br>Tranforms</a></strong></td><td>✅</td><td>🙁</td><td>✅</td><td>✅</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/JjEJzBK">Reusing shapes:<br><code>&lt;use></code></a></strong></td><td>✅</td><td>🙁</td><td>✅</td><td>🙁</td></tr></tbody></table></figure>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/how-to-add-a-double-border-to-svg-shapes/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> with edits from <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> and <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/como-simplificar-c%C3%B3digo-SVG-usando-formas-basicas" data-v-5e4666ba>
      ←
      Cómo simplificar código SVG usando formas básicas
    </a></div> <div data-v-5e4666ba><a href="/posts/agregar-doble-borde-a-formas-SVG" data-v-5e4666ba>
      Agregar doble borde a formas SVG
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/add-double-border-to-SVG/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Simplify SVG Code Using Basic Shapes]]></title>
            <link>https://holasvg.com/posts/DIY-svg-icons</link>
            <guid>https://holasvg.com/posts/DIY-svg-icons</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>How to Simplify SVG Code Using Basic Shapes</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/how-to-simplify-svg-code-using-basic-shapes/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/DIY-svg-icons/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/DIY-svg-icons/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">29 September 2020</span> <h1>How to Simplify SVG Code Using Basic Shapes</h1> <p class="inner-post-subtitle">DIY SVG Icons</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-DIY-svg-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><blockquote>
<p><em>Read the Chinese version <a href="https://leetcode-cn.com/circle/discuss/SuKP3m/" rel="nofollow noopener noreferrer" target="_blank">here</a>. Translated by Rotten orange 腐烂的橘子</em></p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<p>There are different ways to work with icons, but the best solution always includes SVG, either inline or linked up as a file. Sometimes the icons we download (or the ones we create with a drawing software) have a lot of <strong>unnecessary code</strong> that if we use it inline makes our document longer to scroll, uncomfortable to work with, and just a little bit heavier.</p>
<p>We can work around this <a href="http://localhost:56203/posts/going-beyond-automatic-compression-with-use-element" rel="nofollow noopener noreferrer" target="_blank">reusing chunks of code with the <code>&lt;use></code> element</a> or <a href="http://localhost:56203/posts/use-and-reuse-everything-in-svg-even-animations" rel="nofollow noopener noreferrer" target="_blank">apply native variables to manage our SVG styles</a> from one place.</p>
<p>Here I want to focus on a different perspective: <strong>how to make the same figures with less amount of code</strong> using basic shapes. And get the benefits of smaller, controllable, and semantic icons in our projects without sacrificing quality or visual changes. I'll go through different examples that explore the code of commonly used icons and how we can redraw them using some of the easiest SVG shapes we can make.</p>
<p>These are the icons we'll be working on:</p>
<figure>
    <img src="/blog/blog-DIY-svg-02.png" alt="svg icons">
    <figcaption>Cross, clock, and envelope icons.</figcaption>
</figure>
<p>Let's look at the basic shapes we can use to make these that keep the code small and simple.</p>
<blockquote>
<p><em><strong>Psssst!</strong></em> <a href="https://holasvg.com/icons" rel="nofollow noopener noreferrer" target="_blank">Here is a longer list of simple icons I created on holasvg.com!</a> After this article, you'll know how to modify them and make them your own.</p>
</blockquote>
<h2 id="building-a-close-icon-with-the-line-element"><a href="#building-a-close-icon-with-the-line-element" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Building a close icon with the <code>&lt;line></code> element</h2>
<p>This is the code for the close or cross icon that was downloaded from <a href="https://flaticon.com/" rel="nofollow noopener noreferrer" target="_blank">flaticon.com</a> and built by <a href="https://www.flaticon.com/authors/pixel-perfect" rel="nofollow noopener noreferrer" target="_blank">pixel-perfect</a>:</p>
<iframe width="100%" height="300" scrolling="no" title="Cross icon by Pixel Perfect" src="https://codepen.io/marianab/embed/gOPJOjJ?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/gOPJOjJ'>Cross icon by Pixel Perfect&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>In this example, everything is happening inside the <code>&lt;path></code> with lots of commands and parameters in the data attribute <code>d</code>. What this SVG is doing is tracing the shape from its borders.</p>
<figure>
    <img src="/blog/blog-DIY-svg-03.gif" alt="">
    <figcaption>A quick demonstration using <a target="_blank" href="https://mavo.io/demos/svgpath/">mavo.io</a></figcaption>
</figure>
<p>If you are familiar with Illustrator, this is the equivalent of drawing two separate lines, converting them to shape, then combining both with the pathfinder to create one compound shape.</p>
<figure>
    <img src="/blog/blog-DIY-svg-04.gif" alt="">
    <figcaption>Converting two lines to a compound shape in Illustrator.</figcaption>
</figure>
<p>The <code>&lt;path></code> element allows us to draw complex shapes, but in this case, we can create the same figure with two lines, while keeping the same appearance:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 50 50<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">overflow</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>visible<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>We started by defining a <code>viewBox</code> that goes from 0,0 to 50,50. You can choose whatever dimensions you prefer; the SVG will always scale nicely to any width and height you define. To make things easier, in this case, I also defined an inline width and height of 50 units, which avoids extra calculations in the drawing.</p>
<p>To use the <code>&lt;line></code> element, we declare the coordinates of the lines first point and the coordinates of its last point. In this specific case, we started from <code>x=0 y=0</code> and ended at <code>x=50 y=50</code>.</p>
<figure>
    <img src="/blog/blog-DIY-svg-05.png" alt="">
    <figcaption>Grid of the coordinate system.</figcaption>
</figure>
<p>Here's how that looks in code:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>The second line will start from <code>x=50 y=0</code> and end at <code>x=0 y=50</code>:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>An SVG stroke doesn't have a color by default that's why we added the <code>black</code> value on the <code>stroke</code> attribute. We also gave the <code>stroke-width</code> attribute a width of 10 units and the <code>stroke-linecap</code> a <code>round</code> value to replicate those rounded corners of the original design. These attributes were added directly to the <code>&lt;svg></code> tag so both lines will inherit them.</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">...</span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">...</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Now that the stroke is 10 units bigger than its default size of 1 unit, the line might get cropped by the <code>viewBox</code>. We can either move the points 10 units inside the <code>viewBox</code> or add <code>overflow=visible</code> to the styles.</p>
<p>The values that are equal to 0 can be removed, as 0 is the default. That means the two lines end up with two very small lines of code:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>Just by changing a <code>&lt;path></code> to a <code>&lt;line></code>, not only did we make a smaller SVG file, but a more semantic and controllable chunk of code that makes any future maintenance much easier. And the visual result is exactly the same as the original.</p>
<iframe width="100%" height="300" scrolling="no" title="Cross icon with basic shapes" src="https://codepen.io/marianab/embed/PoZvoxM?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/PoZvoxM'>Cross icon with basic shapes&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Same cross, different code.</p>
<h2 id="building-a-clock-icon-with-the-circle-and-path-elements"><a href="#building-a-clock-icon-with-the-circle-and-path-elements" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Building a clock icon with the <code>&lt;circle></code> and <code>&lt;path></code> elements</h2>
<p>I took this example of a clock icon created by <a href="https://thenounproject.com/barracuda/" rel="nofollow noopener noreferrer" target="_blank">barracuda</a> from <a href="https://thenounproject.com/" rel="nofollow noopener noreferrer" target="_blank">The Noun Project</a>:</p>
<iframe width="100%" height="300" scrolling="no" title="Clock icon from Noun Project " src="https://codepen.io/marianab/embed/qBbzLZo?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/qBbzLZo'>Clock icon from Noun Project &lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>This shape was also drawn with a <code>&lt;path></code>, but we also have a lot of namespaces and XML instructions related to the software used and the license of the file that we can delete without affecting the SVG. Can you tell what illustration editor was used to create the icon?</p>
<p>Let's recreate this one from scratch using a circle and a path with simpler commands. Again, we need to start with a <code>viewBox</code>, this time from 0,0 to 100,100, and with a width and height matching those units.</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 100 100<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M50 25V50 H75<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>We keep the same styles as the previous icon inside the <code>&lt;svg></code> tag. <code>fill</code> is <code>black</code> by default, so we need to explicitly give it a <code>none</code> value to remove it. Otherwise, the circle will have have a solid black fill, obscuring the other shapes.</p>
<p>To draw the <code>&lt;circle></code> we need to indicate a center point from where the radius will sit. We can achieve that with <code>cx</code> (center x) and <code>cy</code> (center y). Then <code>r</code> (radius) will declare how big our circle will be. In this example, the radius is slightly smaller than the <code>viewBox</code>, so it doesn't get cropped when the stroke is 10 units wide.</p>
<blockquote>
<p><em>What's up with all those letters? Check out <a href="https://css-tricks.com/svg-path-syntax-illustrated-guide/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier's illustrated guide</a> for a primer on the SVG syntax.</em></p>
</blockquote>
<p>We can use a <code>&lt;path></code> for the clock hands because it has some very useful and simple commands to draw. Inside the <code>d</code> (data) we must start with the <code>M</code> (move to) command followed by the coordinates from where we'll start drawing which, in this example, is 50,25 (near the top-center of the circle).</p>
<p>After the <code>V</code> (vertical) command, we only need one value as we can only move up or down with a negative or positive number. A positive number will go down. The same for <code>H</code> (horizontal) followed by a positive number, 75, that will draw toward the right. All commands are uppercase, so the numbers we choose will be points in the grid. If we decided to use lowercase (relative commands) the numbers will be the amount of units that we move in one direction and not an absolute point in the coordinate system.</p>
<iframe width="100%" height="300" scrolling="no" title="Clock icon with Basic Shapes" src="https://codepen.io/marianab/embed/PoZrXWM?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/PoZrXWM'>Clock icon with Basic Shapes&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Same clock, different code.</p>
<h2 id="building-an-envelope-icon-with-the-rect-and-polyline-elements"><a href="#building-an-envelope-icon-with-the-rect-and-polyline-elements" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Building an envelope icon with the <code>&lt;rect></code> and <code>&lt;polyline></code> elements</h2>
<p>I drew the envelope icon in Illustrator without expanding the original shapes. Here's the code that came from the export:</p>
<iframe width="100%" height="300" scrolling="no" title="Envelope SVG Icon" src="https://codepen.io/geoffgraham/embed/dyMWyKy?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/dyMWyKy'>Envelope SVG Icon&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<blockquote>
<p><em><strong>Hey!</strong></em> Illustrator offers some SVG options to export the graphic. I chose Style Elements in the CSS Properties dropdown so I can have a <code>&lt;style></code> tag that contains classes that I might want to move to a CSS file. But there are different ways to apply the styles in SVG, of course.</p>
</blockquote>
<p>We already have basic shapes in this code! I unselected the Shape to paths option in Illustrator which helped a lot there. We can optimize this further with <a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noopener noreferrer" target="_blank">SVGOMG</a> to remove the comments, XML instructions, and unnecessary data, like empty elements. From there, we can manually remove other extras, if we need to.</p>
<p>We already have something a little more concise:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.1<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Layer_1<span class="token punctuation">"</span></span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 310 190<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xml:</span>space</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>preserve<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token selector"><span class="token class">.st0</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span>none<span class="token punctuation">;</span><span class="token property">stroke</span><span class="token punctuation">:</span><span class="token hexcode color">#000</span><span class="token punctuation">;</span><span class="token property">stroke-width</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token property">stroke-linecap</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-linejoin</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-miterlimit</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">}</span>
  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>180<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>polyline</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">points</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5 5 155 110 305 5<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>We can remove even more stuff without affecting the visual appearance of the envelope, including:</p>
<ul>
<li><code>version="1.1"</code> (this has been <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/version" rel="nofollow noopener noreferrer" target="_blank">deprecated</a> since SVG 2)</li>
<li><code>id="Layer_1"</code> (this has no meaning or use)</li>
<li><code>x="0"</code> (this is a default value)</li>
<li><code>y="0"</code> (this is a default value)</li>
<li><code>xml:space="preserve"</code> (this has been <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xml:space" rel="nofollow noopener noreferrer" target="_blank">deprecated</a> since SVG 2)</li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 310 190<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token selector"><span class="token class">.st0</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span>none<span class="token punctuation">;</span><span class="token property">stroke</span><span class="token punctuation">:</span><span class="token hexcode color">#000</span><span class="token punctuation">;</span><span class="token property">stroke-width</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token property">stroke-linecap</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-linejoin</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-miterlimit</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">}</span>
  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>180<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>polyline</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">points</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5 5 155 110 305 5<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>We can move the CSS styles to a separate stylesheet if we really want to get really aggressive.</p>
<p><code>&lt;rect></code> needs a starting point from where we'll extend a width and a height, so let's use  <code>x="5"</code> and <code>y="5"</code> which is our top-left point. From there, we will create a rectangle that is 300 units wide with a height of 180 units. Just like the clock icon, we'll use 5,5 as the starting point because we have a 10-unit stroke that will get cropped if the coordinates were located at 0,0.</p>
<p><code>&lt;polyline></code> is similar to <code>&lt;line></code>, but with an infinite amount of points that we define, like pairs of coordinates, one after the other, inside the points attribute, where the first number in the pair will represent <code>x</code> and the second will be <code>y</code>. It's easier to read the sequence with commas, but those can be replaced with whitespace without having an impact on the result.</p>
<iframe width="100%" height="300" scrolling="no" title="SVG Envelope Icon (Optimized)" src="https://codepen.io/geoffgraham/embed/zYqwYbX?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/zYqwYbX'>SVG Envelope Icon (Optimized)&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Same envelope, different code.</p>
<h2 id="bonus-shapes"><a href="#bonus-shapes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Bonus shapes!</h2>
<p>I didn't include examples of icons that can be simplified with <code>&lt;polygon></code> and <code>&lt;ellipse></code> shapes, but here is a quick way to use them.</p>
<p><code>&lt;polygon></code> is the same as <code>&lt;polyline></code>, only this element will always define a closed shape. Here's an example that comes <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon" rel="nofollow noopener noreferrer" target="_blank">straight from MDN</a>:</p>
<iframe width="100%" height="300" scrolling="no" title="Simple SVG Polygon (MDN)" src="https://codepen.io/geoffgraham/embed/jOqmEZd?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/jOqmEZd'>Simple SVG Polygon (MDN)&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Remember the circle we drew earlier for the clock icon? Replace the <code>r</code> (radius) with <code>rx</code> and <code>ry</code>. Now you have two different values for radius. Here's another <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse" rel="nofollow noopener noreferrer" target="_blank">example from MDN</a>:</p>
<iframe width="100%" height="300" scrolling="no" title="Simple ellipse (MDN)" src="https://codepen.io/geoffgraham/embed/bGpWNax?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/bGpWNax'>Simple ellipse (MDN)&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<h2 id="wrapping-up"><a href="#wrapping-up" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Wrapping up</h2>
<p>We covered a lot here in a short amount of time! While we used examples to demonstrates the process of optimizing SVGs, here's what I hope you walk away with from this post:</p>
<ul>
<li>Remember that compression starts with how the SVG is drawn in illustration software.</li>
<li>Use available tools, like SVOMG, to compress SVG.</li>
<li>Remove unnecessary metadata by hand, if necessary.</li>
<li>Replace complex paths with basic shapes.</li>
<li><code>&lt;use></code> is a great way to inline SVG as well as for establishing your own library of reusable icons.</li>
</ul>
<h3 id="how-many-icons-can-be-created-by-combining-these-basic-shapes"><a href="#how-many-icons-can-be-created-by-combining-these-basic-shapes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>How many icons can be created by combining these basic shapes?</h3>
<p><a href="https://holasvg.com/icons" rel="nofollow noopener noreferrer" target="_blank">I'm working on my list on holasvg.com/icons</a>, I'll be constantly uploading more icons and features here, and now you know how to easily modified them just by changing a few numbers. <strong>Go ahead and make them yours!</strong></p>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/how-to-simplify-svg-code-using-basic-shapes/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> with edits from <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> and <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a></p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/use-and-reuse-everything-in-svg-even-animations" data-v-5e4666ba>
      ←
      How to use and reuse everything in SVG… even animations
    </a></div> <div data-v-5e4666ba><a href="/posts/como-simplificar-c%C3%B3digo-SVG-usando-formas-basicas" data-v-5e4666ba>
      Cómo simplificar código SVG usando formas básicas
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/DIY-svg-icons/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Adding value to our client's platform and brand]]></title>
            <link>https://holasvg.com/posts/adding-value-to-our-clients-platform-and-brand</link>
            <guid>https://holasvg.com/posts/adding-value-to-our-clients-platform-and-brand</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Adding value to our client's platform and brand</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/adding-value-to-our-clients-platform-and-brand/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/adding-value-to-our-clients-platform-and-brand/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">6 Oct 2018</span> <h1>Adding value to our client's platform and brand</h1> <p class="inner-post-subtitle">How to make a brand thrive along with the site</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/css?type=posts" class="card-category"><span>#css</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-adding-value-02.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Not every brand guidelines include definitions for the usage of photography, illustrations, or image styles. Far from being a problem, this could mean a great opportunity for a redesign project. While filling the requirements for a software development project, we discovered the chance to create and explore a visual universe to enlarge our client's identity.</p>
<p>On every website, we find common spaces to communicate to the users what is happening. Places where the message is simple but we can tell a story. Some of them include logins, error pages, and loadings, they communicate the same on every site, and that is what let us space to release some creativity.</p>
<h2 id="the-startingpoint"><a href="#the-startingpoint" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The starting point</h2>
<p><svg width="140" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 131.1 130.4" overflow="visible" class="img-shape-house"><g id="store_1_"><path d="M12.8 66.9h111.1v63H12.8z" class="st0"></path><path d="M111.7 54.2h12.2l6.7 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l-5.3-13.2z" class="st1"></path><path d="M12.8 129.9V74.8M124 74.8v55.1M115.2 129.9V80.4H80.1v49.5" class="st2"></path><path d="M92.2 99.1l5.5-9.5 5.4 9.5" class="st2"></path><circle cx="97.7" cy="89.6" r="1.3" class="st0"></circle><path d="M106.5 108.1H88.8c-.7 0-1.3-.6-1.3-1.3v-6.3c0-.7.6-1.3 1.3-1.3h17.8c.7 0 1.3.6 1.3 1.3v6.3c0 .7-.6 1.3-1.4 1.3z" class="st3"></path><g id="toldo_2_"><path d="M37.7 54.2h12.2l-2.3 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l3.7-13.2zM62.3 54.2h12.3l.6 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l.7-13.2z" class="st4"></path><path d="M49.7 54.2H62l-.7 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l2-13.2zM25.1 54.2h12.3l-3.8 13c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l5.1-13zM86.8 54.2H74.5l.7 13.2c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8l-2-13.2zM99 54.2l3.8 13c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8l-5-13" class="st5"></path><path d="M87.1 54.2h12.2l3.6 13.2c0 3.8-3.1 6.8-6.8 6.8-3.7 0-6.8-3.1-6.8-6.8l-2.2-13.2zM12.9 54.2h12.2l-5.2 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l6.6-13.2z" class="st4"></path><path d="M6.3 66.9l6.6-12.8H124l6.5 12.8" class="st2"></path><path d="M25.3 54.1l-5.2 13.2c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8M37.6 54.1l-3.7 13.2c0 3.8 3.1 6.8 6.8 6.8s6.8-3.1 6.8-6.8M47.7 67.3c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8M62.3 54.1l-.7 13.2c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8M74.6 54.1l.7 13.2c0 3.8 3.1 6.8 6.8 6.8s6.8-3.1 6.8-6.8M102.8 67.3c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8L87 54.1M130.5 67.3c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8" class="st2"></path><path d="M19.9 67.3c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8V67h124.3-13.9c0 3.8-3.1 7.1-6.8 7.1-3.8 0-6.8-3.1-6.8-6.8M49.9 54.1l-2.4 13.2M99.3 54.1l3.6 13.2" class="st2"></path></g><path d="M116.9 67.4l-5.2-13.2" class="st6"></path><path d="M22.2 81.1h49.3v33.3H22.2z" class="st7"></path><path d="M22.2 87.9h49.3v2.9H22.2z" class="st0"></path><path d="M80.1 115.5h35.2v2.9H80.1z" class="st7"></path><g><path d="M90.3 103.2v-.3c0-.2.1-.5.1-.7.1-.1.1-.3.2-.4.1-.2.2-.3.4-.4.1-.1.2-.1.3-.1.1-.1.2-.1.4-.1H92.3c.1.1.2.1.3.2l.2.2c.2.2.2.4.3.7 0 .3.1.5.1.8v.4c0 .1 0 .3-.1.4-.1.2-.1.5-.2.7 0 .1 0 .1-.1.1-.1.1-.1.3-.2.4l-.3.3s-.1 0-.1.1c0 0-.1 0-.1.1 0 0-.1 0-.1.1-.1 0-.2.1-.3.1h-.4c-.1 0-.3 0-.4-.1l-.3-.3c-.1-.2-.2-.3-.3-.5-.1-.2-.1-.4-.1-.7v-.2-.3c.1-.2.1-.3.1-.5zm2.1 0c0-.2-.1-.4-.1-.6 0-.1-.1-.2-.2-.3-.1-.1-.2-.1-.4-.1-.1 0-.2.1-.3.2-.2.2-.2.4-.3.7v1.2c0 .1.1.3.1.4l.3.3h.3c.1 0 .2 0 .3-.1.1 0 .1-.1.2-.2.1-.2.1-.3.1-.5v-.6-.4zM95.7 101.3h.4c.2 0 .4.1.5.2.1.1.2.2.2.3 0 .1.1.2.1.3v.1c0 .1.1.3.1.4v.4c0 .3-.1.6-.2.8-.1.1-.1.2-.2.3-.1.1-.1.1-.2.1s-.2.1-.2.1c-.1 0-.1.1-.2.1s-.2 0-.4.1H95.3h-.1c0 .1-.1.2-.1.2v.5c0 .1 0 .2-.1.3 0 0 0 .1-.1.1-.1.1-.2.1-.3.1h-.1c-.1 0-.1 0-.2-.1-.1 0-.1-.1-.1-.1 0-.1-.1-.1-.1-.2V104v-1.3-.8-.4-.1c0-.1.1-.2.2-.2H94.9c.5.1.6.1.8.1zm-.4 2.2c0 .2 0 .2.1.2h.2c.1 0 .2 0 .2-.1.1 0 .1-.1.1-.1v-.1c.1-.1.1-.3.1-.4v-.3c0-.1 0-.2-.1-.3l-.1-.1c-.1 0-.2-.1-.2-.1h-.4s-.1 0-.1.1v1c.2 0 .2.1.2.2zM98 102.7v-.8-.1-.3c0-.1.1-.2.2-.2H100c.1 0 .2.1.2.1v.7c0 .1-.1.1-.1.1h-1.2c-.1 0-.1 0-.1.1-.1.1-.1.3 0 .4 0 .1.1.1.1.1H99.8s.1 0 .1.1c.1.1.1.3 0 .4 0 .1-.1.1-.1.1l-.1.1h-.8c-.1 0-.2.1-.2.1v1c0 .1 0 .1.1.1h1.5c.1.1.1.1.1.3v.4c0 .1-.1.1-.1.1H98.1c-.1 0-.1 0-.2-.1v-.1c0-.1-.1-.1-.1-.2v-.5-1-.3c.2 0 .2-.3.2-.6zM101.6 102.1v-.4-.2c0-.1 0-.1.1-.2l.1-.1h.2c.1 0 .2 0 .3.1 0 0 .1 0 .1.1 0 0 .1.1.1.2.1.1.1.3.2.4.1.2.2.5.4.7.1.2.2.3.3.5.1.1.1.2.2.3h.1s.1 0 .1-.1v-.1-1.1-.4-.2-.1c0-.1 0-.2.1-.2 0-.1.1-.1.1-.1h.3c.1 0 .2.1.2.3V105.7c-.1.1-.1.1-.2.1h-.2c-.1 0-.1-.1-.2-.1-.1-.1-.1-.2-.2-.2-.1-.1-.1-.2-.2-.3 0-.1-.1-.1-.1-.2-.1-.1-.2-.3-.3-.4-.1-.2-.2-.4-.3-.5-.1-.1-.1-.2-.2-.3 0 0 0-.1-.1-.1h-.1v1.7c0 .1 0 .2-.1.2h-.5c-.1 0-.1 0-.1-.1s-.1-.2-.1-.2v-.5-1-.4-1.3z" class="st8"></path></g><g id="planta_1_"><path d="M7.4 120.5S1.3 115 4.8 95.6c0-.1 7.5 19 2.6 24.9z" class="st9"></path><path d="M9.2 120.2s-6.5-9 3.8-33.6c0 .1 4.3 27.3-3.8 33.6z" class="st9"></path><path d="M13.6 129.5H3.4l-1.1-11.3h12.4z" class="st0"></path><path d="M.5 115.5h16v2.9H.5z" class="st0"></path></g><path d="M22.2 114.3h49.3v3.8H22.2zM63.2 114.3H30.4l-1.1-5.4h35z" class="st0"></path><path d="M30.9 108.4s1.9-5.7 7.4-.8c0 0 3.6-3.9 6.1-.4 0 0 3.5-6.4 6.6-.3 0 0 2.9-2.2 4.8.7 0 0 4.9-5.6 7.3.8" class="st9"></path><g id="flor2_1_"><path d="M37.3 102.5s-3-3.3 0-3.5c0 .1 2.8-.1 0 3.5zM37.3 102.6s3.8-2.5 3.5 0c-.1 0 0 2.5-3.5 0zM37.3 102.5s-2.7 3.4-3.1.7c0 0-.8-3.7 3.1-.7zM37.3 102.5s.1 3.5 1 4.7" class="st10"></path></g><g id="flor1_1_"><path d="M55.2 103s-2.1-3.9.8-3.3c.1 0 2.8.5-.8 3.3zM55.2 103.1s4.3-1.5 3.3.8c0 .1-.5 2.5-3.3-.8zM55.2 103s-3.4 2.7-3.2-.1c0 0 .2-3.8 3.2.1zM55.2 103s.5 2.4-.5 3.2" class="st10"></path></g></g><g id="pin_2_"><path d="M79 14.2c0 7.5-10.6 29.4-14.7 29.4-3.8 0-14.7-21.9-14.7-29.4S56.7.5 64.3.5C71.8.5 79 6.6 79 14.2z" class="st11"></path><circle cx="64.3" cy="14.9" r="3.9" class="st12"></circle></g></svg></p>
<p>Our client's business is about offering services to other companies, along with a platform to manage them all internally. Our job was to redesign and rethink that custom service platform. At the moment we started, they had this website that was built some years ago, it had an old design and some performance and accessibility problems. They needed a fresh start from the visual and technical perspectives; something simple, fast and easy to use.</p>
<p>It was not the typical product site with a homepage that explains what they do and tries to sell it. The end-user of this platform is a customer that already bought our client's services and uses this platform to manage them in their own company. When they reach this site it's because they have credentials and they already know what the site is about and what it is for.</p>
<p>On the good side, the users are somehow prepared for what they are going to find in the link. They will come to this platform (maybe more than once a day) with a task to complete. So it's important that we don't distract the user from what they're trying to achieve.</p>
<p><svg width="65" xmlns="http://www.w3.org/2000/svg" overflow="visible" viewBox="0 0 19.7 36.9" class="img-shape-tree"><path d="M8.9 35.6s-.7-6.9 5.2-27.7c0 0 6.9 16.3-5.2 27.7z" class="st0"></path><path d="M10.1 36.4s.9-5.1 8.5-18.9c0 .1 3.8 15.1-8.5 18.9zM9.1 35.8S10.1 29 5 7.9c0 0-7.6 16 4.1 27.9z" class="st0"></path><path d="M10 36.4s-1-5.1-9-18.7c0 .1-3.8 14.3 9 18.7z" class="st0"></path><path d="M10.1 36.4S2 27.8 9.4.5c0 0 8.3 28.1.7 35.9z" class="st0"></path></svg></p>
<p>We wanted to make the design visually attractive without cluttering the site, so we had to pick the right moments and the right ways to do that. Our goal was to find those places where we could make the site friendlier and integrated into the brand, keeping in mind that the main purpose of this platform was to manage services in a simple way without disturbing them.</p>
<p>The client's brand was defined with a color palette, typography, and style for icons, but there wasn't a strict guideline for images and illustrations, and that's where we saw an opportunity.</p>
<h3 id="choosing-the-rightformat"><a href="#choosing-the-rightformat" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Choosing the right format</h3>
<p><svg width="140" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="visible" viewBox="0 0 75.8 52.8" class="img-shape-stop"><path d="M60.7 52.6a31.4 31.4 0 008.5-21.4C69.2 14 55.2 0 37.9 0a31.28 31.28 0 00-22.8 52.7h45.6z" fill="#b3d6e9"></path><path d="M25.7 31.1H30v21.5h-4.3zM45.8 31.1h4.3v21.5h-4.3z" class="st1"></path><defs><path id="SVGID_1_" d="M21.2 23.4h33.5v7.5H21.2z"></path></defs><clip-path id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"></use></clip-path><path clipPath="url(#SVGID_2_)" fill="#fff" d="M17.4 20.9h38.4v10.3H17.4z"></path><g clipPath="url(#SVGID_2_)"><path d="M25.09 20.77l3.6 2.7-7.93 10.56-3.6-2.7zM35.4 20.74l3.6 2.7L31.07 34l-3.6-2.7zM45.79 20.77l3.6 2.7-7.92 10.55-3.6-2.7zM56.1 20.73l3.6 2.7L51.78 34l-3.6-2.7z" class="st4"></path></g><path d="M21.2 23.4h33.5v7.5H21.2z" class="st5"></path><g><defs><path id="SVGID_3_" d="M21.2 35.4h33.5v7.5H21.2z"></path></defs><clip-path id="SVGID_4_"><use xlink:href="#SVGID_3_" overflow="visible"></use></clip-path><path clipPath="url(#SVGID_4_)" fill="#fff" d="M19.3 33.6h38v10.6h-38z"></path><g clipPath="url(#SVGID_4_)"><path d="M25.09 32.77l3.6 2.7-7.93 10.56-3.6-2.7zM35.4 32.74l3.6 2.7L31.08 46l-3.6-2.7zM45.79 32.77l3.6 2.7-7.92 10.55-3.6-2.7zM56.1 32.73l3.6 2.7L51.78 46l-3.6-2.7z" class="st4"></path></g></g><path d="M21.2 35.4h33.5v7.5H21.2z" class="st5"></path><path d="M8.2 52.1s-3.6-2.6 1.3-4.2c0 0-1.2-4.5 3.3-3.7 0 0 2.6-6.1 4.9 0 0 0 5.3-1.5 3.6 3.6 0 0 5.3 1.1 1.5 4.3" class="st8"></path><path d="M19.7 52.5s-2.7-2 1-3.1c0 0-.9-3.3 2.4-2.8 0 0 1.9-4.5 3.6 0 0 0 4-1.1 2.7 2.7 0 0 3.9.8 1.1 3.2" class="st8"></path><path d="M.2 52.5h75.4" class="st5"></path><g><circle cx="61" cy="19.1" r="8.8" class="st8"></circle><path d="M61.6 17.3v34.8M61.6 21.2l3.3-3.3M57 20.5l4.6 3.7" class="st9"></path></g></svg></p>
<p>We discarded the usage of photography; photographs are more suitable for products, more literal and grounded in reality. This site was neither about selling a product nor describing it, but to improve the experience of the current users and help them achieve their tasks easily. Illustrations work better to express concepts and we could easily include our client's color palette to make them part of the brand. Besides vectors can perform much better than raster images (we'll talk more about this later).</p>
<p>Our proposal was to build a graphic universe with illustrations to show all these services in a friendlier way and also to communicate when something was happening on the site. By building this graphic universe we are adding a new ingredient to their guidelines, a different solution to approach any possible visual communication problem. We are not offering a set of images, but a set of rules for a language that they can continue to develop and make part of their brand.</p>
<h3 id="references-first"><a href="#references-first" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>References First</h3>
<p>We started by showing the client some references for illustrations with a small description so they could decide which style represented them the most. Some of these images included different perspectives, dimensions, depths, characters, stroke styles, gradients, and solid combinations, rounded and sharp edges, between others. From the beginning, we discarded any complex texture, effects, or super realistic illustrations. We knew that performance will pay if we keep it simple from the beginning.</p>
<figure>
    <img src="/blog/blog-adding-value-03.png" alt="">
	<figcaption>Illustration references</figcaption>
</figure>
<h3 id="test-the-idea-with-thestyle"><a href="#test-the-idea-with-thestyle" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Test the idea with the style</h3>
<p>The client picked two options, so we delivered some small sketches to start testing the styles and at the same time, talking about the ideas to represent. The Login is the first page the user will see, and also the one with more space available for creation. Here, we wanted to show a city where all our client's services coexist, so we sent some drafts of the city with both styles:</p>
<figure class="flex-imgs two">
    <img src="/blog/blog-adding-value-04.jpg" width="400" alt="">
    <img src="/blog/blog-adding-value-05.jpg" width="400" alt="">
	<figcaption>First drafts for styles</figcaption>
</figure>
<p>As we mentioned before: when the users reach the login, they are aware of what the site is about. We didn't need to explain the services in detail but to think about how the illustration could reinforce their benefits.</p>
<p>After they picked one final style and the idea of the city was approved, we started discussing which elements to show and how to represent them.</p>
<figure>
    <img src="/blog/blog-adding-value-06.jpg" alt="">
	<figcaption>Drafts of illustrations and Login page</figcaption>
</figure>
<p>This phase was about getting the best way to show all the scenes of the city until the login design was finished. That is when we started focusing on the code and choosing the best way to implement those illustrations on the site.</p>
<h2 id="using-svg"><a href="#using-svg" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Using SVG</h2>
<p>As soon as the illustration was approved, we exported the file from Illustrator to SVG as it's the best format to use vector images on the web. We decided to use the SVG code inline in our document because this approach allows us to make use of animations. Let's review some of the benefits of inline SVG:</p>
<ul>
<li>Very low file size with the best resolution</li>
<li>Flexible options for responsive design</li>
<li>Great performance</li>
<li>Renders immediately</li>
<li>Accessible through the DOM so we can interact with any group of vectors</li>
<li>Allows control of some attributes through a stylesheet</li>
<li>Allows CSS animation</li>
</ul>
<p>There are a few ways to export the SVG, the easiest one is to copy the vectors from Illustrator and paste them in a text editor. As simple as that:</p>
<figure>
    <img src="/blog/blog-adding-value-07.gif" alt="">
	<figcaption>Copy/paste from Illustrator to text editor</figcaption>
</figure>
<p>The software adds a lot of code that is not necessary and hurts legibility and performance. That's why a tool like <a target="_blank" href="https://jakearchibald.github.io/svgomg/">SVGOMG</a> helps us optimize the file in a fast and easy way. Going deeper in that direction, manual optimization is usually part of our process. Another important thing to keep in mind is that SVG is a great ally for accessibility.</p>
<p>Now we have our code clean and we can start adding classes to the elements we want to animate. In this case, CSS animations were enough to build these simple animations.</p>
<p>This was the result for the Login page, the SVG illustration weights only <strong>42k after optimization:</strong></p>
<figure class="full-w">
    <img src="/blog/blog-adding-value-08.gif" alt="">
	<figcaption>Login with micro animations.</figcaption>
</figure>
<blockquote>
<p>Note: The gif is displaying in a loop but some animations were playing just once.</p>
</blockquote>
<p>After the main animation was ready, smaller instances were easier to build. Once users get into the site, different scenarios of the city appear as they navigate it. Other instances included a loading animation, an error message, and a 404 error page:</p>
<figure>
    <img src="/blog/blog-adding-value-09.gif" alt="">
	<figcaption>Loading</figcaption>
</figure>
<figure>
    <img src="/blog/blog-adding-value-10.png" alt="">
	<figcaption>Error message</figcaption>
</figure>
<figure>
    <img src="/blog/blog-adding-value-11.gif" alt="">
	<figcaption>404 error page</figcaption>
</figure>
<p>Using the same illustration language we started building a graphic universe, communicating different messages with the same visual identity. We are able to enrich any instance in the site in a non-verbal way, without losing identity but widening our possibilities of expression.</p>
<h2 id="two-valuable-conclusions"><a href="#two-valuable-conclusions" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Two valuable conclusions</h2>
<p>Vector graphics gave us the possibility to work with <a href="https://www.youtube.com/watch?v=qPG1veWTx30&ab_channel=Leniolabs" rel="nofollow noopener noreferrer" target="_blank">SVG and CSS animations</a>. This way we could deliver low file sizes with the best quality resolution and performance that adapt to every viewport.</p>
<p>Agile methodologies were not only used in the development instance of this project, but also in the UI/UX definition phase. We made the illustration process part of our sprints, which helped us to get the client involved at every point of the process. Their input was key, they gave us the freedom to propose a new language, they guide us through the way to make it work with their current brand and committed with every detail of each illustration.</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/comfort-shatter" data-v-5e4666ba>
      ←
      Comfort Shatter App prototype
    </a></div> <div data-v-5e4666ba><a href="/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente" data-v-5e4666ba>
      Agregar valor a la plataforma y la marca de nuestro cliente
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/adding-value-to-our-clients-platform-and-brand/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Agregar doble borde a formas SVG]]></title>
            <link>https://holasvg.com/posts/agregar-doble-borde-a-formas-SVG</link>
            <guid>https://holasvg.com/posts/agregar-doble-borde-a-formas-SVG</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Agregar doble borde a formas SVG</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/how-to-add-a-double-border-to-svg-shapes/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/agregar-doble-borde-a-formas-SVG/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/agregar-doble-borde-a-formas-SVG/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 April 2021</span> <h1>Agregar doble borde a formas SVG</h1> <p class="inner-post-subtitle">Explorando 7 formas diferentes con sintaxis CSS y SVG.</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-double-border-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Supongamos que alguien te pide que agregues un borde doble a algunas formas geométricas en SVG aleatorias. Por algun motivo, no podes usar ningún editor gráfico, deben generarse en tiempo de ejecución, por lo que tenes que resolverlo con CSS o dentro de la sintaxis SVG.</p>
<p>Tu primera pregunta podría ser: ¿Hay algo como <code>stroke-style: double</code> en SVG? La respuesta es aún no y tampoco es tan fácil. Pero voy a hacer el intento de todos modos para ver qué métodos puedo descubrir. Voy a explorar las posibilidades de tres formas básicas diferentes: círculo, rectángulo y polígono. Señalando las que pueden mantener un color transparente en medio de las dos líneas.</p>
<blockquote>
<p><strong>Alerta de spoiler:</strong> todos los resultados tienen sus desventajas, al menos con CSS y SVG, pero les muestro mis intentos.</p>
</blockquote>
<h2 id="las-soluciones-simples"><a href="#las-soluciones-simples" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Las soluciones simples</h2>
<p>Estos no funcionan con todas las formas, pero son las soluciones más fáciles.</p>
<h3 id="outline-y-box-shadow"><a href="#outline-y-box-shadow" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><code>outline</code> y <code>box-shadow</code></h3>
<p>Las propiedades CSS <code>outline</code> y <code>box-shadow</code> solo se aplican al bounding box de la forma o SVG, por lo que ambas son excelentes soluciones <strong>solo para cuadrados y rectángulos</strong>. También permiten colores flexibles usando custom properties.</p>
<p>Solo se necesitan dos líneas de CSS con "outline", además de que mantiene el color de fondo visible a través de la forma.</p>
<ul>
<li>🙁 Solución solo para una forma.</li>
<li>✅ Código sencillo</li>
<li>✅ Los bordes son suaves</li>
<li>✅ Fondo transparente</li>
</ul>
<p><code>box-shadow</code> solo necesita una línea de CSS, pero tenemos que <strong>asegurarnos de que cada forma tenga su propio SVG</strong> ya que no podemos aplicar <code>box-shadow</code> directamente a las formas. Otra cosa a tener en cuenta es que tenemos que aplicar el color del fondo en la declaración.</p>
<ul>
<li>🙁 Solución solo para una forma</li>
<li>✅ Código sencillo</li>
<li>✅ Los bordes son suaves</li>
<li>🙁 Sin fondo transparente</li>
</ul>
<iframe height="500" scrolling="no" title="SVG double border with CSS" src="https://codepen.io/marianab/embed/LYxLJJr?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/LYxLJJr">
  SVG double border with CSS&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="gradientes-svg"><a href="#gradientes-svg" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Gradientes SVG</h3>
<p>Los degradados radiales SVG solo funcionan en círculos ☺️. Podemos aplicar directamente el degradado en el stroke o trazo, pero es mejor usar variables ya que tenemos que declarar los colores muchas veces en el código.</p>
<ul>
<li>🙁 Solución solo para una forma</li>
<li>✅ Código sencillo</li>
<li>🙁 Los bordes son suaves</li>
<li>🙁 Sin fondo transparente</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border with SVG gradients" src="https://codepen.io/marianab/embed/bGgRzNE?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/bGgRzNE">
  SVG double border with SVG gradients&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="soluciones-para-todas-las-formas"><a href="#soluciones-para-todas-las-formas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Soluciones para todas las formas</h2>
<p>Estos funcionarán con todas las formas, pero el código podría volverse engorroso o complejo.</p>
<h3 id="filter-drop-shadow"><a href="#filter-drop-shadow" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><code>filter: drop-shadow()</code></h3>
<p>¡Finalmente, una solución para todas las formas! Debemos tener cada forma en su propio <code>&lt;svg></code> ya que el <code>filtro</code> no se aplicará directamente a las formas. Estamos usando una declaración en CSS y tenemos colores flexibles usando variables. ¿Lo malo? Los bordes no se ven muy suaves.</p>
<ul>
<li>✅ Una solución para todas las formas</li>
<li>✅ Código sencillo</li>
<li>🙁 Los bordes se ven pixelados</li>
<li>🙁 Sin fondo transparente</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double stroke with CSS filters" src="https://codepen.io/marianab/embed/eYgRxrK?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/eYgRxrK">
  SVG double stroke with CSS filters&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="svg-filters"><a href="#svg-filters" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>SVG filters</h3>
<p>Esta es una solución muy flexible. Podemos crear un filtro y agregarlo a las formas a través del atributo <code>filter</code> de SVG. La parte complicada acá es el filtro en sí. Necesitaremos tres paints, una para el borde exterior, otra para rellenar el fondo y la última para pintar la forma en el frente. El resultado se ve mejor que usar <code>drop-shadow</code>, pero los bordes aún se ven pixelados.</p>
<ul>
<li>✅ Una solución para todas las formas</li>
<li>🙁 Código complejo</li>
<li>🙁 Los bordes se ven pixelados</li>
<li>🙁 Sin fondo transparente</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border with SVG filters" src="https://codepen.io/marianab/embed/vYgZPBG?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/vYgZPBG">
  SVG double border with SVG filters&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="reusando-formas"><a href="#reusando-formas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Reusando formas</h3>
<p>Hay un par de opciones posibles aquí.</p>
<h4 id="opción-1-transformaciones"><a href="#opci%C3%B3n-1-transformaciones" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Opción 1: Transformaciones</h4>
<p>Esta solución requiere transformaciones. Colocamos una figura sobre la otra, donde la figura principal tiene un color de relleno y un color de trazo, y la otra figura no tiene relleno, un trazo rojo, y se escala y reposiciona en el centro. Definimos nuestras formas en &lt;<code>defs></code>. El truco es <strong>traducir la mitad del <code>viewBox</code> al espacio negativo</strong> para que, cuando los escalemos, podamos hacerlo desde el centro de la figura.</p>
<ul>
<li>✅ Una solución para todas las formas</li>
<li>🙁 Código duplicado</li>
<li>✅ Los bordes son suaves</li>
<li>✅ Fondo transparente</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border - use and translate" src="https://codepen.io/marianab/embed/poRwYPQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/poRwYPQ">
  SVG double border - use and translate&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h4 id="opción-2-usar"><a href="#opci%C3%B3n-2-usar" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Opción 2: <code>&lt;usar></code></h4>
<p>Encontré una <a href="http://schepers.cc/svg/double-stroke2.svg" rel="nofollow noopener noreferrer" target="_blank">solución inteligente</a> en la [lista de correo de www-svg](<a href="https://lists.w3.org/Archives/Public/www-" rel="nofollow noopener noreferrer" target="_blank">https://lists.w3.org/Archives/Public/www-</a> svg/2013Jan/0005.html) de Doug Schepers que usa SVG <code>&lt;use></code>. Nuevamente, requiere definir las formas una vez y referirse a ellas dos veces usando <code>&lt;use></code>. Esta vez la forma principal tiene un trazo más grande. La segunda forma tiene la mitad del trazo de la forma principal, sin relleno y un trazo que coincide con el color de fondo.</p>
<ul>
<li>✅ Una solución para todas las formas</li>
<li>🙁 Código duplicado</li>
<li>✅ Los bordes son suaves</li>
<li>🙁 Sin fondo transparente</li>
</ul>
<iframe height="450" scrolling="no" title="SVG double border - use and translate" src="https://codepen.io/marianab/embed/poRwYPQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/poRwYPQ">
  SVG double border - use and translate&lt;/a> by Mariana (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="acá-están-los-resultados-completos"><a href="#ac%C3%A1-est%C3%A1n-los-resultados-completos" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¡Acá están los resultados completos!</h2>
<p>Solo para que los tengas todos en un solo lugar. ¡Avísame si se te ocurren otras posibles soluciones!</p>
<figure>
<table class="table-simple"><thead><tr><th>Soluciones</th><th>Todas las formas</th><th>Código simple</th><th>Bordes suavizados</th><th>Fondo transparente</th></tr></thead><tbody><tr><td><code><strong><a href="https://codepen.io/marianab/pen/LYxLJJr">outline</a></strong></code></td><td>🙁</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td><code><strong><a href="https://codepen.io/marianab/pen/LYxLJJr">box-shadow</a></strong></code></td><td>🙁</td><td>✅</td><td>✅</td><td>🙁</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/bGgRzNE">SVG gradients</a></strong></td><td>🙁</td><td>✅</td><td>🙁</td><td>🙁</td></tr><tr><td><code><strong><a href="https://codepen.io/marianab/pen/eYgRxrK">filter: drop-shadow()</a></strong></code></td><td>✅</td><td>✅</td><td>🙁</td><td>🙁</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/vYgZPBG">SVG filters</a></strong></td><td>✅</td><td>🙁</td><td>🙁</td><td>🙁</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/poRwYPQ">Reusando formas:<br>Tranforms</a></strong></td><td>✅</td><td>🙁</td><td>✅</td><td>✅</td></tr><tr><td><strong><a href="https://codepen.io/marianab/pen/JjEJzBK">Reusing shapes:<br><code>&lt;use></code></a></strong></td><td>✅</td><td>🙁</td><td>✅</td><td>🙁</td></tr></tbody></table></figure>
<blockquote>
<p>Este artículo se publicó por primera vez en <a href="https://css-tricks.com/how-to-add-a-double-border-to-svg-shapes/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> con ediciones de <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> y <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/add-double-border-to-SVG" data-v-5e4666ba>
      ←
      How to Add a Double Border to SVG Shapes
    </a></div> <div data-v-5e4666ba><a href="/posts/building-an-svg-virtual-stand" data-v-5e4666ba>
      Building an SVG virtual stand
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/agregar-doble-borde-a-formas-SVG/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Agregar valor a la plataforma y la marca de nuestro cliente]]></title>
            <link>https://holasvg.com/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente</link>
            <guid>https://holasvg.com/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Agregar valor a la plataforma y la marca de nuestro cliente</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">6 Oct 2018</span> <h1>Agregar valor a la plataforma y la marca de nuestro cliente</h1> <p class="inner-post-subtitle">Cómo hacer que una marca prospere junto con el sitio</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/css?type=posts" class="card-category"><span>#css</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-adding-value-02.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>No todas las pautas de marca incluyen definiciones para el uso de fotografías, ilustraciones o estilos de imagen. Lejos de ser un problema, esto podría significar una gran oportunidad para un proyecto de rediseño. Al cumplir con los requisitos para un proyecto de desarrollo de software, descubrimos la oportunidad de crear y explorar un universo visual para ampliar la identidad de nuestro cliente.</p>
<p>En cada sitio web encontramos espacios comunes para comunicar a los usuarios lo que está sucediendo. Lugares donde el mensaje es simple pero podemos contar una historia. Algunos de ellos incluyen inicios de sesión, páginas de error y cargas, comunican lo mismo en todos los sitios, y eso es lo que nos deja espacio para liberar algo de creatividad.</p>
<h2 id="el-punto-de-partida"><a href="#el-punto-de-partida" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>El punto de partida</h2>
<p><svg width="140" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 131.1 130.4" overflow="visible" class="img-shape-house"><g id="store_1_"><path d="M12.8 66.9h111.1v63H12.8z" class="st0"></path><path d="M111.7 54.2h12.2l6.7 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l-5.3-13.2z" class="st1"></path><path d="M12.8 129.9V74.8M124 74.8v55.1M115.2 129.9V80.4H80.1v49.5" class="st2"></path><path d="M92.2 99.1l5.5-9.5 5.4 9.5" class="st2"></path><circle cx="97.7" cy="89.6" r="1.3" class="st0"></circle><path d="M106.5 108.1H88.8c-.7 0-1.3-.6-1.3-1.3v-6.3c0-.7.6-1.3 1.3-1.3h17.8c.7 0 1.3.6 1.3 1.3v6.3c0 .7-.6 1.3-1.4 1.3z" class="st3"></path><g id="toldo_2_"><path d="M37.7 54.2h12.2l-2.3 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l3.7-13.2zM62.3 54.2h12.3l.6 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l.7-13.2z" class="st4"></path><path d="M49.7 54.2H62l-.7 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l2-13.2zM25.1 54.2h12.3l-3.8 13c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l5.1-13zM86.8 54.2H74.5l.7 13.2c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8l-2-13.2zM99 54.2l3.8 13c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8l-5-13" class="st5"></path><path d="M87.1 54.2h12.2l3.6 13.2c0 3.8-3.1 6.8-6.8 6.8-3.7 0-6.8-3.1-6.8-6.8l-2.2-13.2zM12.9 54.2h12.2l-5.2 13.2c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8l6.6-13.2z" class="st4"></path><path d="M6.3 66.9l6.6-12.8H124l6.5 12.8" class="st2"></path><path d="M25.3 54.1l-5.2 13.2c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8M37.6 54.1l-3.7 13.2c0 3.8 3.1 6.8 6.8 6.8s6.8-3.1 6.8-6.8M47.7 67.3c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8M62.3 54.1l-.7 13.2c0 3.8 3.1 6.8 6.8 6.8 3.8 0 6.8-3.1 6.8-6.8M74.6 54.1l.7 13.2c0 3.8 3.1 6.8 6.8 6.8s6.8-3.1 6.8-6.8M102.8 67.3c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8L87 54.1M130.5 67.3c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8" class="st2"></path><path d="M19.9 67.3c0 3.8-3.1 6.8-6.8 6.8-3.8 0-6.8-3.1-6.8-6.8V67h124.3-13.9c0 3.8-3.1 7.1-6.8 7.1-3.8 0-6.8-3.1-6.8-6.8M49.9 54.1l-2.4 13.2M99.3 54.1l3.6 13.2" class="st2"></path></g><path d="M116.9 67.4l-5.2-13.2" class="st6"></path><path d="M22.2 81.1h49.3v33.3H22.2z" class="st7"></path><path d="M22.2 87.9h49.3v2.9H22.2z" class="st0"></path><path d="M80.1 115.5h35.2v2.9H80.1z" class="st7"></path><g><path d="M90.3 103.2v-.3c0-.2.1-.5.1-.7.1-.1.1-.3.2-.4.1-.2.2-.3.4-.4.1-.1.2-.1.3-.1.1-.1.2-.1.4-.1H92.3c.1.1.2.1.3.2l.2.2c.2.2.2.4.3.7 0 .3.1.5.1.8v.4c0 .1 0 .3-.1.4-.1.2-.1.5-.2.7 0 .1 0 .1-.1.1-.1.1-.1.3-.2.4l-.3.3s-.1 0-.1.1c0 0-.1 0-.1.1 0 0-.1 0-.1.1-.1 0-.2.1-.3.1h-.4c-.1 0-.3 0-.4-.1l-.3-.3c-.1-.2-.2-.3-.3-.5-.1-.2-.1-.4-.1-.7v-.2-.3c.1-.2.1-.3.1-.5zm2.1 0c0-.2-.1-.4-.1-.6 0-.1-.1-.2-.2-.3-.1-.1-.2-.1-.4-.1-.1 0-.2.1-.3.2-.2.2-.2.4-.3.7v1.2c0 .1.1.3.1.4l.3.3h.3c.1 0 .2 0 .3-.1.1 0 .1-.1.2-.2.1-.2.1-.3.1-.5v-.6-.4zM95.7 101.3h.4c.2 0 .4.1.5.2.1.1.2.2.2.3 0 .1.1.2.1.3v.1c0 .1.1.3.1.4v.4c0 .3-.1.6-.2.8-.1.1-.1.2-.2.3-.1.1-.1.1-.2.1s-.2.1-.2.1c-.1 0-.1.1-.2.1s-.2 0-.4.1H95.3h-.1c0 .1-.1.2-.1.2v.5c0 .1 0 .2-.1.3 0 0 0 .1-.1.1-.1.1-.2.1-.3.1h-.1c-.1 0-.1 0-.2-.1-.1 0-.1-.1-.1-.1 0-.1-.1-.1-.1-.2V104v-1.3-.8-.4-.1c0-.1.1-.2.2-.2H94.9c.5.1.6.1.8.1zm-.4 2.2c0 .2 0 .2.1.2h.2c.1 0 .2 0 .2-.1.1 0 .1-.1.1-.1v-.1c.1-.1.1-.3.1-.4v-.3c0-.1 0-.2-.1-.3l-.1-.1c-.1 0-.2-.1-.2-.1h-.4s-.1 0-.1.1v1c.2 0 .2.1.2.2zM98 102.7v-.8-.1-.3c0-.1.1-.2.2-.2H100c.1 0 .2.1.2.1v.7c0 .1-.1.1-.1.1h-1.2c-.1 0-.1 0-.1.1-.1.1-.1.3 0 .4 0 .1.1.1.1.1H99.8s.1 0 .1.1c.1.1.1.3 0 .4 0 .1-.1.1-.1.1l-.1.1h-.8c-.1 0-.2.1-.2.1v1c0 .1 0 .1.1.1h1.5c.1.1.1.1.1.3v.4c0 .1-.1.1-.1.1H98.1c-.1 0-.1 0-.2-.1v-.1c0-.1-.1-.1-.1-.2v-.5-1-.3c.2 0 .2-.3.2-.6zM101.6 102.1v-.4-.2c0-.1 0-.1.1-.2l.1-.1h.2c.1 0 .2 0 .3.1 0 0 .1 0 .1.1 0 0 .1.1.1.2.1.1.1.3.2.4.1.2.2.5.4.7.1.2.2.3.3.5.1.1.1.2.2.3h.1s.1 0 .1-.1v-.1-1.1-.4-.2-.1c0-.1 0-.2.1-.2 0-.1.1-.1.1-.1h.3c.1 0 .2.1.2.3V105.7c-.1.1-.1.1-.2.1h-.2c-.1 0-.1-.1-.2-.1-.1-.1-.1-.2-.2-.2-.1-.1-.1-.2-.2-.3 0-.1-.1-.1-.1-.2-.1-.1-.2-.3-.3-.4-.1-.2-.2-.4-.3-.5-.1-.1-.1-.2-.2-.3 0 0 0-.1-.1-.1h-.1v1.7c0 .1 0 .2-.1.2h-.5c-.1 0-.1 0-.1-.1s-.1-.2-.1-.2v-.5-1-.4-1.3z" class="st8"></path></g><g id="planta_1_"><path d="M7.4 120.5S1.3 115 4.8 95.6c0-.1 7.5 19 2.6 24.9z" class="st9"></path><path d="M9.2 120.2s-6.5-9 3.8-33.6c0 .1 4.3 27.3-3.8 33.6z" class="st9"></path><path d="M13.6 129.5H3.4l-1.1-11.3h12.4z" class="st0"></path><path d="M.5 115.5h16v2.9H.5z" class="st0"></path></g><path d="M22.2 114.3h49.3v3.8H22.2zM63.2 114.3H30.4l-1.1-5.4h35z" class="st0"></path><path d="M30.9 108.4s1.9-5.7 7.4-.8c0 0 3.6-3.9 6.1-.4 0 0 3.5-6.4 6.6-.3 0 0 2.9-2.2 4.8.7 0 0 4.9-5.6 7.3.8" class="st9"></path><g id="flor2_1_"><path d="M37.3 102.5s-3-3.3 0-3.5c0 .1 2.8-.1 0 3.5zM37.3 102.6s3.8-2.5 3.5 0c-.1 0 0 2.5-3.5 0zM37.3 102.5s-2.7 3.4-3.1.7c0 0-.8-3.7 3.1-.7zM37.3 102.5s.1 3.5 1 4.7" class="st10"></path></g><g id="flor1_1_"><path d="M55.2 103s-2.1-3.9.8-3.3c.1 0 2.8.5-.8 3.3zM55.2 103.1s4.3-1.5 3.3.8c0 .1-.5 2.5-3.3-.8zM55.2 103s-3.4 2.7-3.2-.1c0 0 .2-3.8 3.2.1zM55.2 103s.5 2.4-.5 3.2" class="st10"></path></g></g><g id="pin_2_"><path d="M79 14.2c0 7.5-10.6 29.4-14.7 29.4-3.8 0-14.7-21.9-14.7-29.4S56.7.5 64.3.5C71.8.5 79 6.6 79 14.2z" class="st11"></path><circle cx="64.3" cy="14.9" r="3.9" class="st12"></circle></g></svg></p>
<p>El negocio de nuestro cliente consiste en ofrecer servicios a otras empresas, junto con una plataforma para administrarlos todos internamente. Nuestro trabajo fue rediseñar y repensar esa plataforma de servicio personalizado. En el momento en que comenzamos, tenían este sitio web que se construyó hace algunos años, tenía un diseño antiguo y algunos problemas de rendimiento y accesibilidad. Necesitaban un nuevo comienzo desde las perspectivas visual y técnica; algo simple, rápido y fácil de usar.</p>
<p>No era el típico sitio de productos con una página de inicio que explica lo que hacen y trata de venderlo. El usuario final de esta plataforma es un cliente que ya compró los servicios de nuestro cliente y utiliza esta plataforma para administrarlos en su propia empresa. Cuando llegan a este sitio es porque tienen credenciales y ya saben de qué se trata el sitio y para qué sirve.</p>
<p>En el lado bueno, los usuarios están de alguna manera preparados para lo que van a encontrar en el enlace. Vendrán a esta plataforma (quizás más de una vez al día) con una tarea que completar. Por lo tanto, es importante que no distraigamos al usuario de lo que está tratando de lograr.</p>
<p><svg width="65" xmlns="http://www.w3.org/2000/svg" overflow="visible" viewBox="0 0 19.7 36.9" class="img-shape-tree"><path d="M8.9 35.6s-.7-6.9 5.2-27.7c0 0 6.9 16.3-5.2 27.7z" class="st0"></path><path d="M10.1 36.4s.9-5.1 8.5-18.9c0 .1 3.8 15.1-8.5 18.9zM9.1 35.8S10.1 29 5 7.9c0 0-7.6 16 4.1 27.9z" class="st0"></path><path d="M10 36.4s-1-5.1-9-18.7c0 .1-3.8 14.3 9 18.7z" class="st0"></path><path d="M10.1 36.4S2 27.8 9.4.5c0 0 8.3 28.1.7 35.9z" class="st0"></path></svg></p>
<p>Queríamos que el diseño fuera visualmente atractivo sin abarrotar el sitio, por lo que teníamos que elegir los momentos adecuados y las formas correctas de hacerlo. Nuestro objetivo era encontrar aquellos lugares donde pudiéramos hacer el sitio más amigable e integrado a la marca, teniendo en cuenta que el propósito principal de esta plataforma era administrar los servicios de una manera simple sin molestarlos.</p>
<p>La marca del cliente se definió con una paleta de colores, tipografía y estilo para los íconos, pero no había un lineamiento estricto para las imágenes e ilustraciones, y ahí vimos una oportunidad.</p>
<h3 id="elegir-el-formato-adecuado"><a href="#elegir-el-formato-adecuado" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Elegir el formato adecuado</h3>
<p><svg width="140" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="visible" viewBox="0 0 75.8 52.8" class="img-shape-stop"><path d="M60.7 52.6a31.4 31.4 0 008.5-21.4C69.2 14 55.2 0 37.9 0a31.28 31.28 0 00-22.8 52.7h45.6z" fill="#b3d6e9"></path><path d="M25.7 31.1H30v21.5h-4.3zM45.8 31.1h4.3v21.5h-4.3z" class="st1"></path><defs><path id="SVGID_1_" d="M21.2 23.4h33.5v7.5H21.2z"></path></defs><clip-path id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"></use></clip-path><path clipPath="url(#SVGID_2_)" fill="#fff" d="M17.4 20.9h38.4v10.3H17.4z"></path><g clipPath="url(#SVGID_2_)"><path d="M25.09 20.77l3.6 2.7-7.93 10.56-3.6-2.7zM35.4 20.74l3.6 2.7L31.07 34l-3.6-2.7zM45.79 20.77l3.6 2.7-7.92 10.55-3.6-2.7zM56.1 20.73l3.6 2.7L51.78 34l-3.6-2.7z" class="st4"></path></g><path d="M21.2 23.4h33.5v7.5H21.2z" class="st5"></path><g><defs><path id="SVGID_3_" d="M21.2 35.4h33.5v7.5H21.2z"></path></defs><clip-path id="SVGID_4_"><use xlink:href="#SVGID_3_" overflow="visible"></use></clip-path><path clipPath="url(#SVGID_4_)" fill="#fff" d="M19.3 33.6h38v10.6h-38z"></path><g clipPath="url(#SVGID_4_)"><path d="M25.09 32.77l3.6 2.7-7.93 10.56-3.6-2.7zM35.4 32.74l3.6 2.7L31.08 46l-3.6-2.7zM45.79 32.77l3.6 2.7-7.92 10.55-3.6-2.7zM56.1 32.73l3.6 2.7L51.78 46l-3.6-2.7z" class="st4"></path></g></g><path d="M21.2 35.4h33.5v7.5H21.2z" class="st5"></path><path d="M8.2 52.1s-3.6-2.6 1.3-4.2c0 0-1.2-4.5 3.3-3.7 0 0 2.6-6.1 4.9 0 0 0 5.3-1.5 3.6 3.6 0 0 5.3 1.1 1.5 4.3" class="st8"></path><path d="M19.7 52.5s-2.7-2 1-3.1c0 0-.9-3.3 2.4-2.8 0 0 1.9-4.5 3.6 0 0 0 4-1.1 2.7 2.7 0 0 3.9.8 1.1 3.2" class="st8"></path><path d="M.2 52.5h75.4" class="st5"></path><g><circle cx="61" cy="19.1" r="8.8" class="st8"></circle><path d="M61.6 17.3v34.8M61.6 21.2l3.3-3.3M57 20.5l4.6 3.7" class="st9"></path></g></svg></p>
<p>Descartamos el uso de la fotografía; las fotografías son más adecuadas para los productos, más literales y basadas en la realidad. Este sitio no se trataba de vender un producto ni de describirlo, sino de mejorar la experiencia de los usuarios actuales y ayudarlos a realizar sus tareas fácilmente. Las ilustraciones funcionan mejor para expresar conceptos y fácilmente podríamos incluir la paleta de colores de nuestro cliente para que sean parte de la marca. Además, los vectores pueden funcionar mucho mejor que las imágenes rasterizadas (hablaremos más sobre esto más adelante).</p>
<p>Nuestra propuesta fue construir un universo gráfico con ilustraciones para mostrar todos estos servicios de una manera más amigable y también para comunicar cuando algo estaba pasando en el sitio. Con la construcción de este universo gráfico estamos añadiendo un nuevo ingrediente a sus pautas, una solución diferente para abordar cualquier posible problema de comunicación visual. No estamos ofreciendo un conjunto de imágenes, sino un conjunto de reglas para un lenguaje que pueden seguir desarrollando y hacer parte de su marca.</p>
<h3 id="referencias-primero"><a href="#referencias-primero" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Referencias primero</h3>
<p>Comenzamos mostrando al cliente algunas referencias de ilustraciones con una pequeña descripción para que pudiera decidir qué estilo le representaba más. Algunas de estas imágenes incluían diferentes perspectivas, dimensiones, profundidades, caracteres, estilos de trazo, degradados y combinaciones de sólidos, bordes redondeados y afilados, entre otros. Desde el principio, descartamos cualquier textura compleja, efectos o ilustraciones súper realistas. Sabíamos que el rendimiento valdrá la pena si mantenemos las cosas simples desde el principio.</p>
<figure>
    <img src="/blog/blog-adding-value-03.png" alt="">
	<figcaption>Refencias de ilustración</figcaption>
</figure>
<h3 id="prueba-la-idea-con-elestilo"><a href="#prueba-la-idea-con-elestilo" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Prueba la idea con el estilo</h3>
<p>El cliente escogió dos opciones, así que le entregamos unos pequeños bocetos para ir probando los estilos y al mismo tiempo hablar de las ideas a representar. El Login es la primera página que verá el usuario, y también la que tiene más espacio disponible para la creación. Aquí queríamos mostrar una ciudad donde conviven todos los servicios de nuestro cliente, por eso enviamos unos bocetos de la ciudad con ambos estilos:</p>
<figure class="flex-imgs two">
    <img src="/blog/blog-adding-value-04.jpg" width="400" alt="">
    <img src="/blog/blog-adding-value-05.jpg" width="400" alt="">
	<figcaption>Primeros borradores de estilos</figcaption>
</figure>
<p>Como mencionamos antes: cuando los usuarios llegan al inicio de sesión, saben de qué se trata el sitio. No necesitábamos explicar los servicios en detalle sino pensar en cómo la ilustración podría reforzar sus beneficios.</p>
<p>Después de que eligieron un estilo final y se aprobó la idea de la ciudad, comenzamos a discutir qué elementos mostrar y cómo representarlos.</p>
<figure>
    <img src="/blog/blog-adding-value-06.jpg" alt="">
	<figcaption>Borradores de ilustraciones y página de inicio de sesión</figcaption>
</figure>
<p>Esta fase se trataba de obtener la mejor manera de mostrar todas las escenas de la ciudad hasta que se terminó el diseño de inicio de sesión. Fue entonces cuando comenzamos a centrarnos en el código y en elegir la mejor manera de implementar esas ilustraciones en el sitio.</p>
<h2 id="uso-de-svg"><a href="#uso-de-svg" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Uso de SVG</h2>
<p>Tan pronto como se aprobó la ilustración, exportamos el archivo de Illustrator a SVG, ya que es el mejor formato para usar imágenes vectoriales en la web. Decidimos usar el código SVG en línea en nuestro documento porque este enfoque nos permite hacer uso de animaciones. Repasemos algunos de los beneficios de SVG en línea:</p>
<ul>
<li>Tamaño de archivo muy bajo con la mejor resolución</li>
<li>Opciones flexibles para un diseño receptivo</li>
<li>Gran actuación</li>
<li>Renderiza inmediatamente</li>
<li>Accesible a través del DOM para que podamos interactuar con cualquier grupo de vectores</li>
<li>Permite el control de algunos atributos a través de una hoja de estilo</li>
<li>Permite animación CSS</li>
</ul>
<p>Hay algunas formas de exportar el SVG, la más fácil es copiar los vectores de Illustrator y pegarlos en un editor de texto. Tan simple como eso:</p>
<figure>
    <img src="/blog/blog-adding-value-07.gif" alt="">
	<figcaption>Copiar/pegar de Illustrator al editor de texto</figcaption>
</figure>
<p>El software agrega mucho código que no es necesario y perjudica la legibilidad y el rendimiento. Por eso, una herramienta como <a target="_blank" href="https://jakearchibald.github.io/svgomg/">SVGOMG</a> nos ayuda a optimizar el archivo de forma rápida y sencilla. Profundizando en esa dirección, la optimización manual suele ser parte de nuestro proceso. Otra cosa importante a tener en cuenta es que SVG es un gran aliado para la accesibilidad.</p>
<p>Ahora tenemos nuestro código limpio y podemos comenzar a agregar clases a los elementos que queremos animar. En este caso, las animaciones CSS fueron suficientes para construir estas animaciones simples.</p>
<p>Este fue el resultado de la página de inicio de sesión, la ilustración SVG pesa solo <strong>42k después de la optimización:</strong></p>
<figure class="full-w">
    <img src="/blog/blog-adding-value-08.gif" alt="">
	<figcaption>Inicie sesión con micro animaciones.</figcaption>
</figure>
<blockquote>
<p>Nota: el gif se muestra en un bucle, pero algunas animaciones se reproducían solo una vez.</p>
</blockquote>
<p>Una vez que la animación principal estuvo lista, las instancias más pequeñas fueron más fáciles de construir. Una vez que los usuarios ingresan al sitio, aparecen diferentes escenarios de la ciudad a medida que navegan. Otras instancias incluyeron una animación de carga, un mensaje de error y una página de error 404:</p>
<figure>
    <img src="/blog/blog-adding-value-09.gif" alt="">
	<figcaption>Loading</figcaption>
</figure>
<figure>
    <img src="/blog/blog-adding-value-10.png" alt="">
	<figcaption>Mensaje de error</figcaption>
</figure>
<figure>
    <img src="/blog/blog-adding-value-11.gif" alt="">
	<figcaption>404 página de error</figcaption>
</figure>
<p>Con el mismo lenguaje de ilustración empezamos a construir un universo gráfico, comunicando diferentes mensajes con una misma identidad visual. Somos capaces de enriquecer cualquier instancia del sitio de forma no verbal, sin perder identidad pero ampliando nuestras posibilidades de expresión.</p>
<h2 id="dos-valiosas-conclusiones"><a href="#dos-valiosas-conclusiones" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Dos valiosas conclusiones</h2>
<p>Los gráficos vectoriales nos dieron la posibilidad de trabajar con <a href="https://www.youtube.com/watch?v=qPG1veWTx30&ab_channel=Leniolabs" rel="nofollow noopener noreferrer" target="_blank">animaciones SVG y CSS</a>. De esta manera, podríamos entregar tamaños de archivo bajos con la mejor resolución de calidad y rendimiento que se adapte a cada ventana gráfica.</p>
<p>No solo se utilizaron metodologías ágiles en la instancia de desarrollo de este proyecto, sino también en la fase de definición de UI/UX. Hicimos el proceso de ilustración parte de nuestros sprints, lo que nos ayudó a involucrar al cliente en cada punto del proceso. Su aporte fue clave, nos dieron la libertad de proponer un nuevo lenguaje, nos guiaron en la forma de hacerlo funcionar con su marca actual y se comprometieron con cada detalle de cada ilustración.</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/adding-value-to-our-clients-platform-and-brand" data-v-5e4666ba>
      ←
      Adding value to our client's platform and brand
    </a></div> <div data-v-5e4666ba><a href="/posts/leniolabs-brand-and-website-redesign" data-v-5e4666ba>
      Leniolabs brand & web redesign
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building an SVG virtual stand]]></title>
            <link>https://holasvg.com/posts/building-an-svg-virtual-stand</link>
            <guid>https://holasvg.com/posts/building-an-svg-virtual-stand</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Building an SVG virtual stand</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/building-an-svg-virtual-stand/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/building-an-svg-virtual-stand/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">22 September 2021</span> <h1>Building an SVG virtual stand</h1> <p class="inner-post-subtitle">A responsive illustrated website with CSS Grid.</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/grid?type=posts" class="card-category"><span>#grid</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-virtual-stand-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p><a href="https://nerdear.la/" rel="nofollow noopener noreferrer" target="_blank">Nerdearla</a> is an annual conference with talks and workshops about technology and science here in Buenos Aires.</p>
<p>As sponsors of the event with <a href="https://www.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">Leniolabs</a>, we used to have a stand where people could come by and say hi, play games with us, talk about technologies we love, and get some of our <a href="https://www.behance.net/gallery/90294769/Leniolabs_-merchandising" rel="nofollow noopener noreferrer" target="_blank">alien merch</a>. <strong>It was the perfect excuse to get to know each other in this community</strong>.</p>
<figure>
    <img src="/blog/blog-virtual-stand-02.jpg" alt="">
	<figcaption>Leniolabs’ merchandising in events</figcaption>
</figure>
<p>Then the pandemic changed everything. And the event as we knew it was not possible anymore. They resolved to make this last edition online, so <strong>we decided to build a site to still be able to interact with people</strong> and play the games we’ve been developing. We didn’t know what to expect. Trying to keep closer in the distance was a challenge for us. But at the same time, there was a bigger audience to connect to, as many speakers and attendees could be present from any part of the world.</p>
<p><strong>We first attempted to create an interactive city</strong> to chat in bars or share articles in the library, talk in the theatres, or play games in the park. But all those places seemed far away from our reality at that moment.</p>
<figure>
    <img src="/blog/blog-virtual-stand-03.jpg" alt="">
	<figcaption>First idea. Leniolabs city.</figcaption>
</figure>
<p>Then the popular <em>#stayathome</em> hashtag hit us: <strong>why not illustrate our own house at Leniolabs?</strong></p>
<p><strong>Each room would refer to one area of the company</strong>; we had our videos of workshops and talks in the garage, our blog posts in the home library, the live chat in the living room, the games in the garden, the trivia challenges in the loft, our lab in the basement, the Bootcamp we were cooking at the kitchen, and the job section in the office room. And everyone was invited; we wanted to share what happens inside Leniolabs, our internal workshops, and articles we write to share our knowledge.</p>
<figure>
    <img src="/blog/blog-virtual-stand-04.jpg" alt="">
	<figcaption>Leniolabs’ house website design.</figcaption>
</figure>
<h2 id="coding-the-design-and-making-it-responsive"><a href="#coding-the-design-and-making-it-responsive" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coding the design and making it responsive</h2>
<p>There was a challenge to make this website mobile-friendly as the whole site was a big illustration. After playing around with different approaches, we decided to use <a href="https://grid.layoutit.com/" rel="nofollow noopener noreferrer" target="_blank">Layoutit</a> to build a CSS Grid. We exported every room as a single SVG and made every SVG a component. Then <strong>we created a grid where every grid item was one of these components</strong>. We changed the layout and the position of the grid areas depending on the screen size, going from 4 column layout on large screens to a single column on mobile.</p>
<figure>
    <img src="/blog/blog-virtual-stand-05.gif" alt="">
	<figcaption>CSS grid and SVG components.</figcaption>
</figure>
<h2 id="the-technology-used"><a href="#the-technology-used" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The technology used</h2>
<p>We chose <a href="https://nuxtjs.org/" rel="nofollow noopener noreferrer" target="_blank">Nuxt</a> as we needed a site that would last 5 days but with one month to build it from scratch. No time was lost in router configuration, auto imported components, and a nice folder structure in a pre-rendered site. And we chose <a href="https://www.netlify.com/" rel="nofollow noopener noreferrer" target="_blank">Netlify</a> as we needed to iterate and share the results often. A free, serverless platform to push and deploy.</p>
<h2 id="css-animations"><a href="#css-animations" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>CSS animations</h2>
<p>We used some small animations on hover to make the house a little bit more alive—all with preferred reduce-motion for accessibility.</p>
<figure class="grid-gifs">
    <img src="/blog/blog-virtual-stand-06.gif" alt="">
    <img src="/blog/blog-virtual-stand-07.gif" alt="">
    <img src="/blog/blog-virtual-stand-08.gif" alt="">
    <img src="/blog/blog-virtual-stand-09.gif" alt="">
    <img src="/blog/blog-virtual-stand-10.gif" alt="">
    <img src="/blog/blog-virtual-stand-11.gif" alt="">
  <figcaption>Micro animations</figcaption>
</figure>
<h1 id="night-mode-and-easter-eggs"><a href="#night-mode-and-easter-eggs" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Night mode and easter eggs</h1>
<p><strong>After a certain hour, the house switches off</strong>, some of the lights are out, and others are on. The sleeping cat is now catching a spider; Leni (our alien mascot) falls asleep outside the house. <strong>We love the idea that the more you visit the site, the more details you’ll find hidden</strong>. Every SVG is a reusable component that appears on each internal page and changes as the dark mode turns on.</p>
<figure>
    <img src="/blog/blog-virtual-stand-12.gif" alt="">
    <img src="/blog/blog-virtual-stand-13.gif" alt="">
  <div class="grid-gifs-two">
    <img src="/blog/blog-virtual-stand-14.gif" alt="">
    <img src="/blog/blog-virtual-stand-15.gif" alt="">
    <figcaption>Day mode — Night mode.</figcaption>
  </div>
</figure>
<p>Between 4 pm and 7 am, this function adds a class to the container of the site to activate the dark mode:</p>
<div class="nuxt-content-highlight"><pre class="language-javascript line-numbers"><code><span class="token operator">&lt;</span>template<span class="token operator">></span>
 <span class="token operator">&lt;</span>div <span class="token operator">:</span><span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"{ night: isDark }"</span><span class="token operator">></span>
 <span class="token spread operator">...</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>template<span class="token operator">></span>
<span class="token operator">&lt;</span>script<span class="token operator">></span>
 <span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token punctuation">{</span>
  <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword control-flow">return</span> <span class="token punctuation">{</span> <span class="token literal-property property">isDark</span><span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
 <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span>
  <span class="token function">updateTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>process<span class="token punctuation">.</span><span class="token property-access">client</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 
    <span class="token keyword">const</span> hours <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">getHours</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token property-access">isDark</span> <span class="token operator">=</span> hours <span class="token operator">&lt;</span> <span class="token number">7</span> <span class="token operator">||</span> hours <span class="token operator">></span> <span class="token number">16</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
 <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token spread operator">...</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">></span>
</code></pre></div>
<p>This ended up being our official event site for Nerdearla, as they will continue doing it online and we are part of the 2021 edition from 20 to 23rd of October. We will be hosting games and sending gifts to everyone who will join us this year! But even if you don’t join the conference <strong>you can still visit our virtual stand at <a href="https://nerdearla.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">https://nerdearla.leniolabs.com</a></strong></p>
<p>More details about the making of the site are in this talk (Spanish version):</p>
<iframe width="100%" height="460" src="https://www.youtube.com/embed/fUTEryzf6ag" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/agregar-doble-borde-a-formas-SVG" data-v-5e4666ba>
      ←
      Agregar doble borde a formas SVG
    </a></div> <div data-v-5e4666ba><a href="/posts/un-stand-virtual-con-SVG" data-v-5e4666ba>
      Un stand virtual con SVG
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/building-an-svg-virtual-stand/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Comfort Shatter Prototipo de App]]></title>
            <link>https://holasvg.com/posts/comfort-shatter-es</link>
            <guid>https://holasvg.com/posts/comfort-shatter-es</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Comfort Shatter Prototipo de App</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/comfort-shatter-es/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/comfort-shatter-es/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">5 October 2018</span> <h1>Comfort Shatter Prototipo de App</h1> <p class="inner-post-subtitle">Prototipo de App</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-comfort-shatter.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><h2 id="diseño-de-uiux-para-prototipo-de-aplicación-móvil"><a aria-hidden="true" href="#dise%C3%B1o-de-uiux-para-prototipo-de-aplicaci%C3%B3n-m%C3%B3vil" tabindex="-1"><span class="icon icon-link"></span></a>Diseño de UI/UX para prototipo de aplicación móvil</h2>
<blockquote>
<p>“La mayoría de las personas viven en un círculo restringido de potencial”.
-Guillermo James</p>
</blockquote>
<h2 id="para-quién-es-la-aplicación"><a aria-hidden="true" href="#para-qui%C3%A9n-es-la-aplicaci%C3%B3n" tabindex="-1"><span class="icon icon-link"></span></a>¿Para quién es la aplicación?</h2>
<p>Nuestros dispositivos móviles se han convertido en una parte indispensable de nuestras vidas: los llevamos a todas partes, así que ¿por qué no usarlos para un poco de entrenamiento de vida? Comfort Shatter es para personas que quieren mejorar su crecimiento y desarrollo personal; los desafíos diarios crean un circuito de retroalimentación positiva que puede ayudar con la felicidad y la realización.</p>
<h3 id="propuesta"><a aria-hidden="true" href="#propuesta" tabindex="-1"><span class="icon icon-link"></span></a>Propuesta</h3>
<p>Comfort Shatter es una aplicación que presenta a los usuarios desafíos para salir de su zona de confort. Ofrece diferentes paquetes y se atreve a enfrentar los miedos sociales, mejorar la autoestima y desafiar los límites. Permite a los usuarios realizar un seguimiento de su propio progreso, invitar a amigos y compartir sus ganancias diarias en las redes sociales.</p>
<h3 id="estructuras-alámbricas"><a aria-hidden="true" href="#estructuras-al%C3%A1mbricas" tabindex="-1"><span class="icon icon-link"></span></a>Estructuras alámbricas</h3>
<p>Comenzando con algunos bocetos. sacar las ideas de la cabeza y ponerlas en papel.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-02.jpg" alt="Picture of a book with handmade sketches">
    <figcaption>Primer borrador con flujo de usuario.</figcaption>
</figure>
<h3 id="inspiración-de-diseño"><a aria-hidden="true" href="#inspiraci%C3%B3n-de-dise%C3%B1o" tabindex="-1"><span class="icon icon-link"></span></a>Inspiración de diseño</h3>
<p>Buscando algunos colores vibrantes para una paleta moderna, monstruos amigables para representar los desafíos, formas redondeadas y fuentes de pincel.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-03.jpg" alt="Vibrant colors, friendly monsters.">
    <figcaption>Mood board de inspiración</figcaption>
</figure>
<h2 id="diseñando-la-aplicación"><a aria-hidden="true" href="#dise%C3%B1ando-la-aplicaci%C3%B3n" tabindex="-1"><span class="icon icon-link"></span></a>Diseñando la aplicación</h2>
<p>Es hora de trabajar en algunas maquetas de alta fidelidad. Buscando contraste de color, ajustando el diseño de personajes y marcando las reglas para futuras capturas de pantalla.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-01.jpg" alt="Screenshots of the mobile app">
    <figcaption>Maquetas de alta fidelidad.</figcaption>
</figure>
<h2 id="guía-de-estilos"><a aria-hidden="true" href="#gu%C3%ADa-de-estilos" tabindex="-1"><span class="icon icon-link"></span></a>Guía de estilos</h2>
<p>Montserrat como fuente principal para legibilidad en todo el sitio y Supermarket VTS Sale para títulos destacados. Usando formas redondas y círculos para una apariencia amigable.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-04.jpg" alt="">
    <figcaption>Fuentes y paleta de colores.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-comfort-shatter-05.jpg" alt="">
    <figcaption>Elementos de diseño y directrices.</figcaption>
</figure>
<h3 id="flujo-de-usuario"><a aria-hidden="true" href="#flujo-de-usuario" tabindex="-1"><span class="icon icon-link"></span></a>Flujo de usuario</h3>
<p>Esbozar el flujo de usuario antes de construir el prototipo final.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-06.jpg" alt="screenshot of mobile app with arrows showing the user flow">
    <figcaption>Esquema de flujo de usuario.</figcaption>
</figure>
<h2 id="prototipo-final"><a aria-hidden="true" href="#prototipo-final" tabindex="-1"><span class="icon icon-link"></span></a>Prototipo final</h2>
<p>La maqueta final con interacciones antes de entrar en desarrollo.
Construido con InVision Studio y la aplicación InVision. Monstruos construidos con Adobe Illustrator.</p>
<iframe src="https://player.vimeo.com/video/293394826" width="640" height="1277" frameborder="0" allow="autoplay; fullscreen" allowfullscreen class="vimeo"></iframe>
<p><a href="https://vimeo.com/293394826">Comfort Shatter</a> from <a href="https://vimeo.com/marianabeldi">Mariana Beldi</a> on <a href="https://vimeo.com">Vimeo</a>.</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><!----></div> <div data-v-5e4666ba><a href="/posts/comfort-shatter" data-v-5e4666ba>
      Comfort Shatter App prototype
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/comfort-shatter-es/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Comfort Shatter App prototype]]></title>
            <link>https://holasvg.com/posts/comfort-shatter</link>
            <guid>https://holasvg.com/posts/comfort-shatter</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Comfort Shatter App prototype</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/comfort-shatter/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/comfort-shatter/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">5 October 2018</span> <h1>Comfort Shatter App prototype</h1> <p class="inner-post-subtitle">App prototype</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-comfort-shatter.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><h2 id="uiux-design-for-mobile-app-prototype"><a aria-hidden="true" href="#uiux-design-for-mobile-app-prototype" tabindex="-1"><span class="icon icon-link"></span></a>UI/UX design for mobile app prototype</h2>
<blockquote>
<p>“Most people live in a restricted circle of potential.”<br>
-William James</p>
</blockquote>
<h2 id="who-is-the-app-for"><a aria-hidden="true" href="#who-is-the-app-for" tabindex="-1"><span class="icon icon-link"></span></a>Who is the app for?</h2>
<p>Our mobile devices have become an indispensable part of our lives: we carry them everywhere we go, so why not use them for a bit of life coaching? Comfort Shatter is for people who want to improve their personal growth and development; the daily challenges create a positive feedback loop that can help with happiness and fulfillment.</p>
<h3 id="proposal"><a aria-hidden="true" href="#proposal" tabindex="-1"><span class="icon icon-link"></span></a>Proposal</h3>
<p>Comfort Shatter is an app that brings users challenges to break out of their comfort zone. It offers different packages and dares to face social fears, improve self-esteem, and challenge the limits. It allows users to track their own progress, invite friends, and share their daily wins on social networks.</p>
<h3 id="wireframes"><a aria-hidden="true" href="#wireframes" tabindex="-1"><span class="icon icon-link"></span></a>Wireframes</h3>
<p>Starting with some sketches. get the ideas out of the head and down on paper.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-02.jpg" alt="Picture of a book with handmade sketches">
    <figcaption>First draft with user flow.</figcaption>
</figure>
<h3 id="design-inspiration"><a aria-hidden="true" href="#design-inspiration" tabindex="-1"><span class="icon icon-link"></span></a>Design inspiration</h3>
<p>Looking for some vibrant colors for a modern palette, friendly monsters to represent the challenges, rounded shapes, and brush fonts.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-03.jpg" alt="Vibrant colors, friendly monsters.">
    <figcaption>Mood board of inspiration</figcaption>
</figure>
<h2 id="designing-the-app"><a aria-hidden="true" href="#designing-the-app" tabindex="-1"><span class="icon icon-link"></span></a>Designing the app</h2>
<p>Time to work on some high fidelity mockups. Looking for color contrast, adjusting character design and setting the rules for future screenshots.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-01.jpg" alt="Screenshots of the mobile app">
    <figcaption>High fidelity mockups.</figcaption>
</figure>
<h2 id="guidelines"><a aria-hidden="true" href="#guidelines" tabindex="-1"><span class="icon icon-link"></span></a>Guidelines</h2>
<p>Montserrat as the main font for legibility across the site and VTS Supermarket sale for outstanding titles. Using round shapes and circles for a friendly look and feel.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-04.jpg" alt="">
    <figcaption>Fonts and color palette.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-comfort-shatter-05.jpg" alt="">
    <figcaption>Design elements and guidelines.</figcaption>
</figure>
<h3 id="user-flow"><a aria-hidden="true" href="#user-flow" tabindex="-1"><span class="icon icon-link"></span></a>User flow</h3>
<p>Sketching the user flow before building the final prototype.</p>
<figure>
    <img src="/blog/blog-comfort-shatter-06.jpg" alt="screenshot of mobile app with arrows showing the user flow">
    <figcaption>User flow sketch.</figcaption>
</figure>
<h2 id="final-prototype"><a aria-hidden="true" href="#final-prototype" tabindex="-1"><span class="icon icon-link"></span></a>Final prototype</h2>
<p>The final mockup with interactions before getting into development.<br>
Built with InVision Studio and InVision App. Monsters built with Adobe Illustrator.</p>
<iframe src="https://player.vimeo.com/video/293394826" width="640" height="1277" frameborder="0" allow="autoplay; fullscreen" allowfullscreen class="vimeo"></iframe>
<p><a href="https://vimeo.com/293394826">Comfort Shatter</a> from <a href="https://vimeo.com/marianabeldi">Mariana Beldi</a> on <a href="https://vimeo.com">Vimeo</a>.</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/comfort-shatter-es" data-v-5e4666ba>
      ←
      Comfort Shatter Prototipo de App
    </a></div> <div data-v-5e4666ba><a href="/posts/adding-value-to-our-clients-platform-and-brand" data-v-5e4666ba>
      Adding value to our client's platform and brand
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/comfort-shatter/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cómo hice un generador para loaders SVG con opciones Sass y SMIL]]></title>
            <link>https://holasvg.com/posts/como-hice-un-generador-para-loaders-SVG</link>
            <guid>https://holasvg.com/posts/como-hice-un-generador-para-loaders-SVG</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Cómo hice un generador para loaders SVG con opciones Sass y SMIL</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/how-i-made-a-generator-for-svg-loaders-with-sass-and-smil-options/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/como-hice-un-generador-para-loaders-SVG/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/como-hice-un-generador-para-loaders-SVG/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 November 2021</span> <h1>Cómo hice un generador para loaders SVG con opciones Sass y SMIL</h1> <p class="inner-post-subtitle">Generador loaders personalizable y gratuito</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-loaders-01.gif"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Mientras aprendía <a href="https://vuejs.org/" rel="nofollow noopener noreferrer" target="_blank">Vue.js</a>, comencé a crear herramientas web gratuitas que involucraban la exploración de SVG, ¡con el objetivo de aprender algo sobre ambos! Echemos un vistazo a una de esas herramientas: <a href="https://holasvg.com/loaders/" rel="nofollow noopener noreferrer" target="_blank">un generador que crea cargadores SVG</a> y te permite elegir entre animación SMIL o Sass, diferentes estilos, colores, formas y efectos. Incluso permite pegar un path, SVG o texto personalizado y luego descargar el SVG final, copiar el código o abrir una demostración en CodePen.</p>
<h2 id="cómo-empezó"><a href="#c%C3%B3mo-empez%C3%B3" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Cómo empezó</h2>
<p>Tres coincidencias me llevaron a construir un generador para cargadores SVG.</p>
<h3 id="coincidencia-1-el-libro-de-sarah-drasner"><a href="#coincidencia-1-el-libro-de-sarah-drasner" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coincidencia 1: el libro de Sarah Drasner</h3>
<p>La primera vez que leí sobre los bucles de Sass fue en <a href="https://www.oreilly.com/library/view/svg-animations/9781491939697/" rel="nofollow noopener noreferrer" target="_blank">*SVG Animations</a>* de Sarah Drasner. Ella muestra cómo escalonar animaciones con una función Sass (como lo hace en el Capítulo 6, "Animación de visualizaciones de datos").</p>
<p>Me inspiré en ese capítulo y en las posibilidades de los loops de Sass.</p>
<h3 id="coincidencia-2-un-gif"><a href="#coincidencia-2-un-gif" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coincidencia 2: Un GIF</h3>
<p>En ese mismo momento de la vida, me pidieron que replicara un elemento "cargador", similar al viejo clásico de Apple.</p>
<figure>
    <img src="/blog/blog-loaders-02.gif" alt="">
	<figcaption>Esta es una maqueta del cargador que me pidieron que hiciera.</figcaption>
</figure>
<p>Hice referencia al ejemplo de Sarah para que esto sucediera. Este es el código de bucle Sass que logré:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token atrule"><span class="token rule">@for</span> $i from <span class="token number">1</span> to <span class="token number">12</span></span> <span class="token punctuation">{</span>
      <span class="token selector"><span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span>#</span><span class="token punctuation">{</span>$i<span class="token punctuation">}</span><span class="token selector"><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
        <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> $i <span class="token operator">*</span> <span class="token number">0.08</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token atrule"><span class="token rule">@keyframes</span> opacityLoader</span> <span class="token punctuation">{</span>
     <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>Esto define una variable para un número (i) del 1 al 12 que aumenta el delay de la animación con cada elemento :nth-child. Fue el caso de uso perfecto para animar tantos elementos como quisiera con solo dos líneas de Sass, ahorrándome declaraciones CSS para cada uno de los delays que necesitaba. Esta es la misma animación, pero escrita en Vanilla CSS para mostrar la diferencia:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">1</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> <span class="token number">0.08</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">2</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> <span class="token number">0.16</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token selector">...

    <span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">12</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> <span class="token number">0.96</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token atrule"><span class="token rule">@keyframes</span> opacityLoader</span> <span class="token punctuation">{</span>
      <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<h3 id="coincidencia-3-una-idea"><a href="#coincidencia-3-una-idea" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coincidencia 3: Una idea</h3>
<p>Con estas cosas en mi cabeza, tuve la idea de crear una <em>galería</em> de loaders, donde cada loader esté hecho con el mismo bucle Sass. Siempre me cuesta encontrar este tipo de assets online, así que pensé que podría ser útil para otros también.</p>
<p>Ya había construido un generador de íconos antes como proyecto personal, así que [terminé construyendo un generador de loaders] (<a href="http://holasvg.com/loaders" rel="nofollow noopener noreferrer" target="_blank">http://holasvg.com/loaders</a>). ¡Avisame si encontras errores!</p>
<h2 id="un-cargador-dos-salidas"><a href="#un-cargador-dos-salidas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Un cargador, dos salidas</h2>
<p>Estaba bloqueada por mis propias habilidades de desarrolladora mientras creaba un generador que produzca el código Sass correcto. Así que decidí probar otro enfoque de animación con <a href="https://css-tricks.com/guide-svg-animations-smil/" rel="nofollow noopener noreferrer" target="_blank">SMIL animations</a>, y eso fue lo que decidí usar.</p>
<p>Pero recibí un poco de ayuda (¡gracias, ekrof!) y terminé agregando <em>ambas</em> opciones al generador. Descubrí que era un desafío hacer que ambos idiomas arrojaran el mismo resultado. De hecho, a veces producen resultados <em>diferentes</em>.</p>
<h3 id="smil-vs-csssass"><a href="#smil-vs-csssass" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>SMIL vs CSS/Sass</h3>
<p>Aprendí bastante sobre animaciones SMIL y CSS/Sass en el camino. Estos son algunos de los puntos clave que me ayudaron para hacer el generador:</p>
<ul>
<li>
<p><strong>SMIL no depende de ningún recurso externo.</strong> Anima SVG a través de atributos de presentación directamente en el SVG. Eso es algo que ni CSS ni Sass pueden hacer.</p>
</li>
<li>
<p><strong>Las animaciones SMIL se conservan cuando se usa un SVG como imagen o como imagen de fondo.</strong> Es posible agregar un bloque CSS </p><style></style>
<p></p></li>
<li>
<p><strong>Las animaciones SMIL se ven un poco más fluidas.</strong> No pude encontrar la razón de esto (si alguien tiene más información acá, ¡bienvenida!). Pensé que estaba relacionado con la aceleración de GPU, pero parece que ambos usan el mismo motor de animación.</p>
</li>
</ul>
<figura>
     <img src="/blog/cargadores-de-blog-03.gif" alt="">
<figcaption>SMIL (izquierda) y Sass (derecha)</figcaption>
</figura>
<p>Se puede notar una diferencia en el <em>encadenamiento</em> de las animaciones entre ambos idiomas:</p>
<ul>
<li>
<p>Usé additive="sum" en SMIL para agregar animaciones una tras otra. Esto asegura que cada nuevo efecto de animación evite anular la animación anterior.</p>
</li>
<li>
<p>Dicho esto, en CSS/Sass, la <a href="https://www.w3.org/TR/css-animations-1/#animation-name-property" rel="nofollow noopener noreferrer" target="_blank">W3C señala</a> que [cuando] varias animaciones intentan modificar la misma propiedad, gana la animación más cercana al final de la lista de nombres.</p>
</li>
</ul>
<p>Es por eso que el orden en que se aplican las animaciones puede cambiar el resultado en Sass.</p>
<h3 id="trabajar-con-transformaciones"><a href="#trabajar-con-transformaciones" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Trabajar con transformaciones</h3>
<p>Trabajar con transformaciones en los estilos del loader fue un gran problema. Apliqué <code>transform: rotate</code> inline a cada forma porque es una forma sencilla de colocarlas una al lado de la otra en un círculo y con una cara apuntando hacia el centro.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span><span class="token punctuation">></span></span>
    ...
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(0 50 50)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> 
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(30 50 50)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(60 50 50)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    ...
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Podría declarar un tipo en SMIL con <animate-transform> (por ejemplo, escalar o trasladar) para agregar esa transformación específica a la transformación original de cada forma:</animate-transform></p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>animateTransform</span> <span class="token attr-name">attributeName</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>transform<span class="token punctuation">"</span></span> 
    <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>translate<span class="token punctuation">"</span></span>
    <span class="token attr-name">additive</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sum<span class="token punctuation">"</span></span> 
    <span class="token attr-name">dur</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1s<span class="token punctuation">"</span></span>
    <span class="token attr-name">:begin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`${i * 0.08}s`<span class="token punctuation">"</span></span>
    <span class="token attr-name">repeatCount</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>indefinite<span class="token punctuation">"</span></span>
    <span class="token attr-name">from</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0<span class="token punctuation">"</span></span>
    <span class="token attr-name">to</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
  <span class="token punctuation">/></span></span>
</code></pre></div>
<p>Pero en cambio, la transformación en CSS anulaba cualquier transformación anterior aplicada al SVG inline. En otras palabras, la posición original se restableció a 0 y mostró un resultado muy diferente al producido por SMIL. Eso significaba que las animaciones terminaron luciendo idénticas sin importar qué.</p>
<figure>
    <img src="/blog/blog-loaders-04.gif" alt="">
</figure>
<p>La solución (no muy bonita) para hacer que Sass sea similar a SMIL fue colocar cada forma dentro de un elemento de grupo (<g>) y aplicar la rotación inline a los grupos y la animación a las formas. De esta manera, la transformación inline no se ve afectada por la animación.</g></p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span><span class="token punctuation">></span></span>
    ... 
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(0 50 50)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(30 50 50)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
    ...
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Ahora ambos lenguajes tienen un resultado muy similar.</p>
<h2 id="la-tecnología-que-utilicé"><a href="#la-tecnolog%C3%ADa-que-utilic%C3%A9" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>La tecnología que utilicé</h2>
<p>Usé Vue.js y Nuxt.js. Ambos tienen una excelente documentación, pero hay razones más específicas por las que los elijo.</p>
<p>Me gusta Vue por muchas razones:</p>
<ul>
<li>
<p>Vue encapsula HTML, CSS y JavaScript como un "[componente de archivo único] (<a href="https://github.com/marianabeldi/holasvg-loaders/blob/main/components/Codes.vue" rel="nofollow noopener noreferrer" target="_blank">https://github.com/marianabeldi/holasvg-loaders/blob/main/components/Codes.vue</a>)" donde vive todo el código en un solo archivo con el que es más fácil trabajar.</p>
</li>
<li>
<p>La forma en que Vue vincula y actualiza dinámicamente los atributos HTML o SVG es muy intuitiva.</p>
</li>
<li>
<p>HTML y SVG no requieren transformaciones adicionales (como hacer que el código sea compatible con JSX).</p>
</li>
</ul>
<p>En cuanto a Nuxt:</p>
<ul>
<li>
<p>Tiene un modelo rápido que lo ayuda a concentrarse en el desarrollo en lugar de la configuración.</p>
</li>
<li>
<p>Hay rytas automáticas y admite componentes de importación automática.</p>
</li>
<li>
<p>Es una buena estructura de proyecto con páginas, componentes y diseños.</p>
</li>
<li>
<p>Es más fácil optimizar para SEO, gracias a las metatags.</p>
</li>
</ul>
<h2 id="veamos-algunos-loaders-de-ejemplo"><a href="#veamos-algunos-loaders-de-ejemplo" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Veamos algunos loaders de ejemplo</h2>
<p>Lo que me gusta del resultado final es no hay una sola forma de usarlo. Debido a que genera tanto SMIL como CSS/Sass, hay varias formas de integrar un loader en tu propio proyecto.</p>
<h3 id="descarga-el-smil-svg-y-utilízalo-como-imagen-de-fondo-en-css"><a href="#descarga-el-smil-svg-y-util%C3%ADzalo-como-imagen-de-fondo-en-css" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Descarga el SMIL SVG y utilízalo como imagen de fondo en CSS</h3>
<p>Como mencioné anteriormente, las características de SMIL se conservan cuando se usa un SVG como archivo de imagen de fondo. Entonces, simplemente hay que descargar el SVG del generador, subirlo al servidor y hacer referencia a él en CSS como imagen de fondo.</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader SMIL - Background image CSS" src="https://codepen.io/marianab/embed/GRmpyGd?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/GRmpyGd">
  Hola SVG Loader SMIL - Background image CSS&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>De manera similar, podríamos usar el SVG como imagen de fondo de un pseudo-elemento:</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader - SMILL + CSS + pseudo element" src="https://codepen.io/marianab/embed/bGWqLqw?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/bGWqLqw">
  Hola SVG Loader - SMILL + CSS + pseudo element&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="coloque-el-svg-directamente-en-html"><a href="#coloque-el-svg-directamente-en-html" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coloque el SVG directamente en HTML</h3>
<p>El SVG no tiene que ser una imagen de fondo. Es solo código, después de todo. Eso significa que simplemente podemos colocar el código del generador en nuestro propio código y dejar que SMIL haga lo suyo.</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader SMIL - Inline HTML" src="https://codepen.io/marianab/embed/PopvqEx?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/PopvqEx">
  Hola SVG Loader SMIL - Inline HTML&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="usar-un-loop-sass-en-el-svg-inline"><a href="#usar-un-loop-sass-en-el-svg-inline" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Usar un loop Sass en el SVG inline</h3>
<p>Esto es lo que originalmente me inspiró, pero me encontré con algunos obstáculos. En lugar de escribir declaraciones CSS para cada animación, podemos usar el loop Sass producido por el generador. El loop apunta a una clase .loader que ya se aplicó al SVG generado. Entonces, una vez que Sass se compila en CSS, obtenemos una buena animación giratoria.</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader SASS" src="https://codepen.io/marianab/embed/dyWvdbQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/dyWvdbQ">
  Hola SVG Loader SASS&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="todavía-estoy-trabajando-en-esto"><a href="#todav%C3%ADa-estoy-trabajando-en-esto" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Todavía estoy trabajando en esto</h2>
<p>Mi parte favorita del generador es la opción personalizada donde puedes agregar texto, emojis o cualquier elemento SVG a la mezcla:</p>
<figure>
    <img src="/blog/blog-loaders-04.gif" alt="">
	<figcaption>Texto personalizado, emoji y SVG</figcaption>
</figure>
<p>Lo que me gustaría hacer es agregar una tercera opción para que los estilos tengan solo un elemento en el que pueda trabajar y permitir resultados más simples.</p>
<p>El desafío de este proyecto es agregar opción de valores personalizados para muchas cosas, como duración, dirección, distancia y grados. Otro desafío para mí personalmente es familiarizarme más con Vue porque necesitaría limpiar el código desordenado. Dicho esto, el <a href="https://github.com/marianabeldi/holasvg-loaders" rel="nofollow noopener noreferrer" target="_blank">proyecto es de código abierto</a>, ¡y las solicitudes para hacer cambios son bienvenidas! Sean librs de enviar sugerencias, comentarios o incluso recomendaciones de cursos de Vue, especialmente aquellos relacionados con SVG o la creación de generadores.</p>
<p>Todo esto comenzó con un loop de Sass que leí en un libro. No es el código más limpio del mundo, pero estoy impresionada por el poder de las animaciones SMIL. Recomiendo encarecidamente <a href="https://css-tricks.com/guide-svg-animations-smil/" rel="nofollow noopener noreferrer" target="_blank">la guía de Sarah Soueidan</a> para profundizar en lo que SMIL es capaz de hacer.</p>
<p>Si tienen curiosidad acerca de la seguridad de SMIL, es por una buena razón. Hubo un momento en que Chrome iba a deprecar por completo SMIL (<a href="https://developer.mozilla.org/en-US/docs/Web/SVG/SVG_animation_with_SMIL" rel="nofollow noopener noreferrer" target="_blank">ver la nota de apertura en MDN</a>). Pero lo suspendiaron y no se volviío a hablar de esto (aparentemente).</p>
<p><a href="https://caniuse.com/?search=SMIL" rel="nofollow noopener noreferrer" target="_blank">¿Puedo usar SMIL</a>?</p>
<blockquote>
<p>Este artículo se publicó por primera vez en <a href="https://css-tricks.com/how-i-made-a-generator-for-svg-loaders-with-sass-and-smil-options/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> . Gracias a las ediciones de <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> y <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/un-stand-virtual-con-SVG" data-v-5e4666ba>
      ←
      Un stand virtual con SVG
    </a></div> <div data-v-5e4666ba><a href="/posts/how-I-made-a-generator-for-SVG-loaders" data-v-5e4666ba>
      How I Made a Generator for SVG Loaders With Sass and SMIL Options
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/como-hice-un-generador-para-loaders-SVG/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cómo simplificar código SVG usando formas básicas]]></title>
            <link>https://holasvg.com/posts/como-simplificar-código-SVG-usando-formas-basicas</link>
            <guid>https://holasvg.com/posts/como-simplificar-código-SVG-usando-formas-basicas</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Cómo simplificar código SVG usando formas básicas</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/how-to-simplify-svg-code-using-basic-shapes/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/como-simplificar-c%C3%B3digo-SVG-usando-formas-basicas/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/como-simplificar-c%C3%B3digo-SVG-usando-formas-basicas/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">29 September 2020</span> <h1>Cómo simplificar código SVG usando formas básicas</h1> <p class="inner-post-subtitle">Iconos SVG DIY</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-DIY-svg-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><blockquote>
<p><em>Lea la versión en chino <a href="https://leetcode-cn.com/circle/discuss/SuKP3m/" rel="nofollow noopener noreferrer" target="_blank">aquí</a>. Traducido por Rotten orange 腐烂的橘子</em></p>
</blockquote>
<div clase="separador" aria-hidden="verdadero">***</div>
<p>Hay diferentes formas de trabajar con íconos, pero la mejor solución siempre incluye SVG, ya sea inline o vinculado como un archivo. A veces, los íconos que descargamos (o los que creamos con un software de dibujo) tienen mucho <strong>código innecesario</strong> que, si lo usamos en línea, hace que nuestro documento sea más largo para desplazarse, incómodo para trabajar y un poco más pesado. .</p>
<p>Podemos solucionar esto <a href="http://localhost:56203/posts/going-beyond-automatic-compression-with-use-element" rel="nofollow noopener noreferrer" target="_blank">reutilizando fragmentos de código con el elemento <code>&lt;use></code></a> o [aplicar variables nativas a administre nuestros estilos SVG] (<a href="http://localhost:56203/posts/use-and-reuse-everything-in-svg-even-animations" rel="nofollow noopener noreferrer" target="_blank">http://localhost:56203/posts/use-and-reuse-everything-in-svg-even-animations</a>) desde un solo lugar.</p>
<p>Acá quiero enfocarme en una perspectiva diferente: <strong>cómo hacer las mismas figuras con menos código</strong> usando formas básicas. Y obtener los beneficios de íconos más pequeños, controlables y semánticos en nuestros proyectos sin sacrificar la calidad o los cambios visuales. Revisaré diferentes ejemplos que exploran el código de los íconos de uso común y cómo podemos volver a dibujarlos usando algunas de las formas SVG más fáciles que podemos hacer.</p>
<p>Estos son los iconos en los que trabajaremos:</p>
<figure>
    <img src="/blog/blog-DIY-svg-02.png" alt="svg icons">
    <figcaption>Iconos de cruz, reloj y sobre.</figcaption>
</figure>
<p>Veamos las formas básicas que podemos usar para hacer que el código sea pequeño y simple.</p>
<blockquote>
<p><em><strong>Psssst!</strong></em> <a href="https://holasvg.com/icons" rel="nofollow noopener noreferrer" target="_blank">¡Aquí hay una lista más larga de íconos simples que creé en holasvg.com!</a> Después de este artículo, podran cómo modificarlos y hacerlos suyos.</p>
</blockquote>
<h2 id="construyendo-un-icono-de-cerrar-con-el-elemento-line"><a href="#construyendo-un-icono-de-cerrar-con-el-elemento-line" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Construyendo un icono de cerrar con el elemento <code>&lt;line></code></h2>
<p>Este es el código para el icono de cerrar o cruz que se descargó de <a href="https://flaticon.com/" rel="nofollow noopener noreferrer" target="_blank">flaticon.com</a> y lo creó [pixel-perfect](<a href="https://www.flaticon.com/authors/" rel="nofollow noopener noreferrer" target="_blank">https://www.flaticon.com/authors/</a> pixel perfect):</p>
<iframe width="100%" height="300" scrolling="no" title="Cross icon by Pixel Perfect" src="https://codepen.io/marianab/embed/gOPJOjJ?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/gOPJOjJ'>Cross icon by Pixel Perfect&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>En este ejemplo, todo sucede dentro de <code>&lt;path></code> con muchos comandos y parámetros en el atributo de datos <code>d</code>. Lo que hace este SVG es trazar la forma desde sus bordes.</p>
<figure>
    <img src="/blog/blog-DIY-svg-03.gif" alt="">
    <figcaption>Una demostración rápida utilizando <a target="_blank" href="https://mavo.io/demos/svgpath/">mavo.io</a></figcaption>
</figure>
<p>Si están familiarizados con Illustrator, esto es el equivalente a dibujar dos líneas separadas, convertirlas en forma y luego combinarlas con el pathfinder para crear una forma compuesta.</p>
<figure>
    <img src="/blog/blog-DIY-svg-04.gif" alt="">
    <figcaption>Convertir dos líneas en una forma compuesta en Illustrator.</figcaption>
</figure>
<p>El elemento <code>&lt;path></code> nos permite dibujar formas complejas, pero en este caso, podemos crear la misma figura con dos líneas, manteniendo la misma apariencia:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 50 50<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">overflow</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>visible<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Empezamos definiendo un <code>viewBox</code> que va de 0,0 a 50,50. Pueden elegir las dimensiones que prefieran; el SVG siempre se escalará bien a cualquier ancho y alto que se defina. Para facilitar las cosas, en este caso, también definí un ancho y alto en línea de 50 unidades, lo que evita cálculos adicionales en el dibujo.</p>
<p>Para usar el elemento <code>&lt;línea></code>, declaramos las coordenadas del primer punto de la línea y las coordenadas de su último punto. En este caso específico, empezamos desde <code>x=0 y=0</code> y terminamos en <code>x=50 y=50</code>.</p>
<figure>
    <img src="/blog/blog-DIY-svg-05.png" alt="">
    <figcaption>Cuadrícula del sistema de coordenadas.</figcaption>
</figure>
<p>Así es como se ve en el código:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>La segunda línea comenzará desde <code>x=50 y=0</code> y terminará en <code>x=0 y=50</code>:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>Un trazo SVG no tiene un color por defecto, por eso agregamos el valor <code>negro</code> en el atributo <code>stroke</code>. También le dimos al atributo 'stroke-width' un ancho de 10 unidades y a 'stroke-linecap' un valor 'round' para replicar esas esquinas redondeadas del diseño original. Estos atributos se agregaron directamente a la etiqueta <code>&lt;svg></code> para que ambas líneas los hereden.</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">...</span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">...</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Ahora que el trazo es 10 unidades más grande que su tamaño predeterminado de 1 unidad, la línea podría quedar recortada por <code>viewBox</code>. Podemos mover los puntos 10 unidades dentro de <code>viewBox</code> o agregar <code>overflow=visible</code> a los estilos.</p>
<p>Los valores que son iguales a 0 se pueden eliminar, ya que 0 es el valor predeterminado. Eso significa que las dos líneas terminan con dos líneas de código muy pequeñas:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>line</span> <span class="token attr-name">x1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">y2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>Con solo cambiar <code>&lt;path></code> a <code>&lt;line></code>, no solo creamos un archivo SVG más pequeño, sino también un fragmento de código más semántico y controlable que hace que cualquier mantenimiento futuro sea mucho más fácil. Y el resultado visual es exactamente igual que el original.</p>
<iframe width="100%" height="300" scrolling="no" title="Cross icon with basic shapes" src="https://codepen.io/marianab/embed/PoZvoxM?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/PoZvoxM'>Cross icon with basic shapes&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Misma cruz, diferente código.</p>
<h2 id="construyendo-un-icono-de-reloj-con-los-elementos-circle-y-path"><a href="#construyendo-un-icono-de-reloj-con-los-elementos-circle-y-path" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Construyendo un icono de reloj con los elementos <code>&lt;circle></code> y <code>&lt;path></code></h2>
<p>Tomé este ejemplo de un icono de reloj creado por <a href="https://thenounproject.com/barracuda/" rel="nofollow noopener noreferrer" target="_blank">barracuda</a> de <a href="https://thenounproject.com/" rel="nofollow noopener noreferrer" target="_blank">The Noun Project</a>:</p>
<iframe width="100%" height="300" scrolling="no" title="Clock icon from Noun Project " src="https://codepen.io/marianab/embed/qBbzLZo?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/qBbzLZo'>Clock icon from Noun Project &lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Esta forma también se dibujó con <code>&lt;path></code>, pero también tenemos muchos espacios de nombres e instrucciones XML relacionadas con el software utilizado y la licencia del archivo que podemos eliminar sin afectar el SVG. ¿Pueden adivinar qué editor de ilustraciones se usó para crear el icono?</p>
<p>Recreemos este desde cero usando un círculo y un path con comandos más simples. Nuevamente, debemos comenzar con un <code>viewBox</code>, esta vez de 0,0 a 100,100, y con un ancho y alto que coincidan con esas unidades.</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 100 100<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M50 25V50 H75<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Mantenemos los mismos estilos que el ícono anterior dentro de la etiqueta <code>&lt;svg></code>. <code>fill</code> es <code>black</code> de forma predeterminada, por lo que debemos darle explícitamente un valor <code>none</code> para eliminarlo. De lo contrario, el círculo tendrá un relleno negro sólido, oscureciendo las otras formas.</p>
<p>Para dibujar el <code>&lt;circle></code> necesitamos indicar un punto central desde donde se asentará el radio. Podemos lograr eso con <code>cx</code> (centro x) y <code>cy</code> (centro y). Entonces <code>r</code> (radio) declarará qué tan grande será nuestro círculo. En este ejemplo, el radio es ligeramente más pequeño que el <code>viewBox</code>, por lo que no se recorta cuando el trazo tiene 10 unidades de ancho.</p>
<blockquote>
<p><em>¿Qué pasa con todas esas letras? Consulten la <a href="https://css-tricks.com/svg-path-syntax-illustrated-guide/" rel="nofollow noopener noreferrer" target="_blank">guía ilustrada de Chris Coyier</a> para obtener una introducción a la sintaxis SVG.</em></p>
</blockquote>
<p>Podemos usar un <code>&lt;path></code> para las manecillas del reloj porque tiene algunos comandos muy útiles y simples para dibujar. Dentro de la <code>d</code> (data) debemos comenzar con el comando <code>M</code> (mover a) seguido de las coordenadas desde donde comenzaremos a dibujar que, en este ejemplo, es 50,25 (cerca del centro superior de la círculo).</p>
<p>Después del comando <code>V</code> (vertical), solo necesitamos un valor ya que solo podemos movernos hacia arriba o hacia abajo con un número negativo o positivo. Un número positivo bajará. Lo mismo para 'H' (horizontal) seguido de un número positivo, 75, que dibujará hacia la derecha. Todos los comandos están en mayúsculas, por lo que los números que elijamos serán puntos en la cuadrícula. Si decidimos usar minúsculas (comandos relativos) los números serán la cantidad de unidades que nos movemos en una dirección y no un punto absoluto en el sistema de coordenadas.</p>
<iframe width="100%" height="300" scrolling="no" title="Clock icon with Basic Shapes" src="https://codepen.io/marianab/embed/PoZrXWM?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/PoZrXWM'>Clock icon with Basic Shapes&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Mismo reloj, diferente código.</p>
<h2 id="construyendo-un-icono-de-sobre-con-los-elementos-rect-y-polyline"><a href="#construyendo-un-icono-de-sobre-con-los-elementos-rect-y-polyline" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Construyendo un icono de sobre con los elementos <code>&lt;rect></code> y <code>&lt;polyline></code></h2>
<p>Dibujé el ícono del sobre en Illustrator sin expandir las formas originales. Aquí está el código que vino de la exportación:</p>
<iframe width="100%" height="300" scrolling="no" title="Envelope SVG Icon" src="https://codepen.io/geoffgraham/embed/dyMWyKy?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/dyMWyKy'>Envelope SVG Icon&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<blockquote>
<p><em><strong>Hey!</strong></em> Illustrator ofrece algunas opciones de SVG para exportar el gráfico. Elegí Style Elements en el menú desplegable Propiedades de CSS para poder tener una etiqueta <code>&lt;styles></code> que contenga clases que podría querer mover a un archivo CSS. Pero hay diferentes formas de aplicar los estilos en SVG, por supuesto.</p>
</blockquote>
<p>¡Ya tenemos formas básicas en este código! Deseleccioné la opción Shape to Path en Illustrator, lo que ayudó mucho. Podemos optimizar esto aún más con <a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noopener noreferrer" target="_blank">SVGOMG</a> para eliminar los comentarios, las instrucciones XML y los datos innecesarios, como elementos vacíos. A partir de ahí, podemos eliminar manualmente otros extras, si es necesario.</p>
<p>Ya tenemos algo un poco más conciso:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.1<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Layer_1<span class="token punctuation">"</span></span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 310 190<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xml:</span>space</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>preserve<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token selector"><span class="token class">.st0</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span>none<span class="token punctuation">;</span><span class="token property">stroke</span><span class="token punctuation">:</span><span class="token hexcode color">#000</span><span class="token punctuation">;</span><span class="token property">stroke-width</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token property">stroke-linecap</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-linejoin</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-miterlimit</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">}</span>
  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>180<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>polyline</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">points</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5 5 155 110 305 5<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Podemos eliminar aún más cosas sin afectar la apariencia visual del sobre, incluyendo:</p>
<ul>
<li><code>version="1.1"</code> (esto ha sido <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/version" rel="nofollow noopener noreferrer" target="_blank">obsoleto</a> desde SVG 2)</li>
<li><code>id="Layer_1"</code> (esto no tiene significado ni uso)</li>
<li><code>x="0"</code> (este es un valor predeterminado)</li>
<li><code>y="0"</code> (este es un valor predeterminado)</li>
<li><code>xml:space="preserve"</code> (esto ha sido <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xml:space" rel="nofollow noopener noreferrer" target="_blank">obsoleto</a> desde SVG 2)</li>
</ul>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 310 190<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token selector"><span class="token class">.st0</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span>none<span class="token punctuation">;</span><span class="token property">stroke</span><span class="token punctuation">:</span><span class="token hexcode color">#000</span><span class="token punctuation">;</span><span class="token property">stroke-width</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token property">stroke-linecap</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-linejoin</span><span class="token punctuation">:</span>round<span class="token punctuation">;</span><span class="token property">stroke-miterlimit</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">}</span>
  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>300<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>180<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>polyline</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st0<span class="token punctuation">"</span></span> <span class="token attr-name">points</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5 5 155 110 305 5<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Podemos mover los estilos CSS a una hoja de estilo separada si queremos ser realmente agresivos.</p>
<p><code>&lt;rect></code> necesita un punto de partida desde donde extenderemos un ancho y una altura, así que usemos <code>x="5"</code> y <code>y="5"</code>, que es nuestro punto superior izquierdo. A partir de ahí, crearemos un rectángulo de 300 unidades de ancho con una altura de 180 unidades. Al igual que el icono del reloj, usaremos 5,5 como punto de partida porque tenemos un trazo de 10 unidades que se recortará si las coordenadas se encuentran en 0,0.</p>
<p><code>&lt;polyline></code> es similar a <code>&lt;line></code>, pero con una cantidad infinita de puntos que definimos, como pares de coordenadas, uno tras otro, dentro del atributo de puntos, donde el primer número del par representará <code> x</code> y el segundo será <code>y</code>. Es más fácil leer la secuencia con comas, pero se pueden reemplazar con espacios en blanco sin afectar el resultado.</p>
<iframe width="100%" height="300" scrolling="no" title="SVG Envelope Icon (Optimized)" src="https://codepen.io/geoffgraham/embed/zYqwYbX?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/zYqwYbX'>SVG Envelope Icon (Optimized)&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Mismo sobre, distinto código.</p>
<h2 id="bonus-de-formas"><a href="#bonus-de-formas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¡Bonus de formas!</h2>
<p>No incluí ejemplos de íconos que se pueden simplificar con las formas <code>&lt;polygon></code> y <code>&lt;ellipse></code>, pero acá hay una forma rápida de usarlos.</p>
<p><code>&lt;polygon></code> es lo mismo que <code>&lt;polyline></code>, solo que este elemento siempre definirá una forma cerrada. Aquí hay un ejemplo que viene [directamente de MDN] (<a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon" rel="nofollow noopener noreferrer" target="_blank">https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon</a>):</p>
<iframe width="100%" height="300" scrolling="no" title="Simple SVG Polygon (MDN)" src="https://codepen.io/geoffgraham/embed/jOqmEZd?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/jOqmEZd'>Simple SVG Polygon (MDN)&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>¿Recuerdan el círculo que dibujamos antes para el icono del reloj? Reemplacen <code>r</code> (radio) con <code>rx</code> y <code>ry</code>. Ahora tienen dos valores diferentes para el radio. Aquí hay otro [ejemplo de MDN] (<a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse" rel="nofollow noopener noreferrer" target="_blank">https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse</a>):</p>
<iframe width="100%" height="300" scrolling="no" title="Simple ellipse (MDN)" src="https://codepen.io/geoffgraham/embed/bGpWNax?height=265&theme-id=dark&default-tab=html,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/geoffgraham/pen/bGpWNax'>Simple ellipse (MDN)&lt;/a> by Geoff Graham
  (&lt;a href='https://codepen.io/geoffgraham'>@geoffgraham&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<h2 id="terminando"><a href="#terminando" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Terminando</h2>
<p>¡Cubrimos mucho acá en un corto período de tiempo! Si bien usamos ejemplos para demostrar el proceso de optimización de SVG, esto es lo que espero que se lleven de esta publicación:</p>
<ul>
<li>Recuerden que la compresión comienza con la forma en que se dibuja el SVG en el software de ilustración.</li>
<li>Usen las herramientas disponibles, como SVOMG, para comprimir SVG.</li>
<li>Eliminen los metatags innecesarios a mano, de ser necesario.</li>
<li>Reemplacen paths complejos con formas básicas.</li>
<li><code>&lt;use></code> es una excelente manera de incluir SVG en línea, así como para establecer su propia biblioteca de iconos reutilizables.</li>
</ul>
<h3 id="cuántos-iconos-se-pueden-crear-combinando-estas-formas-básicas"><a href="#cu%C3%A1ntos-iconos-se-pueden-crear-combinando-estas-formas-b%C3%A1sicas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¿Cuántos iconos se pueden crear combinando estas formas básicas?</h3>
<p><a href="https://holasvg.com/icons" rel="nofollow noopener noreferrer" target="_blank">Estoy trabajando en mi lista en holasvg.com/icons</a>, estaré subiendo constantemente más íconos y optimizaciones acá, y ahora ya saben cómo modificarlos fácilmente con solo cambiar algunos números. <strong>¡Haganlos tuyos!</strong></p>
<blockquote>
<p>Este artículo se publicó por primera vez en <a href="https://css-tricks.com/how-to-simplify-svg-code-using-basic-shapes/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> con ediciones de [Chris Coyier](https: //chriscoyier.net/) y <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a></p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/DIY-svg-icons" data-v-5e4666ba>
      ←
      How to Simplify SVG Code Using Basic Shapes
    </a></div> <div data-v-5e4666ba><a href="/posts/add-double-border-to-SVG" data-v-5e4666ba>
      How to Add a Double Border to SVG Shapes
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/como-simplificar-c%C3%B3digo-SVG-usando-formas-basicas/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SVG interactions to improve your UX with UI]]></title>
            <link>https://holasvg.com/posts/contact-form-with-animated-feedback</link>
            <guid>https://holasvg.com/posts/contact-form-with-animated-feedback</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>SVG interactions to improve your UX with UI</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/contact-form-with-animated-feedback/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/contact-form-with-animated-feedback/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">6 December 2019</span> <h1>SVG interactions to improve your UX with UI</h1> <p class="inner-post-subtitle">Contact form with animated feedback</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/js?type=posts" class="card-category"><span>#js</span></a><a href="/categories/ui?type=posts" class="card-category"><span>#ui</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-contact-form.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Animations are the best way to bring life to our websites: they help us tell stories and communicate what is happening at that moment. They naturally catch our attention so it’s important to learn how and when to apply them. If we use animations in the right way, <strong>we can improve our website’s usability</strong>, if we abuse them we can ruin the user experience.</p>
<p><strong>In this article we’ll show an example of interactive animations</strong>, the ones that appear right after the users take an action and can help them notice the results.</p>
<p>A good case for using SVG interactions are form validations. We can <strong>let the user know what is happening</strong> at the time they interact with the inputs.</p>
<figure>
  <img src="/blog/blog-contact-form-01.gif" loading="lazy" alt="">
  <figcaption>Interaction with contact form</figcaption>
</figure>
<p>In this example we need both inputs to be filled. As soon as the user types any letter the green check icon will confirm that the input is valid. This is a small interaction that we can achieve by adding the <code>required</code> HTML5 attribute to our text <code>input</code> or <code>textarea</code> like this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”text”</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”name”</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”name”</span> <span class="token attr-name">aria-required</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”true”</span> <span class="token attr-name">autocorrect</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”off”</span> <span class="token attr-name">required</span><span class="token punctuation">></span></span>
</code></pre></div>
<p><strong>In CSS</strong> we use the selector + pseudo-class: <code>input:valid</code> or <code>textarea:valid</code> with a SVG in the background that will show only when the element is valid:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">input<span class="token id">#name</span><span class="token pseudo-class">:valid</span><span class="token punctuation">,</span> textarea<span class="token pseudo-class">:valid</span></span> <span class="token punctuation">{</span>
  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token color">white</span> <span class="token function">url</span><span class="token punctuation">(</span><span class="token property">‘data</span><span class="token punctuation">:</span>image/svg+xml<span class="token punctuation">,</span>\
  &lt;svg xmlns=<span class="token string">"http://www.w3.org/2000/svg"</span> width=”<span class="token number">26</span><span class="token string">" height=”26"</span>>\
  &lt;circle cx=”<span class="token number">13</span><span class="token string">" cy=”13"</span> r=”<span class="token number">13</span><span class="token string">" fill=”%23abedd8"</span>/>\
  &lt;path fill=”none” stroke=”<span class="token color">white</span>” stroke-width=”<span class="token number">2</span><span class="token string">" d=”M5 15.2l5 5 10–12"</span>/>\
  &lt;/svg>’<span class="token punctuation">)</span> no-repeat <span class="token number">98</span><span class="token unit">%</span> <span class="token number">5</span><span class="token unit">px</span><span class="token punctuation">;</span>
  <span class="token property">border</span><span class="token punctuation">:</span> <span class="token number">3</span><span class="token unit">px</span> solid $<span class="token color">lightgreen</span><span class="token punctuation">;</span>
  <span class="token property">transition</span><span class="token punctuation">:</span> background ease <span class="token number">0.2</span><span class="token unit">s</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div>
<p>When adding an inline SVG in CSS is important to use the namespace <code>xmlns=”http://www.w3.org/2000/svg"</code> or the image won’t be displayed.</p>
<p>The transition of the background will make the SVG move from its initial position to 98% to the right, as defined in the background shorthand in CSS.</p>
<p><strong>In JavaScript</strong> we can check those validations and add a class to the form (and the SVGs) when both fields are completed, and another class if at least one input is empty. Each class will bind to a CSS animation: one will make the form shake and the envelop fall out of the <em>Send</em> button; the other one will make the envelop fly directly to the mailbox and the red flag will be up.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-javascript"><code><span class="token dom variable">document</span><span class="token punctuation">.</span><span class="token method function property-access">getElementById</span><span class="token punctuation">(</span>‘sendBtn’<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">addEventListener</span><span class="token punctuation">(</span>‘click’<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 
 <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>submitName<span class="token punctuation">[</span>‘<span class="token number">0</span>’<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token property-access">validity</span><span class="token punctuation">.</span><span class="token property-access">valid</span> <span class="token operator">&&</span> submitText<span class="token punctuation">[</span>‘<span class="token number">0</span>’<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token property-access">validity</span><span class="token punctuation">.</span><span class="token property-access">valid</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
 e<span class="token punctuation">.</span><span class="token method function property-access">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  message<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">remove</span><span class="token punctuation">(</span>‘not<span class="token operator">-</span>active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
  message<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
  mailbox<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
 <span class="token keyword control-flow">else</span> <span class="token punctuation">{</span>
  message<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘not<span class="token operator">-</span>active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
  formshake<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<h3 id="here-is-the-complete-code"><a aria-hidden="true" href="#here-is-the-complete-code" tabindex="-1"><span class="icon icon-link"></span></a>Here is the complete code:</h3>
<iframe width="100%" height="300" scrolling="no" title="Contact form with feedback animation" src="https://codepen.io/marianab/embed/xywxNg?height=265&theme-id=default&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/xywxNg'>Contact form with feedback animation&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/leniolabs-rediseno-de-marca-y-web" data-v-5e4666ba>
      ←
      Leniolabs rediseño de marca y web
    </a></div> <div data-v-5e4666ba><a href="/posts/formulario-de-contacto-con-animaciones" data-v-5e4666ba>
      Interacciones SVG para mejorar tu UX con UI
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/contact-form-with-animated-feedback/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dominar el atributo de SVG stroke-miterlimit]]></title>
            <link>https://holasvg.com/posts/dominar-el-atributo-SVG-stroke-miterlimit</link>
            <guid>https://holasvg.com/posts/dominar-el-atributo-SVG-stroke-miterlimit</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Dominar el atributo de SVG stroke-miterlimit</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/mastering-svgs-stroke-miterlimit-attribute/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/dominar-el-atributo-SVG-stroke-miterlimit/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/dominar-el-atributo-SVG-stroke-miterlimit/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 June 2022</span> <h1>Dominar el atributo de SVG stroke-miterlimit</h1> <p class="inner-post-subtitle">Un atributo SVG pasado por alto</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-miterlimit-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>SVG tiene este atributo de presentación <code>stroke-miterlimit</code>. Probablemente lo hayan visto al exportar un SVG desde un programa de edición de gráficos, o tal vez descubran que pueden eliminarlo sin notar ningún cambio en la apariencia visual.</p>
<p>Después de una buena cantidad de investigación, una de las primeras cosas que descubrí es que el atributo funciona junto con <code>stroke-linejoin</code>, y les mostraré cómo, además de muchas otras cosas, aprendí sobre este interesante (y posiblemente olvidado) atributo SVG.</p>
<p>##TLDR;</p>
<p><code>stroke-miterlimit</code> depende de <code>stroke-linejoin</code>: si usamos <code>round</code> o <code>bevel</code> para las uniones, entonces no hay necesidad de declarar <code>stroke-miterlimit</code>. Pero si usamos <code>miter</code> en su lugar, aún podemos eliminarlo y tal vez el valor predeterminado sea suficiente. Tengan en cuenta que muchos editores de software gráfico agregarán este atributo incluso cuando no sea necesario.</p>
<h2 id="qué-es-stroke-linejoin"><a href="#qu%C3%A9-es-stroke-linejoin" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¿Qué es <code>stroke-linejoin</code>?</h2>
<p>Sé que en realidad estamos aquí para hablar sobre <code>stroke-miterlimit</code>, pero quiero comenzar con <code>stroke-linejoin</code> debido a funcionan muy juntos. Esta es la definición de <code>stroke-linejoin</code> extraída directamente del SVG Working Group (SVGWG):</p>
<blockquote>
<p><code>stroke-linejoin</code> especifica la forma que se utilizará en las esquinas de los paths o formas básicas cuando se trazan.</p>
</blockquote>
<p>Esto significa que <strong>podemos definir cómo se ve la esquina cuando dos líneas se encuentran en un punto</strong>. Y este atributo acepta cinco valores posibles, aunque dos de ellos <a href="https://github.com/w3c/svgwg/issues/592" rel="nofollow noopener noreferrer" target="_blank">no tienen implementación de navegador</a> [](<a href="https://github.com/w3c/svgwg/" rel="nofollow noopener noreferrer" target="_blank">https://github.com/w3c/svgwg/</a> issues/592) y están <a href="https://svgwg.org/svg2-draft/painting.html#issue592" rel="nofollow noopener noreferrer" target="_blank">identificados por la especificación como en riesgo de ser deprecados</a>. Por lo tanto, presentaré brevemente los tres valores admitidos que acepta el atributo.</p>
<p><strong><code>miter</code> es el valor predeterminado</strong> y resulta que es el más importante de los tres que estamos viendo. Si no declaramos explícitamente <code>stroke-linejoin</code> en el código SVG, entonces se usa <code>miter</code> para dar forma a la esquina de un path. Sabemos que una unión se establece en "inglete" cuando ambos bordes se encuentran en un ángulo agudo.</p>
<p>Pero también podemos elegir "redondo", que suaviza los bordes con, claro, esquinas redondeadas.</p>
<p>Mientras tanto, el valor <code>bevel</code> produce un borde plano que parece una esquina recortada.</p>
<iframe height="300" scrolling="no" title="SVG stroke-linejoin supported values" src="https://codepen.io/marianab/embed/yLvVRbr?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/yLvVRbr">
  SVG stroke-linejoin supported values&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="qué-es-stroke-miterlimit"><a href="#qu%C3%A9-es-stroke-miterlimit" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>¿Qué es <code>stroke-miterlimit</code>?</h2>
<p>Bien, ahora que sabemos qué es <code>stroke-linejoin</code>, volvamos al tema que nos ocupa y seleccionemos la definición de <code>stroke-miterlimit</code> del libro [Using SVG with CSS3 and HTML5](<a href="https://www" rel="nofollow noopener noreferrer" target="_blank">https://www</a> .oreilly.com/library/view/using-svg-with/9781491921968/):</p>
<blockquote>
<p>[…] en esquinas realmente cerradas, tienes que extender el trazo por una distancia considerable, antes de que los dos bordes se encuentren. Por esa razón, existe una propiedad secundaria: <code>stroke-miterlimit</code>. Define hasta dónde puede extender el punto al crear una esquina de inglete.</p>
</blockquote>
<p>En otras palabras, <code>stroke-miterlimit</code> establece qué tan lejos va el trazo de los bordes antes de que puedan encontrarse en un punto. Y solo cuando <code>stroke-linejoin</code> es <code>miter</code>.</p>
<figure>
    <img src="/blog/blog-miterlimit-02.png" alt="">
    <figcaption>Miter join with miter limit in grey.</figcaption>
</figure>
<p>Por lo tanto, el valor de <code>stroke-miterlimit</code> puede ser cualquier número entero positivo, donde <code>4</code> es el valor predeterminado. Cuanto más alto sea el valor, más lejos podrá ir la forma de la esquina.</p>
<h2 id="cómo-trabajan-juntos"><a href="#c%C3%B3mo-trabajan-juntos" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Cómo trabajan juntos</h2>
<p>Probablemente ahora tenga una buena comprensión conceptual de cómo <code>stroke-linejoin</code> y <code>stroke-miterlimit</code> funcionan juntos. Pero dependiendo del valor de <code>stroke-miterlimit</code>, es posible que obtengas algunos resultados aparentemente extravagantes.</p>
<p>Caso en cuestión: si 'stroke-linejoin' se establece en 'miter', en realidad puede terminar pareciéndose al valor de 'bevel' cuando el límite de inglete es demasiado bajo. <a href="https://svgwg.org/svg2-draft/painting.html#LineJoin" rel="nofollow noopener noreferrer" target="_blank">Acá está la especificación nuevamente</a> para ayudarnos a entender por qué:</p>
<blockquote>
<p>Si la longitud del inglete dividida por el ancho del trazo supera el stroke-miterlimit, [el valor de inglete] se convierte en un bisel (bevel).</p>
</blockquote>
<p>Entonces, matemáticamente podríamos decir que esto:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code>[longitud de inglete] / [ancho de trazo (o stroke)] > [límite de inglete (o stroke-miterlimit)] = inglete (miter)
[longitud de inglete] / [ancho de traza (o stroke)] &lt; [límite de inglete (o stroke-miterlimit)l (bevel)
</code></pre></div>
<p>Eso tiene sentido, no? Si el inglete no puede exceder el ancho del trazo, entonces debe ser un borde plano. De lo contrario, el miter puede crecer y formar una punta.</p>
<p>A veces hay que ver para creer, así que acá está Ana Tudor con una maravillosa demostración que muestra cómo el valor <code>stroke-miterlimit</code> afecta el <code>stroke-linejoin</code> de un SVG:</p>
<iframe height="300" scrolling="no" title="stroke-miterlimit" src="https://codepen.io/thebabydino/embed/GJEYbO?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/thebabydino/pen/GJEYbO">
  stroke-miterlimit&lt;/a> by Ana Tudor (&lt;a href="https://codepen.io/thebabydino">@thebabydino&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="establecer-miter-limits-en-aplicaciones-de-diseño"><a href="#establecer-miter-limits-en-aplicaciones-de-dise%C3%B1o" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Establecer miter limits en aplicaciones de diseño</h2>
<p>¿Sabían que las uniones en inglete y los límites están disponibles en muchas de las aplicaciones de diseño que usamos en nuestro trabajo diario? Acá es donde encontrarlos en Illustrator, Figma e Inkscape.</p>
<h3 id="establecer-stroke-miterlimit-en-adobe-illustrator"><a href="#establecer-stroke-miterlimit-en-adobe-illustrator" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Establecer stroke-miterlimit en Adobe Illustrator</h3>
<p>Illustrator tiene una forma de modificar el valor de inglete al configurar el trazo de una ruta. Puede encontrarlo en la configuración de "stroke" en un path. Observen cómo, fiel a la especificación, solo podemos establecer un valor para el "Límite" cuando la "Esquina" del path se establece en "miter join".</p>
<figure>
    <img src="/blog/blog-miterlimit-03.gif" alt="">
    <figcaption>Aplicación de límite de inglete de trazo en Adobe Illustrator.</figcaption>
</figure>
<p>Un detalle es que Illustrator tiene un límite de inglete predeterminado de "10" en lugar del predeterminado "4". He notado esto cada vez que exporto el archivo SVG o copio y pego el código SVG. Eso podría ser confuso cuando abrimos el código porque ** incluso si no cambia el valor del límite de inglete, Illustrator agrega <code>stroke-miterlimit="10"</code> donde podría esperar <code>4</code> o quizás no <code>stroke-miterlimit</code> en absoluto.**</p>
<p>Y eso es cierto incluso si elegimos un valor diferente de <code>stroke-linejoin</code> que no sea "Miter Join". Acá está el código que obtuve al exportar un SVG con <code>stroke-linejoin="round"</code>.</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 16 10<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M0 1h15.8S4.8 5.5 2 9.5<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#000<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>El <code>stroke-miterlimit</code> no debería estar allí, ya que solo funciona con <code>stroke-linejoin="miter"</code>. acá hay un par de soluciones para eso:</p>
<ul>
<li>Establezcan el valor "Límite" en 4, ya que es el valor predeterminado en SVG y es el único valor que no aparece en el código.</li>
<li>Usen las opciones "Exportar como" o "Exportar para pantalla" en lugar de "Guardar como" o copiar y pegar los vectores directamente.</li>
</ul>
<p>Si desean que se solucione, únanse a mí y [voten a favor de la solicitud para que suceda](<a href="https://illustrator.uservoice.com/forums/333657-illustrator-desktop-feature-requests/suggestions/33947290-allow" rel="nofollow noopener noreferrer" target="_blank">https://illustrator.uservoice.com/forums/333657-illustrator-desktop-feature-requests/suggestions/33947290-allow</a> -usuarios-para-cambiar-la-configuración-predeterminada-de-inglete-li).</p>
<h3 id="establecer-stroke-miterlimit-en-figma"><a href="#establecer-stroke-miterlimit-en-figma" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Establecer stroke-miterlimit en Figma</h3>
<p>Las uniones en inglete y los límites son ligeramente diferentes en Figma. Cuando hacemos clic en el nodo de un ángulo en una forma, debajo de los tres puntos de la sección stroke, podemos encontrar un lugar para establecer la unión de una esquina. La opción "Miter angle" aparece por defecto, pero solo cuando la unión está configurada en miter:</p>
<figure>
    <img src="/blog/blog-miterlimit-04.gif" alt="">
    <figcaption>Aplicación de límite de inglete de carrera en Figma</figcaption>
</figure>
<p>Esta parte funciona de manera similar a Illustrator, excepto que Figma nos permite establecer el ángulo de inglete en unidades de grado en lugar de valores decimales. Hay algunos otros matices específicos para señalar:</p>
<ul>
<li>El ángulo es de 7,17° por defecto y no hay forma de establecer un valor más bajo. Al exportar el SVG, ese valor se convierte en <code>stroke-miterlimit='16</code>' en el código, que es diferente tanto de la especificación SVG como del valor predeterminado de Illustrator.</li>
<li>El valor máximo es 180°, y al dibujar con esta opción, la unión cambia automáticamente a bevel.</li>
<li>Al exportar con bebel join, <code>stroke-miterlimit</code> está en el código, pero mantiene el valor que se estableció cuando el miter angle estuvo activo por última vez (Illustrator hace lo mismo).</li>
<li>Al exportar el SVG con unión redonda, el path se expande y ya no tenemos un trazo, sino un path con un color de relleno.</li>
</ul>
<p>No pude encontrar una manera de evitar el código adicional que termina en el SVG exportado cuando <code>stroke-miterlimit</code> no es necesario.</p>
<h3 id="establecer-stroke-miterlimit-en-inkscape"><a href="#establecer-stroke-miterlimit-en-inkscape" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Establecer stroke-miterlimit en Inkscape</h3>
<p>Inkscape funciona exactamente de la manera en que esperaría que una aplicación de diseño administrara las uniones y los límites de inglete. Al seleccionar una unión a inglete, el valor predeterminado es <code>4</code>, exactamente lo que está en la especificación. Mejor aún, <code>stroke-miterlimit</code> se excluye del código SVG exportado cuando es el valor predeterminado.</p>
<figure>
    <img src="/blog/blog-miterlimit-05.gif" alt="">
    <figcaption>Aplicando trazo-límite de inglete en Inkscape.</figcaption>
</figure>
<p>Aún así, si exportamos cualquier ruta con bevel o round después de que se modificó el límite, el <code>stroke-miterlimit</code> volverá al código, a menos que mantengamos las 4 unidades del valor predeterminado en el cuadro Limit. Mismo truco que Illustrator.</p>
<p>Estos ejemplos funcionarán bien si elegimos la opción <strong>Guardar como → SVG optimizado</strong>. Inkscape es gratuito y de código abierto y, al final del día, tiene el código más ordenado en lo que respecta a <code>stroke-miterlimit</code> y muchas opciones para optimizar el código para exportar.</p>
<p>Pero si están más familiarizado con Illustrator (como yo), hay una solución a tener en cuenta. Figma, debido a las unidades de grado y la expansión de los trazos, se siente más distante de las especificaciones y el comportamiento esperado.</p>
<h2 id="para-cerrar"><a href="#para-cerrar" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Para cerrar</h2>
<p>Eso es lo que aprendí sobre el atributo <code>stroke-miterlimit</code> de SVG. Es otra de esas cosas fáciles de pasar por alto que podríamos cortar a ciegas, particularmente al [optimizar un archivo SVG] (<a href="https://css-tricks.com/tools-for-optimizing-svg/" rel="nofollow noopener noreferrer" target="_blank">https://css-tricks.com/tools-for-optimizing-svg/</a>). Entonces, ahora, cuando se encuentre configurando <code>stroke-miterlimit</code>, sabrán lo que hace, cómo funciona junto con <code>stroke-linejoin</code> y por qué diablos puede obtener una unión biselada al establecer un valor de límite de inglete.</p>
<blockquote>
<p>Este artículo se publicó por primera vez en <a href="https://css-tricks.com/mastering-svgs-stroke-miterlimit-attribute/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a>. Gracias a las ediciones de <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/leniolabs-rediseno-de-branding" data-v-5e4666ba>
      ←
      Leniolabs rediseño de branding
    </a></div> <div data-v-5e4666ba><a href="/posts/mastering-SVGs-stroke-miterlimit-Attribute" data-v-5e4666ba>
      Mastering SVG's stroke-miterlimit Attribute
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/dominar-el-atributo-SVG-stroke-miterlimit/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Interacciones SVG para mejorar tu UX con UI]]></title>
            <link>https://holasvg.com/posts/formulario-de-contacto-con-animaciones</link>
            <guid>https://holasvg.com/posts/formulario-de-contacto-con-animaciones</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Interacciones SVG para mejorar tu UX con UI</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/formulario-de-contacto-con-animaciones/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/formulario-de-contacto-con-animaciones/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">6 December 2019</span> <h1>Interacciones SVG para mejorar tu UX con UI</h1> <p class="inner-post-subtitle">Formulario de contacto con comentarios animados</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/js?type=posts" class="card-category"><span>#js</span></a><a href="/categories/ui?type=posts" class="card-category"><span>#ui</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-contact-form.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Las animaciones son la mejor manera de darle vida a nuestros sitios web: nos ayudan a contar historias y comunicar lo que está pasando en ese momento. Llaman naturalmente nuestra atención, por lo que es importante aprender cómo y cuándo aplicarlos. Si usamos las animaciones de la forma correcta, <strong>podemos mejorar la usabilidad de nuestro sitio web</strong>, si abusamos de ellas podemos arruinar la experiencia del usuario.</p>
<p><strong>En este artículo voy a mostrar un ejemplo de animaciones interactivas</strong>, las que aparecen justo después de que los usuarios realizan una acción y pueden ayudarlos a notar los resultados.</p>
<p>Un buen caso para usar interacciones SVG son las validaciones de formularios. Podemos <strong>hacerle saber al usuario lo que está sucediendo</strong> en el momento en que interactúa con las entradas.</p>
<figure>
  <img src="/blog/blog-contact-form-01.gif" loading="lazy" alt="">
  <figcaption>Interacción con el formulario de contacto</figcaption>
</figure>
<p>En este ejemplo, necesitamos que se llenen ambos campos. Tan pronto como el usuario escriba cualquier letra, el ícono de verificación verde confirmará que la entrada es válida. Esta es una pequeña interacción que podemos lograr agregando el atributo HTML5 "required" a nuestro text "input" o "textarea" de esta manera:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”text”</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”name”</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”name”</span> <span class="token attr-name">aria-required</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”true”</span> <span class="token attr-name">autocorrect</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>”off”</span> <span class="token attr-name">required</span><span class="token punctuation">></span></span>
</code></pre></div>
<p><strong>En CSS</strong> usamos el selector + pseudo-clase: <code>input:valid</code> o <code>textarea:valid</code> con un SVG en el fondo que se mostrará solo cuando el elemento sea válido:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">input<span class="token id">#name</span><span class="token pseudo-class">:valid</span><span class="token punctuation">,</span> textarea<span class="token pseudo-class">:valid</span></span> <span class="token punctuation">{</span>
  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token color">white</span> <span class="token function">url</span><span class="token punctuation">(</span><span class="token property">‘data</span><span class="token punctuation">:</span>image/svg+xml<span class="token punctuation">,</span>\
  &lt;svg xmlns=<span class="token string">"http://www.w3.org/2000/svg"</span> width=”<span class="token number">26</span><span class="token string">" height=”26"</span>>\
  &lt;circle cx=”<span class="token number">13</span><span class="token string">" cy=”13"</span> r=”<span class="token number">13</span><span class="token string">" fill=”%23abedd8"</span>/>\
  &lt;path fill=”none” stroke=”<span class="token color">white</span>” stroke-width=”<span class="token number">2</span><span class="token string">" d=”M5 15.2l5 5 10–12"</span>/>\
  &lt;/svg>’<span class="token punctuation">)</span> no-repeat <span class="token number">98</span><span class="token unit">%</span> <span class="token number">5</span><span class="token unit">px</span><span class="token punctuation">;</span>
  <span class="token property">border</span><span class="token punctuation">:</span> <span class="token number">3</span><span class="token unit">px</span> solid $<span class="token color">lightgreen</span><span class="token punctuation">;</span>
  <span class="token property">transition</span><span class="token punctuation">:</span> background ease <span class="token number">0.2</span><span class="token unit">s</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div>
<p>Al agregar un SVG en línea en CSS, es importante usar el namespace <code>xmlns=”http://www.w3.org/2000/svg"</code> o la imagen no se mostrará.</p>
<p>La transición del fondo hará que el SVG se mueva desde su posición inicial al 98% a la derecha, como se define en el background en CSS.</p>
<p><strong>En JavaScript</strong> podemos verificar esas validaciones y agregar una clase al formulario (y los SVG) cuando ambos campos estén completos, y otra clase si al menos un campo está vacío. Cada clase se vinculará a una animación CSS: una hará que el formulario tiemble y el sobre se caiga del botón <em>Enviar</em>; la otra hará volar el sobre directamente al buzón y se levantará la bandera roja.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-javascript"><code><span class="token dom variable">document</span><span class="token punctuation">.</span><span class="token method function property-access">getElementById</span><span class="token punctuation">(</span>‘sendBtn’<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">addEventListener</span><span class="token punctuation">(</span>‘click’<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 
 <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>submitName<span class="token punctuation">[</span>‘<span class="token number">0</span>’<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token property-access">validity</span><span class="token punctuation">.</span><span class="token property-access">valid</span> <span class="token operator">&&</span> submitText<span class="token punctuation">[</span>‘<span class="token number">0</span>’<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token property-access">validity</span><span class="token punctuation">.</span><span class="token property-access">valid</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
 e<span class="token punctuation">.</span><span class="token method function property-access">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  message<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">remove</span><span class="token punctuation">(</span>‘not<span class="token operator">-</span>active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
  message<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
  mailbox<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
 <span class="token keyword control-flow">else</span> <span class="token punctuation">{</span>
  message<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘not<span class="token operator">-</span>active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
  formshake<span class="token punctuation">.</span><span class="token property-access">classList</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>‘active’<span class="token punctuation">)</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div>
<h3 id="aquí-está-el-código-completo"><a aria-hidden="true" href="#aqu%C3%AD-est%C3%A1-el-c%C3%B3digo-completo" tabindex="-1"><span class="icon icon-link"></span></a>Aquí está el código completo:</h3>
<iframe width="100%" height="300" scrolling="no" title="Contact form with feedback animation" src="https://codepen.io/marianab/embed/xywxNg?height=265&theme-id=default&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/xywxNg'>Contact form with feedback animation&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/contact-form-with-animated-feedback" data-v-5e4666ba>
      ←
      SVG interactions to improve your UX with UI
    </a></div> <div data-v-5e4666ba><a href="/posts/going-beyond-automatic-compression-with-use-element" data-v-5e4666ba>
      Going beyond automatic SVG compression with &lt;use>
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/formulario-de-contacto-con-animaciones/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Made a Generator for SVG Loaders With Sass and SMIL Options]]></title>
            <link>https://holasvg.com/posts/how-I-made-a-generator-for-SVG-loaders</link>
            <guid>https://holasvg.com/posts/how-I-made-a-generator-for-SVG-loaders</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>How I Made a Generator for SVG Loaders With Sass and SMIL Options</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/how-i-made-a-generator-for-svg-loaders-with-sass-and-smil-options/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/how-I-made-a-generator-for-SVG-loaders/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/how-I-made-a-generator-for-SVG-loaders/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 November 2021</span> <h1>How I Made a Generator for SVG Loaders With Sass and SMIL Options</h1> <p class="inner-post-subtitle">Free customizable loader generator</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-loaders-01.gif"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>While learning <a href="https://vuejs.org/" rel="nofollow noopener noreferrer" target="_blank">Vue.js</a>, I started building free web tools that involved the exploration of SVG, with the goal of learning something about both! Let’s take a look at one of those tools: <a href="https://holasvg.com/loaders/" rel="nofollow noopener noreferrer" target="_blank">a generator that makes SVG loaders</a> and lets you choose between SMIL or Sass animation, different styles, colors, shapes, and effects. It even lets you paste in a custom path or text, and then download the final SVG, copy the code, or open a demo over at CodePen.</p>
<h2 id="how-it-started"><a href="#how-it-started" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>How it started</h2>
<p>Three coincidences led me to build a generator for SVG loaders.</p>
<h3 id="coincidence-1-sarah-drasners-book"><a href="#coincidence-1-sarah-drasners-book" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coincidence 1: Sarah Drasner’s book</h3>
<p>The first time I read about Sass loops was in Sarah Drasner’s <a href="https://www.oreilly.com/library/view/svg-animations/9781491939697/" rel="nofollow noopener noreferrer" target="_blank">*SVG Animations</a>*. She shows how to stagger animations with a Sass function (like the does in Chapter 6, “Animating Data Visualizations”).</p>
<p>I was inspired by that chapter and the possibilities of Sass loops.</p>
<h3 id="coincidence-2-a-gif"><a href="#coincidence-2-a-gif" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coincidence 2: A GIF</h3>
<p>At that same point in life, I was asked to replicate a “loader” element, similar to Apple’s old classic.</p>
<figure>
    <img src="/blog/blog-loaders-02.gif" alt="">
	<figcaption>This is a mockup of the loader I was asked to make.</figcaption>
</figure>
<p>I referenced Sarah’s example to make it happen. This is the Sass loop code I landed on:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token atrule"><span class="token rule">@for</span> $i from <span class="token number">1</span> to <span class="token number">12</span></span> <span class="token punctuation">{</span>
      <span class="token selector"><span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span>#</span><span class="token punctuation">{</span>$i<span class="token punctuation">}</span><span class="token selector"><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
        <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> $i <span class="token operator">*</span> <span class="token number">0.08</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token atrule"><span class="token rule">@keyframes</span> opacityLoader</span> <span class="token punctuation">{</span>
     <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<p>This defines a variable for a number (i) from 1 to 12 that increases the delay of the animation with every :nth-child element. It was the perfect use case to animate as many elements as I wanted with only two lines of Sass, saving me CSS declarations for each of the delays I needed. This is the same animation, but written in vanilla CSS to show the difference:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code>    <span class="token selector"><span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">1</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> <span class="token number">0.08</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token selector"><span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">2</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> <span class="token number">0.16</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token selector">...

    <span class="token class">.loader</span><span class="token pseudo-class">:nth-of-type</span><span class="token punctuation">(</span><span class="token n-th"><span class="token number">12</span></span><span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
      <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token unit">s</span> <span class="token number">0.96</span><span class="token unit">s</span> opacityLoader infinite<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token atrule"><span class="token rule">@keyframes</span> opacityLoader</span> <span class="token punctuation">{</span>
      <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">opacity</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre></div>
<h3 id="coincidence-3-an-idea"><a href="#coincidence-3-an-idea" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Coincidence 3: An idea</h3>
<p>With these things going on in my head, I had an idea for a <em>gallery</em> of loaders, where each loader is made from the same Sass loop. I always struggle to find these kinds of things online, so I thought it might be useful for others, not to mention myself.</p>
<p>I had already built this kind of thing before as a personal project, so <a href="http://holasvg.com/loaders" rel="nofollow noopener noreferrer" target="_blank">I ended up building a loader generator</a>. Let me know if you find bugs in it!</p>
<h2 id="one-loader-two-outputs"><a href="#one-loader-two-outputs" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>One loader, two outputs</h2>
<p>I was blocked by my own developer skills while creating a generator that produces the right Sass output. I decided to try another animation approach with <a href="https://css-tricks.com/guide-svg-animations-smil/" rel="nofollow noopener noreferrer" target="_blank">SMIL animations</a>, and that’s what I wound up deciding to use.</p>
<p>But then I received some help (thanks, ekrof!) and got Sass to work after all.</p>
<p>So, I ended up adding <em>both</em> options to the generator. I found it was a challenge to make both languages return the same result. In fact, they sometimes produce <em>different</em> results.</p>
<h3 id="smil-vs-csssass"><a href="#smil-vs-csssass" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>SMIL vs. CSS/Sass</h3>
<p>I learned quite a bit about SMIL and CSS/Sass animations along the way. These are a few of the key takeaways that helped me on my way to making the generator:</p>
<ul>
<li>
<p><strong>SMIL doesn’t rely on any external resources.</strong> It animates SVG via presentation attributes directly in the SVG markup. That’s something that neither CSS nor Sass can do.</p>
</li>
<li>
<p><strong>SMIL animations are preserved when an SVG is embedded as an image or as a background image.</strong> It is possible to add a CSS </p><style></style>
<p></p></li>
<li>
<p><strong>SMIL animations look a bit more fluid.</strong> I couldn’t find the reason for this (if anyone has any deeper information here, please share!). I though it was related to GPU acceleration, but it seems they both use the same animation engine.</p>
</li>
</ul>
<figure>
    <img src="/blog/blog-loaders-03.gif" alt="">
	<figcaption>SMIL (left) and Sass (right)</figcaption>
</figure>
<p>You might notice a difference in the <em>chaining</em> of the animations between both languages:</p>
<ul>
<li>
<p>I used additive="sum" in SMIL to add animations one after the other. This makes sure each new animation effect avoids overriding the previous animation.</p>
</li>
<li>
<p>That said, in CSS/Sass, the <a href="https://www.w3.org/TR/css-animations-1/#animation-name-property" rel="nofollow noopener noreferrer" target="_blank">W3C points out</a> that [when] multiple animations are attempting to modify the same property, then the animation closest to the end of the list of names wins.</p>
</li>
</ul>
<p>That’s why the order in which animations are applied might change the Sass output.</p>
<h3 id="working-with-transforms"><a href="#working-with-transforms" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Working with transforms</h3>
<p>Working with transformations in the loader’s styling was a big issue. I had applied transform: rotate inline to each shape because it’s a simple way to place them next to each other in a circle and with a face pointing toward the center.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span><span class="token punctuation">></span></span>
    ...
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(0 50 50)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> 
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(30 50 50)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(60 50 50)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    ...
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>I could declare a type in SMIL with <animate-transform> (e.g. scale or translate) to add that specific transform to the original transformation of each shape:</animate-transform></p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>animateTransform</span> <span class="token attr-name">attributeName</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>transform<span class="token punctuation">"</span></span> 
    <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>translate<span class="token punctuation">"</span></span>
    <span class="token attr-name">additive</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sum<span class="token punctuation">"</span></span> 
    <span class="token attr-name">dur</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1s<span class="token punctuation">"</span></span>
    <span class="token attr-name">:begin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`${i * 0.08}s`<span class="token punctuation">"</span></span>
    <span class="token attr-name">repeatCount</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>indefinite<span class="token punctuation">"</span></span>
    <span class="token attr-name">from</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0<span class="token punctuation">"</span></span>
    <span class="token attr-name">to</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
  <span class="token punctuation">/></span></span>
</code></pre></div>
<p>But instead, transform in CSS was overriding any previous transform applied to the inline SVG. In other words, the original position reset to 0 and showed a very different result from what SMIL produced. That meant the animations wound up looking identical no matter what.</p>
<figure>
    <img src="/blog/blog-loaders-04.gif" alt="">
</figure>
<p>The (not very pretty) solution to make the Sass similar to SMIL was to place each shape inside a group (<g>) element, and apply the inline rotation to the groups, and the animation to the shapes. This way, the inline transform isn’t affected by the animation.</g></p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span><span class="token punctuation">></span></span>
    ... 
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(0 50 50)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loader<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rotate(30 50 50)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#loader<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
    ...
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Now both languages have a very similar result.</p>
<h2 id="the-technology-i-used"><a href="#the-technology-i-used" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The technology I used</h2>
<p>I used Vue.js and Nuxt.js. Both have great documentation, but there are more specific reasons why I choose them.</p>
<p>I like Vue for lots of reasons:</p>
<ul>
<li>
<p>Vue encapsulates HTML, CSS, and JavaScript as a “<a href="https://github.com/marianabeldi/holasvg-loaders/blob/main/components/Codes.vue" rel="nofollow noopener noreferrer" target="_blank">single-file component</a>” where all the code lives in a single file that’s easier to work with.</p>
</li>
<li>
<p>The way Vue binds and dynamically updates HTML or SVG attributes is very intuitive.</p>
</li>
<li>
<p>HTML and SVG don’t require any extra transformations (like making the code JSX-compatible).</p>
</li>
</ul>
<p>As far as Nuxt goes:</p>
<ul>
<li>
<p>It has a quick boilerplate that helps you focus on development instead of configuration.</p>
</li>
<li>
<p>There’s automatic routing and it supports auto-importing components.</p>
</li>
<li>
<p>It’s a good project structure with pages, components, and layouts.</p>
</li>
<li>
<p>It’s easier to optimize for SEO, thanks to meta tags.</p>
</li>
</ul>
<h2 id="lets-look-at-a-few-example-loaders"><a href="#lets-look-at-a-few-example-loaders" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Let’s look at a few example loaders</h2>
<p>What I like about the end result is that the generator isn’t a one-trick pony. There’s no one way to use it. Because it outputs both SMIL and CSS/Sass, there are several ways to integrate a loader into your own project.</p>
<h3 id="download-the-smil-svg-and-use-it-as-a-background-image-in-css"><a href="#download-the-smil-svg-and-use-it-as-a-background-image-in-css" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Download the SMIL SVG and use it as a background image in CSS</h3>
<p>Like I mentioned earlier, SMIL features are preserved when an SVG is used as a background image file. So, simply download the SVG from the generator, upload it to your server, and reference it in CSS as a background image.</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader SMIL - Background image CSS" src="https://codepen.io/marianab/embed/GRmpyGd?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/GRmpyGd">
  Hola SVG Loader SMIL - Background image CSS&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<p>Similarly, we could use the SVG as a background image of a pseudo-element:</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader - SMILL + CSS + pseudo element" src="https://codepen.io/marianab/embed/bGWqLqw?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/bGWqLqw">
  Hola SVG Loader - SMILL + CSS + pseudo element&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="drop-the-svg-right-into-the-html-markup"><a href="#drop-the-svg-right-into-the-html-markup" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Drop the SVG right into the HTML markup</h3>
<p>The SVG doesn’t have to be a background image. It’s just code, after all. That means we can simply drop the code from the generator into our own markup and let SMIL do its thing.</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader SMIL - Inline HTML" src="https://codepen.io/marianab/embed/PopvqEx?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/PopvqEx">
  Hola SVG Loader SMIL - Inline HTML&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h3 id="use-a-sass-loop-on-the-inline-svg"><a href="#use-a-sass-loop-on-the-inline-svg" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Use a Sass loop on the inline SVG</h3>
<p>This is what I was originally inspired to do, but ran into some roadblocks. Instead of writing CSS declarations for each animation, we can use the Sass loop produced by the generator. The loop targets a .loader class that’s already applied to the outputted SVG. So, once Sass is compiled to CSS, we get a nice spinning animation.</p>
<iframe height="300" data-default-tab="html,result" scrolling="no" title="Hola SVG Loader SASS" src="https://codepen.io/marianab/embed/dyWvdbQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/dyWvdbQ">
  Hola SVG Loader SASS&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="im-still-working-on-this"><a href="#im-still-working-on-this" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>I’m still working on this</h2>
<p>My favorite part of the generator is the custom shape option where you can add text, emojis, or any SVG element to the mix:</p>
<figure>
    <img src="/blog/blog-loaders-04.gif" alt="">
	<figcaption>Custom text, emoji, and SVG</figcaption>
</figure>
<p>What I would like to do is add a third option for styles to have just one element where you get to work with your own SVG element. That way, there’s less to work with, while allowing for simpler outputs.</p>
<p>The challenge with this project is working with custom values for so many things, like duration, direction, distance, and degrees. Another challenge for me personally is becoming more familiar with Vue because I want to go back and clean up that messy code. That said, the <a href="https://github.com/marianabeldi/holasvg-loaders" rel="nofollow noopener noreferrer" target="_blank">project is open source</a>, and pull requests are welcome! Feel free to send suggestions, feedback, or even Vue course recommendations, especially ones related to SVG or making generators.</p>
<p>This all started with a Sass loop that I read in a book. It isn’t the cleanest code in the world, but I’m left blown away by the power of SMIL animations. I highly recommend <a href="https://css-tricks.com/guide-svg-animations-smil/" rel="nofollow noopener noreferrer" target="_blank">Sarah Soueidan’s guide</a> for a deeper dive into what SMIL is capable of doing.</p>
<p>If you’re curious about the safety of SMIL, that is for good reason. There was a time when Chrome was going to entirely deprecate SMIL (<a href="https://developer.mozilla.org/en-US/docs/Web/SVG/SVG_animation_with_SMIL" rel="nofollow noopener noreferrer" target="_blank">see the opening note in MDN</a>). But that deprecation has been suspended and hasn’t (seemingly) been talked about in a while.</p>
<p><a href="https://caniuse.com/?search=SMIL" rel="nofollow noopener noreferrer" target="_blank">Can I use SMIL</a>?</p>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/how-i-made-a-generator-for-svg-loaders-with-sass-and-smil-options/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a>. Thanks to the edits from <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> and <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/como-hice-un-generador-para-loaders-SVG" data-v-5e4666ba>
      ←
      Cómo hice un generador para loaders SVG con opciones Sass y SMIL
    </a></div> <div data-v-5e4666ba><a href="/posts/leniolabs-brand-redesign" data-v-5e4666ba>
      Leniolabs Brand and Website Redesign
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/how-I-made-a-generator-for-SVG-loaders/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Going beyond automatic SVG compression with <use>]]></title>
            <link>https://holasvg.com/posts/going-beyond-automatic-compression-with-use-element</link>
            <guid>https://holasvg.com/posts/going-beyond-automatic-compression-with-use-element</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Going beyond automatic SVG compression with &lt;use></title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/going-beyond-automatic-svg-compression-with-the-use-element/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/going-beyond-automatic-compression-with-use-element/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/going-beyond-automatic-compression-with-use-element/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">3 March 2020</span> <h1>Going beyond automatic SVG compression with &lt;use></h1> <p class="inner-post-subtitle">Reduce your file size and improve your code.</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-going-beyond-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><blockquote>
<p>Leer versión en español <a href="/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use">acá</a>.</p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<p>If you draw your own SVG files or if you download them from the internet, tools like this <a href="https://petercollingridge.appspot.com/svg-editor" rel="nofollow noopener noreferrer" target="_blank">SVG-Editor</a> or <a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noopener noreferrer" target="_blank">SVGOMG</a> are your friends. Compressing the files with those tools takes only a few seconds and reduces your file size a lot. But if you need to use your SVG inline to animate or interact with the code, there’s still a lot you can do about <em>code legibility</em>.</p>
<p>Reusing content with SVG’s  <code>&lt;use></code>  is not always an option, but when it is, you won’t regret taking a few extra minutes to put it in practice.</p>
<p>In this article, I’ll show an example where I was able to take a lot of advantage of this element — not only for keeping the file size down but also a cleaner markup that became more legible and easy to maintain.</p>
<p>This is the first design that I needed to work with. It was originally created in Illustrator:</p>
<figure>
    <img src="/blog/blog-going-beyond-01.png" alt="">
    <figcaption>First draft with user flow.</figcaption>
</figure>
<p>Take a look at the following code, this is the original file exported directly from the software, weighs  <strong>2.05kb:</strong></p>
<iframe width="100%" height="300" scrolling="no" title="SVG exported from Illustrator" src="https://codepen.io/marianab/embed/RwwmmLd?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen loading="lazy">
  See the Pen &lt;a href='https://codepen.io/marianab/pen/RwwmmLd'>SVG exported from Illustrator&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>It’s not a heavy file at all. However, open it and you’ll find there are lots of empty tags, deprecated namespaces, unnecessary white space, commas and extra information  <a href="https://css-tricks.com/one-illustration-three-svg-outputs/" rel="nofollow noopener noreferrer" target="_blank">applied by the software</a>. This makes the code hard to work with, annoying to scan and creates a big scroll for those hundreds of lines in your document.</p>
<p>You’ll also notice that the file is indeed using  <code>&lt;use></code>  and  <code>&lt;defs></code>  elements, but not in the best way it could. And that’s not the software’s fault! Each astronaut illustration in the original file has a clipping mask: an invisible circle that acts like a window through which we can see our character. Without it, the suit of the astronaut would be flooding outside the circle. There are a few ways to avoid this in Illustrator, like cropping those extra parts with a pathfinder option. That way we would gain a few bytes and avoid using an extra circle only for clipping information of the graphic that we won’t show.  <strong>The compression of the file starts in the software.</strong>  Still, there are a lot of things we’ll be able to improve on the code in case we don’t want to edit the original file.</p>
<blockquote>
<p><em>Compressing the SVG with SVGOMG and keeping the default options won’t take any effort and you’ll get a file that weighs  <strong>1.46kb</strong>. That's a reduction of 30% compared to the original and the graphic will look exactly the same.</em></p>
</blockquote>
<h2 id="reusing-content"><a href="#reusing-content" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Reusing content</h2>
<p>This will require going through the SVG and making some adjustments. I know this option takes more time regarding the previous example, but it’s not as hard as it seems.</p>
<p>We have one repeated element, which is the astronaut inside the circle. That’s the one we’ll compress on SVGOMG. The result will look something like this:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xlink</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/1999/xlink<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 95.8 95.8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> 
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token selector"><span class="token class">.st3</span><span class="token punctuation">,</span><span class="token class">.st4</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span><span class="token hexcode color">#ffcb2f</span><span class="token punctuation">;</span><span class="token property">stroke</span><span class="token punctuation">:</span><span class="token hexcode color">#12192c</span><span class="token punctuation">;</span><span class="token property">stroke-width</span><span class="token punctuation">:</span><span class="token number">1.4891</span><span class="token punctuation">;</span><span class="token property">stroke-miterlimit</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token selector"><span class="token class">.st4</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span><span class="token hexcode color">#69b2b1</span><span class="token punctuation">}</span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40.7<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#f6a2a4<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>defs</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>SVGID_1_<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40.7<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>defs</span><span class="token punctuation">></span></span>    
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>clipPath</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>SVGID_2_<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#SVGID_1_<span class="token punctuation">"</span></span> <span class="token attr-name">overflow</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>visible<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>clipPath</span><span class="token punctuation">></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">clip-path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>url(#SVGID_2_)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M63.9 45.6H32c-4 0-7.2 1.9-7.3 4.3l-.8 26.6H72l-.8-26.6c-.2-2.5-3.4-4.3-7.3-4.3z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M74.3 86.9L66 88.2C53.8 90 41.4 90 29.1 88.1l-7.7-1.2v-14c0-4 3.2-7.2 7.2-7.2h38.5c4 0 7.2 3.2 7.2 7.2v14z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M31.8 47.3h-.6c-.7 0-1.2-.6-1.2-1.2V23.2c0-.7.6-1.2 1.2-1.2h.6c.7 0 1.2.6 1.2 1.2v22.9c0 .7-.6 1.2-1.2 1.2z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>31.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.7<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2.8<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>51.4<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.3<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M64.5 53.1c0 8-7.4 11.2-16.5 11.2S31.4 61 31.4 53.1s7.4-14.4 16.5-14.4 16.6 6.4 16.6 14.4z<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#13192d<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.489<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.489<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-dasharray</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>9.6793,3.7228<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M65.9 88V76.9<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>        
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.489<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M29.6 87.9v-11<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>  
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>  
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<h3 id="first-recommendations"><a href="#first-recommendations" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>First recommendations:</h3>
<ol>
<li>Move the  <code>&lt;style></code>  content to the CSS file (assuming you can use your SVG inline and that you have a stylesheet linked in your document).</li>
<li>Rename the IDs with something that makes sense to you.</li>
<li>Round those complicated numbers, like <code>stroke-width="1.489"</code> to <code>stroke-width="1.5"</code>. This is something that could happen if you resize your vectors in Illustrator with the option of scaling borders checked.</li>
<li>Remove the <code>stroke-miterlimit="10"</code> as we don’t need it since our <code>stroke-linejoin</code> is round.</li>
<li>This code will be our astronaut template. We need to wrap everything in a group, add an ID to that group and place it inside a  <code>&lt;defs></code>  tag. Notice that we already have a <code>&lt;defs></code> element with a circle inside it. We can remove that one as it will be part of a bigger <code>&lt;defs></code> tag.</li>
</ol>
<p>Notice that the first two circles are filled shapes with different radius and color. We can keep the smaller one and add a stroke big enough to achieve the same effect — again, something that we could avoid using a circle with border in Illustrator in the first place.</p>
<p>Another important thing is that our current viewBox is too small for what we want to build. Let’s make it bigger and add some negative space on the x-axis so we can start cloning our astronaut from the middle.</p>
<blockquote>
<p>To learn more about viewBox, check out <a href="https://wattenberger.com/guide/scaling-svg" rel="nofollow noopener noreferrer" target="_blank">this beautiful guide</a> to scaling SVG by Amelia Wattenberger.</p>
</blockquote>
<p>We will end with something like this:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xlink</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/1999/xlink<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-400 0 1000 5000<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>defs</span><span class="token punctuation">></span></span>  
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>astronaut<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>      
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>94.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>48<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>44<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>currentColor<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>8<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>clipPath</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>a<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>94.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>clipPath</span><span class="token punctuation">></span></span>      
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">clip-path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>url(#a)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M110.5 45.6H78.6c-4 0-7.2 1.9-7.3 4.3l-.8 26.6h48.1l-.8-26.6c-.1-2.5-3.4-4.3-7.3-4.3z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M121 86.9l-8.3 1.3C100.4 90 88 90 75.8 88.1l-7.7-1.2v-14c0-4 3.2-7.2 7.2-7.2h38.5c4 0 7.2 3.2 7.2 7.2v14z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M78.4 47.3h-.6c-.7 0-1.2-.6-1.2-1.2V23.2c0-.7.6-1.2 1.2-1.2h.6c.7 0 1.2.6 1.2 1.2v22.9c0 .7-.5 1.2-1.2 1.2z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>78.1<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.7<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2.8<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>94.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>51.4<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.3<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M111.1 53.1c0 8-7.4 11.2-16.5 11.2S78 61 78 53.1s7.4-14.4 16.5-14.4 16.6 6.4 16.6 14.4z<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#13192d<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.5<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M112.5 88V76.9<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.5<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M76.3 87.9v-11<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>  
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span><span class="token punctuation">></span></span>  
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>defs</span><span class="token punctuation">></span></span>   
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>What goes inside the <code>&lt;defs></code> won’t render anywhere. To start cloning our astronaut, we need to link its ID inside a  <code>&lt;use></code> element like this:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#astronaut<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<blockquote>
<p><code>_xlink:href_</code>  is deprecated since SVG2, but is better to use it for compatibility purposes. You can use href in modern browsers, but I tested it on Safari and it wasn’t working as of this writing. If you usexlink:href,make sure you include this namespace in your SVG tag:  <code>_xmlns:xlink="http://www.w3.org/1999/xlink_</code>  (you won’t need it if you decide to use  <code>_href_</code>).</p>
</blockquote>
<p>Now we can add the corresponding text to this first figure and align it with the transform attribute. We better place both elements inside a group so in the future instances we’ll be able to translate the whole group to the position we want:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>translate(-95 210)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>     
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#astronaut<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>     
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>text</span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>translate(25 130)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Tech Leader<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>text</span><span class="token punctuation">></span></span>   
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>The connecting lines are simple shapes that can be drawn directly with  <code>&lt;path></code>. Paths look scary but, for rect lines, there is not much to worry about. I’ll explain this code:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>line<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M-4 200v-25h200<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<p><code>d=""</code>  is for data and that’s where we’ll place our commands.  <code>M</code>  is to move our hand to the place where we’ll start drawing (but it’s not drawing anything).  <code>-4 200</code>  means we place our pencil four units to the left and 200 to the bottom of our viewBox (following the orientation of the SVG coordinate system).  <code>v</code>  is the command to start drawing a vertical line that will go from this place to -25 units up.  <code>h</code>  is for horizontal, so we’re drawing a line from there to 200 to the right. It feels like logo writer.</p>
<p>I separated the lines in three paths, but we can use just one with the  <code>M</code>  value after a series of commands to move our hand and start drawing from a new point in the coordinate system.</p>
<p>Take a look at the final document. Now the file weighs  <strong>779 bytes</strong> and has  <strong>12 lines</strong>  of legible and scalable code:</p>
<iframe width="100%" height="300" scrolling="no" title="SVG with <use>" src="https://codepen.io/marianab/embed/gOOJJVp?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen loading="lazy">
  See the Pen &lt;a href='https://codepen.io/marianab/pen/gOOJJVp'>SVG with &amplt;use&ampgt;&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>If we declare any value in the attributes we defined in the  <code>&lt;defs></code>  then it won’t be possible to change it in their clones because of the nature of the  <code>&lt;use></code>  element. That’s why in the example above the fill of the main circle was replaced with a value of  <code>currentColor</code>  to have control of the backgrounds of all the replications.  <code>currentColor</code>  will inherit the CSS color value of the element (or any element above it). In the SVG, I’m adding a class to some replicated astronauts and adding a color value in CSS to those classes. This way, I’ll be able to change all instances of the  <code>&lt;use></code>  element with that class. To understand more about  <code>&lt;use></code>  and how to style its content,  <a href="https://tympanus.net/codrops/2015/07/16/styling-svg-use-content-css/" rel="nofollow noopener noreferrer" target="_blank">this post</a>  by  <a href="https://www.sarasoueidan.com/" rel="nofollow noopener noreferrer" target="_blank">Sara Soueidan</a>  has everything you need to know.</p>
<p>With this code ready, we’ll be able to scale the graphic to something like this much more easily:</p>
<figure>
    <img src="/blog/blog-going-beyond-02.png" alt="">
    <figcaption>SVG Org Chart.</figcaption>
</figure>
<p>This is the complete code:</p>
<iframe width="100%" height="300" scrolling="no" title="SVG Org Chart - reusing content " src="https://codepen.io/marianab/embed/abbrgag?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen loading="lazy">
  See the Pen &lt;a href='https://codepen.io/marianab/pen/abbrgag'>SVG Org Chart - reusing content &lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Here are the three examples side by side to compare legibility and amount of code, we went from  <strong>241</strong>  to  <strong>12</strong>  neat lines:</p>
<figure>
    <img src="/blog/blog-going-beyond-03.jpg" alt="">
    <figcaption>From left to right: Code direct from Illustrator, code after SVGOMG, code after optimization.</figcaption>
</figure>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/going-beyond-automatic-svg-compression-with-the-use-element/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> with edits from <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> and <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a></p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/formulario-de-contacto-con-animaciones" data-v-5e4666ba>
      ←
      Interacciones SVG para mejorar tu UX con UI
    </a></div> <div data-v-5e4666ba><a href="/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use" data-v-5e4666ba>
      SVG más allá de la compresión automática con el elemento “use”
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/going-beyond-automatic-compression-with-use-element/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leniolabs brand & web redesign]]></title>
            <link>https://holasvg.com/posts/leniolabs-brand-and-website-redesign</link>
            <guid>https://holasvg.com/posts/leniolabs-brand-and-website-redesign</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Leniolabs brand & web redesign</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-brand-and-website-redesign/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-brand-and-website-redesign/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">26 October 2018</span> <h1>Leniolabs brand & web redesign</h1> <p class="inner-post-subtitle">The internal process of creating and developing our own site.</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-leniolabs-redesign.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><h2 id="proposal"><a href="#proposal" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Proposal</h2>
<p>We wanted to build a site that reflects and communicates our identity in every way possible. We saw an opportunity to apply what we had learned in the last years, to make something personal, <strong>unique, useful and accessible</strong>. We also wanted to add a blog where anyone on our team could write interesting articles. The site would have to be alive and interactive, a modern Progressive Web App with a clear brand message.</p>
<h2 id="the-problem"><a href="#the-problem" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The problem</h2>
<p>Like many small companies when they start, we couldn’t find the time to build our ideal website. For a long time, we had a simple template that we modified and pasted our logo into it. Templates are a nice and fast solution when you don’t have time or resources, but they carry some conceptual and communication problems, as <strong>you end up adapting the content to the format</strong>. We were not communicating our identity but filling the spaces that the template gave us.</p>
<p><strong>There was a lack of identity on our website:</strong> it was not original, our personality was not there, it didn’t have our voice and we didn’t have complete control over the code. The same thing happened with our logo, there was no concept behind it, no clear message to communicate.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-02.jpg" alt="">
    <figcaption>Old site and logo.</figcaption>
</figure>
<h2 id="first-steps"><a href="#first-steps" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>First steps</h2>
<h3 id="synthesizing-our-message-in-a-banner"><a href="#synthesizing-our-message-in-a-banner" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Synthesizing our message in a banner</h3>
<p>How to summarize what we do in one sentence? How could we represent that idea with just one image? This task helped us to put a frame on what we do, what we have to offer. We started discussing <strong>what kind of company we wanted to be and what kind of clients we wanted to have</strong>. While looking for the best way to define our message, we began approaching the visual design and illustration styles, testing color palettes, fonts and patterns.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-03.jpg" alt="">
    <figcaption>First iterations of the banner.</figcaption>
</figure>
<h3 id="defining-the-structure"><a href="#defining-the-structure" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Defining the structure</h3>
<p>What elements should go to the homepage and what information should have its own section? The content of the homepage ends up defining the navigation. We started with just one wireframe to open the discussion with the team about our voice and tone, nav sections and their order in the site, our tagline and presentation. After making these primary decisions we were able to start coding and make the rest of the visual decisions from there.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-04.png" alt="">
    <figcaption>Homepage wireframe with notes.</figcaption>
</figure>
<p>As web developers, the main place to show our logo is our website. With that in mind, we wanted to take advantage of the web platform and language. Working with the concepts above, we came up with a logo that is always active, ready to code, with a state for offline mode and an isotype for mobile home screen and favicon. We achieved that with SVG and CSS animations.</p>
<figure class="flex-imgs">
    <img src="/blog/blog-leniolabs-redesign-05.jpg" alt="" width="180">
    <img src="/blog/blog-leniolabs-redesign-06.gif" alt="" width="320">
    <img src="/blog/blog-leniolabs-redesign-07.jpg" alt="" width="180">
    <figcaption>Isologo animation & isotypes.</figcaption>
</figure>
<h2 id="second-stage"><a href="#second-stage" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Second Stage</h2>
<h3 id="designing-with-code"><a href="#designing-with-code" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Designing with code</h3>
<p>It was easy to move faster with all the previous definitions. We made the final visual decisions in this instance: with SASS, native variables and Google Fonts we were able to apply and test everything with a small amount of effort. It was convenient to actually see the final typography and color palette with all the elements interacting with each other. Starting with mobile first:</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-09.png" alt="">
    <figcaption>Mobile screenshots.</figcaption>
</figure>
<h3 id="pwa-setting-the-dino-free"><a href="#pwa-setting-the-dino-free" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>PWA: setting the dino free!</h3>
<p>Our site is a Progressive Web App: if your browser has support (and if you visit us often) you will be asked to download a <strong>home screen icon</strong> to your device. From then on you’ll have direct access to our site. You’ll be able to navigate the pages you’ve already visited without an internet connection, not to mention the benefits of a <strong>very fast loading experience</strong> and an <strong>offline fallback page</strong>.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-10.gif" alt="">
    <figcaption>Offline fallback page.</figcaption>
</figure>
<p>Why not use <strong>CSS grid</strong>? A small part of our site was built using <a href="https://grid.layoutit.com/" rel="nofollow noopener noreferrer" target="_blank">layoutit.com/grid</a> with a flexbox fallback for older browsers. CSS grid is great for layouts that are designed in two dimensions.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-11.gif" alt="">
    <figcaption>CSS grid layout.</figcaption>
</figure>
<p>Keeping the site fresh was one of our primary goals, so we made an introduction to every page with a small CSS and SVG animation, including a contact form with user feedback.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-12.gif" alt="">
    <figcaption>SVG & CSS animations.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-leniolabs-redesign-13.gif" alt="">
    <figcaption>Contact form with user feedback.</figcaption>
</figure>
<h3 id="accessibility-matters"><a href="#accessibility-matters" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Accessibility matters</h3>
<p>We took care of building our code with <strong>semantic headings and structure</strong>, <strong>HTML5 tags</strong>, <strong>ARIA landmark roles</strong>, <strong>SVG titles and descriptions</strong>, <strong>alt tags</strong>, <strong>keyboard navigation</strong> and <strong>color contrast</strong>.</p>
<h3 id="performance"><a href="#performance" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Performance</h3>
<p>We reduced the weight of all our images for a better experience. We only kept the size we needed and applied compression to all files. We also added <strong>WEBP format</strong> for supported browsers reducing file sizes with minimal quality loss. This makes our website faster consuming less bandwidth. We used <strong>optimized inline SVG</strong> almost everywhere. We chose two Google Fonts, one for the site and one for the logo. As we only need 9 characters for the brand, those are the ones we ask for:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://fonts.googleapis.com/css?family=Roboto+Mono:700&text=Leniolabs<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Our best tools to improve performance and accessibility were the ones that Chrome dev tools use for Audits (<a href="https://developers.google.com/web/tools/lighthouse/" rel="nofollow noopener noreferrer" target="_blank">Lighthouse</a> and <a href="https://www.deque.com/axe/" rel="nofollow noopener noreferrer" target="_blank">axe</a>), <a href="https://yellowlab.tools/" rel="nofollow noopener noreferrer" target="_blank">Yellow Lab Tools</a>, among others.</p>
<h3 id="having-fun"><a href="#having-fun" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Having fun</h3>
<p>There are no rules for designing a 404 page, here we combined SVG and a bit of Javascript to make our robot move its eye following your every move. For our portfolio, we made responsive images with <code>scrset</code>.In smaller devices, you’ll find smaller files with the mobile version of our projects. These are shown in responsive silhouettes drawn with <strong>CSS gradients</strong>. We achieved that adding just one class to our <code>&lt;img></code> tag and one extra element for the laptop base, see the code <a href="https://codepen.io/marianab/pen/VExgqm?editors=1100" rel="nofollow noopener noreferrer" target="_blank">here</a>.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-14.gif" alt="">
    <figcaption>404 error page.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-leniolabs-redesign-15.gif" alt="">
    <figcaption>Changing image and device illustration with CSS and srcset.</figcaption>
</figure>
<h2 id="final-touches-and-future-plans"><a href="#final-touches-and-future-plans" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Final touches and future plans</h2>
<h3 id="setting-up-the-guidelines"><a href="#setting-up-the-guidelines" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Setting up the guidelines</h3>
<p>This is a work in progress and will be for some time, we are building a section where anyone can download all assets and visual guidelines to our brand. It includes our logo in different versions and explains when to apply them, the styles of our site and all original files to build background covers, and links to Codepen templates ready to use.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-16.jpg" alt="">
    <figcaption>Complete PDF version here.</figcaption>
</figure>
<h3 id="the-result"><a href="#the-result" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The result</h3>
<p>You can visit our new site at <a href="https://www.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">leniolabs.com</a>, I hope you like it and if you have feedback, comment on this post or get in touch with us!</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/agregar-valor-a-la-plataforma-y-marca-de-nuestro-cliente" data-v-5e4666ba>
      ←
      Agregar valor a la plataforma y la marca de nuestro cliente
    </a></div> <div data-v-5e4666ba><a href="/posts/leniolabs-rediseno-de-marca-y-web" data-v-5e4666ba>
      Leniolabs rediseño de marca y web
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/leniolabs-brand-and-website-redesign/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leniolabs Brand and Website Redesign]]></title>
            <link>https://holasvg.com/posts/leniolabs-brand-redesign</link>
            <guid>https://holasvg.com/posts/leniolabs-brand-redesign</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Leniolabs Brand and Website Redesign</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-brand-redesign/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-brand-redesign/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">02 December 2021</span> <h1>Leniolabs Brand and Website Redesign</h1> <p class="inner-post-subtitle">Redefining our new identity</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-lenio-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Three years after <a href="https://www.holasvg.com/posts/leniolabs-brand-and-website-redesign" rel="nofollow noopener noreferrer" target="_blank">redesigning our brand and site</a>, we decided it was time for a change.</p>
<p>Not only the world is moving dramatically fast. The tech industry is rising as our company keeps growing in many different ways, making us consider what needs to stay in place and what needs to change.</p>
<p>Describing ourselves isn't an easy task. Identity is a constant evolution and not an easy question to answer. We know that the way we present our organization today will change sooner or later. Still, <strong>the challenge is to choose the right ways to express who we are now</strong> in relation to this unpredictable present, keeping our purpose authentic.</p>
<h2 id="the-context"><a href="#the-context" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><strong>The context</strong></h2>
<p>Last year (2020), <a href="https://www.holasvg.com/posts/building-an-SVG-virtual-stand" rel="nofollow noopener noreferrer" target="_blank">we built a site</a> to attend as sponsors of an event that was going to be virtual for the first time. <strong>We wanted to keep close to people while encouraging them to stay home.</strong> As a remote company, we imagined our own house, where every room was an invitation for everyone to spend some time with us.</p>
<figure>
    <img src="/blog/blog-lenio-02.jpg" alt="">
	<figcaption>Event website: Building an SVG virtual stand. Read the article <a href="https://www.holasvg.com/posts/building-an-SVG-virtual-stand">here</a></figcaption>
</figure>
<p>In this house, we found it was easier to express what happens inside our culture by representing and sharing our main topics and activities that take place in our daily time together.
Then it hit us: <strong>We were born remote, our strong culture has been a result of the efforts to feel closer in the distance</strong>, no matter where we are. <strong>This fact has always been a crucial part of our foundation.</strong></p>
<p>So from a solid base of illustrations and animations, <strong>we decided to redesign and rethink our main website.</strong> We chose to scale the concept of the house to an entire city, where we are part of a wider environment where we all coexist in constant close communication with our surroundings, our colleagues, and our clients.</p>
<figure>
    <img src="/blog/blog-lenio-03.gif" alt="">
	<figcaption>New site redesign at <a href="https://www.leniolabs.com/">Leniolabs</a></figcaption>
</figure>
<h2 id="the-concept-through-the-site"><a href="#the-concept-through-the-site" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The concept through the site</h2>
<p>Starting from the city view at the homepage where our house is part of a neighborhood was a way for us to express that <strong>we focus on nearshoring,</strong> increasing the teams of our clients where we merge with their daily routine and methodologies.</p>
<figure>
    <img src="/blog/blog-lenio-04.gif" alt="">
</figure>
<p>The culture section is our house from in and out, here we write about who we are, what we like, where we live, what we do in our free time, and how we like to share knowledge with the community.
Then <strong>each section of the site is represented with a room of our house</strong>, leaving our main essential topics on the first level of the navigation.</p>
<figure>
    <img src="/blog/blog-lenio-05.gif" alt="">
</figure>
<h2 id="new-focus-new-content"><a href="#new-focus-new-content" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>New Focus, new content</h2>
<p>We spend some time writing content to explain every area of our expertise. Each partner took the time to write an article sharing their knowledge and experience of every field and technology they lead.</p>
<h3 id="focus-on-community"><a href="#focus-on-community" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Focus on Community</h3>
<p>We believe that sharing is the best way of growing; that's why <strong>we support many talented people that are developing the open-source frameworks and tools we use every day</strong> at Leniolabs; we owe them their time and knowledge and want them to keep pushing a better web for all. There is a complete section dedicated to the open-source projects we started supporting this year.</p>
<figure>
    <img src="/blog/blog-lenio-os2.jpg" alt="">
	<figcaption><a href="https://www.leniolabs.com/open-source/" target="_blank">Open-source section</a> with organizations and mantainers we support.</figcaption>
</figure>
<figure class="grid-gifs-two">
    <img src="/blog/blog-lenio-06.png" alt="">
    <img src="/blog/blog-lenio-07.png" alt="">
	<figcaption>Open Collective and GitHub sponsors</figcaption>
</figure>
<h3 id="our-lab-keeps-growing"><a href="#our-lab-keeps-growing" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><strong>Our Lab keeps growing.</strong></h3>
<p>As active members of open-source, <strong>we develop our own tools and invite everyone to collaborate with them</strong>. That's what our lab section is for: web tools, games, and open source projects that are developed by our talented team, were selected to share here, but not only the apps and websites but the video talks, live coding sessions, and source files involved in them.</p>
<p>We have <a href="https://grid.layoutit.com/" rel="nofollow noopener noreferrer" target="_blank">Layoutit!</a> a free CSS Grid generator, <a href="https://research.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">Data Research</a> a repo with open-source data visualizations, <a href="https://restgis.com/" rel="nofollow noopener noreferrer" target="_blank">Restgis</a> an API to get GeoJson, TopoJSON, or SVG of any map in the world, <a href="https://www.mylenio.com/" rel="nofollow noopener noreferrer" target="_blank">MyLenio</a> our SaaS manager app, among other games and explorations.</p>
<h3 id="free-alien-goodies"><a href="#free-alien-goodies" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Free alien goodies</h3>
<p>In our culture section, we have many slack emojis, WhatsApp stickers, Instagram filters, and gifs of our alien mascot Leni, that you can download for free from our site or play with our <a href="https://lenimatic.com/" rel="nofollow noopener noreferrer" target="_blank">Lenimatic</a> generator to create your own.</p>
<img src="/blog/blog-lenio-08.gif" alt="">
<img src="/blog/blog-lenio-09.png" alt="">
<h3 id="we-love-easter-eggs"><a href="#we-love-easter-eggs" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>We love easter eggs</h3>
<p>You can come and visit the site at night, but also next winter, and maybe try another visit in January if you can :) there are tons of easter eggs hidden depending on the month and hour you visit us.</p>
<img src="/blog/blog-lenio-10.gif" alt="">
<img src="/blog/blog-lenio-11.gif" alt="">
<h2 id="next-steps"><a href="#next-steps" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Next Steps</h2>
<p>As part of this new identity, we started redesigning all our internal document templates, our social media communication, and a new onboarding kit to deliver to our old and new employees around the globe. We are currently exploring new places where our brand continues to mutate and expand outside the screens and the digital environment.</p>
<figure>
    <img src="/blog/blog-lenio-12.gif" alt="">
    <figcaption>Onboarding kit. Tote bag, mug, notebook, pen, t-shirt, postcards, tons of stickers.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-lenio-13.png" alt="">
    <figcaption>Social Media communication.</figcaption>
</figure>
<p>Thanks for reading! All feedback is welcome, hope you enjoy this article.</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/how-I-made-a-generator-for-SVG-loaders" data-v-5e4666ba>
      ←
      How I Made a Generator for SVG Loaders With Sass and SMIL Options
    </a></div> <div data-v-5e4666ba><a href="/posts/leniolabs-rediseno-de-branding" data-v-5e4666ba>
      Leniolabs rediseño de branding
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/leniolabs-brand-redesign/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leniolabs rediseño de marca y web]]></title>
            <link>https://holasvg.com/posts/leniolabs-rediseno-de-marca-y-web</link>
            <guid>https://holasvg.com/posts/leniolabs-rediseno-de-marca-y-web</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Leniolabs rediseño de marca y web</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-rediseno-de-marca-y-web/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-rediseno-de-marca-y-web/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">26 October 2018</span> <h1>Leniolabs rediseño de marca y web</h1> <p class="inner-post-subtitle">El proceso interno de creación y desarrollo de nuestro propio sitio.</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-leniolabs-redesign.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><h2 id="propuesta"><a href="#propuesta" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Propuesta</h2>
<p>Queríamos construir un sitio que reflejara y comunicara nuestra identidad de todas las formas posibles. Vimos una oportunidad de aplicar lo que habíamos aprendido en los últimos años, para hacer algo personal, <strong>único, útil y accesible</strong>. También queríamos agregar un blog donde cualquier miembro de nuestro equipo pudiera escribir artículos interesantes. El sitio tendría que ser vivo e interactivo, una aplicación web progresiva moderna con un mensaje de marca claro.</p>
<h2 id="el-problema"><a href="#el-problema" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>El problema</h2>
<p>Como muchas pequeñas empresas cuando comienzan, no pudimos encontrar el tiempo para construir nuestro sitio web ideal. Durante mucho tiempo, tuvimos una plantilla simple que modificamos y le pegamos nuestro logotipo. Las plantillas son una solución buena y rápida cuando no tenemos tiempo ni recursos, pero conllevan algunos problemas conceptuales y de comunicación, ya que <strong>terminamos adaptando el contenido al formato</strong>. No estábamos comunicando nuestra identidad sino llenando los espacios que nos daba la plantilla.</p>
<p><strong>Había una falta de identidad en nuestro sitio web:</strong> no era original, nuestra personalidad no estaba reflejada, no tenía nuestra voz y no teníamos control total sobre el código. Con nuestro logo pasó lo mismo, no había ningún concepto detrás, ningún mensaje claro que comunicar.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-02.jpg" alt="">
    <figcaption>Antiguo sitio y logo.</figcaption>
</figure>
<h2 id="primeros-pasos"><a href="#primeros-pasos" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Primeros pasos</h2>
<h3 id="sintetizando-nuestro-mensaje-en-un-banner"><a href="#sintetizando-nuestro-mensaje-en-un-banner" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Sintetizando nuestro mensaje en un banner</h3>
<p>¿Cómo resumir lo que hacemos en una frase? ¿Cómo podríamos representar esa idea con una sola imagen? Esta tarea nos ayudó a enmarcar lo que hacemos, lo que tenemos para ofrecer. Empezamos a discutir <strong>qué tipo de empresa queríamos ser y qué tipo de clientes queríamos tener</strong>. Mientras buscábamos la mejor manera de definir nuestro mensaje, comenzamos a acercarnos al diseño visual y los estilos de ilustración, probando paletas de colores, fuentes y patrones.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-03.jpg" alt="">
    <figcaption>Primeras iteraciones del banner.</figcaption>
</figure>
<h3 id="definición-de-la-estructura"><a href="#definici%C3%B3n-de-la-estructura" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Definición de la estructura</h3>
<p>¿Qué elementos deben ir a la página de inicio y qué información debe tener su propia sección? El contenido de la página de inicio termina definiendo la navegación. Comenzamos con solo un esquema para abrir la discusión con el equipo sobre nuestra voz y tono, secciones de navegación y su orden en el sitio, nuestro eslogan y presentación. Después de tomar estas decisiones principales, pudimos comenzar a codificar y tomar el resto de las decisiones visuales a partir de ahí.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-04.png" alt="">
    <figcaption>Wireframe de la página de inicio con notas.</figcaption>
</figure>
<p>Como desarrolladores de software, el lugar principal para mostrar nuestro logotipo es nuestro sitio web. Con eso en mente, queríamos aprovechar la plataforma y el idioma. Trabajando con los conceptos anteriores, creamos un logotipo que siempre está activo, listo para codificar, con un estado para el modo fuera de línea y un isotipo para la pantalla de inicio móvil y favicon. Lo logramos con animaciones SVG y CSS.</p>
<figure class="flex-imgs">
    <img src="/blog/blog-leniolabs-redesign-05.jpg" alt="" width="180">
    <img src="/blog/blog-leniolabs-redesign-06.gif" alt="" width="320">
    <img src="/blog/blog-leniolabs-redesign-07.jpg" alt="" width="180">
    <figcaption>Isologo animación e isotipos.</figcaption>
</figure>
<h2 id="segunda-etapa"><a href="#segunda-etapa" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Segunda etapa</h2>
<h3 id="diseñar-con-código"><a href="#dise%C3%B1ar-con-c%C3%B3digo" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Diseñar con código</h3>
<p>Era fácil moverse más rápido con todas las definiciones anteriores. Tomamos las decisiones visuales finales en este caso: con SASS, variables nativas y Google Fonts pudimos aplicar y probar todo con un pequeño esfuerzo. Fue conveniente definir la tipografía final y la paleta de colores con todos los elementos interactuando entre sí. Comenzando con el móvil primero:</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-09.png" alt="">
    <figcaption>Capturas de pantalla móviles.</figcaption>
</figure>
<h3 id="pwa-liberando-al-dinosaurio"><a href="#pwa-liberando-al-dinosaurio" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>PWA: ¡liberando al dinosaurio!</h3>
<p>Nuestro sitio es una aplicación web progresiva: si su navegador es compatible (y si nos visita con frecuencia), se le pedirá que descargue un <strong>icono de pantalla de inicio</strong> en su dispositivo. A partir de ese momento, tendrá acceso directo a nuestro sitio. Podrá navegar por las páginas que ya ha visitado sin conexión a Internet, sin mencionar los beneficios de una <strong>experiencia de carga muy rápida</strong> y una <strong>página alternativa sin conexión</strong>.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-10.gif" alt="">
    <figcaption>Página alternativa sin conexión.</figcaption>
</figure>
<p>¿Por qué no usar <strong>CSS Grid</strong>? Una pequeña parte de nuestro sitio se creó usando <a href="https://grid.layoutit.com/" rel="nofollow noopener noreferrer" target="_blank">layoutit.com/grid</a> con fallback de Flexbox para navegadores más antiguos. La grilla CSS es ideal para diseños diseñados en dos dimensiones.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-11.gif" alt="">
    <figcaption>CSS grid layout.</figcaption>
</figure>
<p>Mantener el sitio actualizado era uno de nuestros principales objetivos, por lo que hicimos una introducción a cada página con una pequeña animación CSS y SVG, incluido un formulario de contacto con los comentarios de los usuarios.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-12.gif" alt="">
    <figcaption>SVG & animaciones CSS.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-leniolabs-redesign-13.gif" alt="">
    <figcaption>Formulario de contacto con animaciones.</figcaption>
</figure>
<h3 id="la-accesibilidad-importa"><a href="#la-accesibilidad-importa" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>La accesibilidad importa</h3>
<p>Nos encargamos de construir nuestro código con <strong>encabezados y estructura semánticos</strong>, <strong>etiquetas HTML5</strong>, <strong>roles emblemáticos de ARIA</strong>, <strong>títulos y descripciones SVG</strong>, <strong>etiquetas alt</strong>, <strong>navegación por teclado</strong> y <strong>contraste de color</strong>.</p>
<h3 id="actuación"><a href="#actuaci%C3%B3n" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Actuación</h3>
<p>Redujimos el peso de todas nuestras imágenes para una mejor experiencia. Solo mantuvimos el tamaño que necesitábamos y aplicamos compresión a todos los archivos. También agregamos <strong>formato WEBP</strong> para navegadores compatibles, lo que reduce el tamaño de los archivos con una pérdida de calidad mínima. Esto hace que nuestro sitio web sea más rápido y consuma menos ancho de banda. Utilizamos <strong>SVG en línea optimizado</strong> en casi todas partes. Elegimos dos fuentes de Google, una para el sitio y otra para el logotipo. Como solo necesitamos 9 caracteres para la marca, esos son los que te pedimos:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://fonts.googleapis.com/css?family=Roboto+Mono:700&text=Leniolabs<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Nuestras mejores herramientas para mejorar el rendimiento y la accesibilidad fueron las que usa Chrome para auditorías (<a href="https://developers.google.com/web/tools/lighthouse/" rel="nofollow noopener noreferrer" target="_blank">Lighthouse</a> y [axe](<a href="https://www" rel="nofollow noopener noreferrer" target="_blank">https://www</a> .deque.com/axe/)), <a href="https://yellowlab.tools/" rel="nofollow noopener noreferrer" target="_blank">Yellow Lab Tools</a>, entre otros.</p>
<h3 id="divirtiéndonos"><a href="#divirti%C3%A9ndonos" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Divirtiéndonos</h3>
<p>No hay reglas para diseñar una página 404, acá combinamos SVG y un poco de Javascript para hacer que nuestro robot mueva su ojo siguiendo cada uno de sus movimientos. Para nuestro portafolio, creamos imágenes receptivas con <code>scrset</code>. En dispositivos más pequeños, encontrarán archivos más pequeños con la versión móvil de nuestros proyectos. Estos se muestran en siluetas sensibles dibujadas con <strong>gradientes CSS</strong>. Lo logramos agregando solo una clase a nuestra etiqueta <code>&lt;img></code> y un elemento adicional para la base de la computadora portátil, vea el código [aquí] (<a href="https://codepen.io/marianab/pen/VExgqm?editors=1100" rel="nofollow noopener noreferrer" target="_blank">https://codepen.io/marianab/pen/VExgqm?editors=1100</a>).</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-14.gif" alt="">
    <figcaption>404 página de error.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-leniolabs-redesign-15.gif" alt="">
    <figcaption>Cambiar la imagen y la ilustración del dispositivo con CSS y srcset.</figcaption>
</figure>
<h2 id="toques-finales-y-planes-futuros"><a href="#toques-finales-y-planes-futuros" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Toques finales y planes futuros</h2>
<h3 id="estableciendo-las-pautas"><a href="#estableciendo-las-pautas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Estableciendo las pautas</h3>
<p>Este es un trabajo en progreso y lo será por algún tiempo, estamos construyendo una sección donde cualquiera puede descargar todos los activos y pautas visuales de nuestra marca. Incluye nuestro logo en diferentes versiones y explica cuándo aplicarlos, los estilos de nuestro sitio y todos los archivos originales para construir portadas de fondo, y enlaces a plantillas de Codepen listas para usar.</p>
<figure>
    <img src="/blog/blog-leniolabs-redesign-16.jpg" alt="">
    <figcaption>Versión PDF.</figcaption>
</figure>
<h3 id="el-resultado"><a href="#el-resultado" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>El resultado</h3>
<p>Pueden visitar nuestro nuevo sitio en <a href="https://www.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">leniolabs.com</a>, espero que les guste!</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/leniolabs-brand-and-website-redesign" data-v-5e4666ba>
      ←
      Leniolabs brand & web redesign
    </a></div> <div data-v-5e4666ba><a href="/posts/contact-form-with-animated-feedback" data-v-5e4666ba>
      SVG interactions to improve your UX with UI
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/leniolabs-rediseno-de-marca-y-web/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leniolabs rediseño de branding]]></title>
            <link>https://holasvg.com/posts/leniolabs-rediseno-de-branding</link>
            <guid>https://holasvg.com/posts/leniolabs-rediseno-de-branding</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Leniolabs rediseño de branding</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-rediseno-de-branding/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/leniolabs-rediseno-de-branding/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">02 December 2021</span> <h1>Leniolabs rediseño de branding</h1> <p class="inner-post-subtitle">Redefiniendo nuestra nueva identidad</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/case-study?type=posts" class="card-category"><span>#case-study</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-lenio-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>Tres años después de <a href="https://www.holasvg.com/posts/leniolabs-brand-and-website-redesign" rel="nofollow noopener noreferrer" target="_blank">rediseñar nuestra marca y sitio</a>, decidimos que era hora de un cambio.</p>
<p>No solo el mundo se está moviendo dramáticamente rápido. La industria de la tecnología está creciendo a medida que nuestra empresa sigue creciendo de muchas maneras diferentes, lo que nos hace considerar qué debe dejar en su lugar y qué debe cambiar.</p>
<p>Describirnos a nosotros mismos no es una tarea fácil. La identidad es una evolución constante y no es una pregunta fácil de responder. Sabemos que la forma en que presentamos hoy nuestra organización cambiará tarde o temprano. Aún así, <strong>el desafío es elegir las formas correctas de expresar quiénes somos ahora</strong> en relación con este presente impredecible, manteniendo auténtico nuestro propósito.</p>
<h2 id="el-contexto"><a href="#el-contexto" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><strong>El contexto</strong></h2>
<p>El año pasado (2020), <a href="https://www.holasvg.com/posts/building-an-SVG-virtual-stand" rel="nofollow noopener noreferrer" target="_blank">construimos un sitio</a> para asistir como patrocinadores de un evento que iba a ser virtual por primera vez. <strong>Queríamos mantenernos cerca de las personas y alentarlas a quedarse en casa.</strong> Como empresa remota, imaginamos nuestra propia casa, donde cada habitación era una invitación para que todos pasaran un tiempo con nosotros.</p>
<figure>
    <img src="/blog/blog-lenio-02.jpg" alt="">
	<figcaption>Sitio web del evento: Construcción de un stand virtual SVG. Más info en el artículo <a href="https://www.holasvg.com/posts/building-an-SVG-virtual-stand">aquí</a></figcaption>
</figure>
<p>En esta casa, encontramos que era más fácil expresar lo que sucede dentro de nuestra cultura al representar y compartir nuestros  temas principales y actividades que tienen lugar en nuestro tiempo diario juntos.
Entonces nos dimos cuenta: <strong>Nacimos remotos, nuestra fuerte cultura ha sido el resultado de los esfuerzos por sentirnos más cerca en la distancia</strong>, sin importar dónde estemos. <strong>Este hecho siempre ha sido una parte crucial de nuestra fundación.</strong></p>
<p>Entonces, a partir de una base sólida de ilustraciones y animaciones, <strong>decidimos rediseñar y repensar nuestro sitio web principal.</strong> Elegimos escalar el concepto de la casa a toda una ciudad, donde somos parte de un entorno más amplio donde todos coexistimos. en constante comunicación cercana con nuestro entorno, nuestros colegas y nuestros clientes.</p>
<figure>
    <img src="/blog/blog-lenio-03.gif" alt="">
	<figcaption>Nuevo rediseño del sitio en <a href="https://www.leniolabs.com/">Leniolabs</a></figcaption>
</figure>
<h2 id="el-concepto-a-través-del-sitio"><a href="#el-concepto-a-trav%C3%A9s-del-sitio" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>El concepto a través del sitio</h2>
<p>Comenzar desde la vista de la ciudad en la página de inicio donde nuestra casa es parte de un barrio fue una forma de expresar que <strong>nos enfocamos en el nearshoring</strong>, aumentando los equipos de nuestros clientes donde nos fusionamos con su rutina diaria y metodologías.</p>
<figure>
    <img src="/blog/blog-lenio-04.gif" alt="">
</figure>
<p>La sección de cultura es nuestra casa por dentro y por fuera, aquí escribimos sobre quiénes somos, qué nos gusta, dónde vivimos, qué hacemos en nuestro tiempo libre y cómo nos gusta compartir conocimientos con la comunidad.
Luego <strong>cada sección del sitio se representa con una habitación de nuestra casa</strong>, dejando nuestros principales temas esenciales en el primer nivel de navegación.</p>
<figure>
    <img src="/blog/blog-lenio-05.gif" alt="">
</figure>
<h2 id="nuevo-enfoque-nuevo-contenido"><a href="#nuevo-enfoque-nuevo-contenido" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Nuevo enfoque, nuevo contenido</h2>
<p>Pasamos algún tiempo escribiendo contenido para explicar cada área de nuestra experiencia. Cada socio se tomó el tiempo para escribir un artículo compartiendo su conocimiento y expertise de cada campo y tecnología que lideran.</p>
<h3 id="centrarse-en-la-comunidad"><a href="#centrarse-en-la-comunidad" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Centrarse en la comunidad</h3>
<p>Creemos que compartir es la mejor manera de crecer; es por eso que <strong>apoyamos a muchas personas talentosas que están desarrollando los marcos y herramientas de código abierto que usamos todos los días</strong> en Leniolabs; les debemos su tiempo y conocimiento y queremos que sigan impulsando una mejor web para todos. Hay una sección completa dedicada a los proyectos de código abierto que comenzamos a apoyar este año.</p>
<figure class="grid-gifs-two">
    <img src="/blog/blog-lenio-06.png" alt="">
    <img src="/blog/blog-lenio-07.png" alt="">
	<figcaption>Patrocinadores de Open Collective y GitHub</figcaption>
</figure>
<h3 id="nuestro-laboratorio-sigue-creciendo"><a href="#nuestro-laboratorio-sigue-creciendo" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a><strong>Nuestro laboratorio sigue creciendo.</strong></h3>
<p>Como miembros activos de código abierto, <strong>desarrollamos nuestras propias herramientas e invitamos a todos a colaborar con ellas</strong>. Para eso es nuestra sección de laboratorio: las herramientas web, los juegos y los proyectos de código abierto desarrollados por nuestro talentoso equipo fueron seleccionados para compartir acá, pero no solo las aplicaciones y los sitios web, sino también las charlas grabadas, las sesiones de código en vivo y los archivos fuente involucrados en ellos.</p>
<p>Tenemos <a href="https://grid.layoutit.com/" rel="nofollow noopener noreferrer" target="_blank">Layoutit!</a> un generador de CSS Grid gratuito, <a href="https://research.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">Data Research</a> un repositorio con visualizaciones de datos de código abierto, <a href="https://restgis.com/" rel="nofollow noopener noreferrer" target="_blank"> Restgis</a> una API para obtener GeoJson, TopoJSON o SVG de cualquier mapa del mundo, <a href="https://www.mylenio.com/" rel="nofollow noopener noreferrer" target="_blank">MyLenio</a> nuestra aplicación de administrador SaaS, entre otros juegos y exploraciones.</p>
<h3 id="extraterrestres-gratis"><a href="#extraterrestres-gratis" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Extraterrestres gratis</h3>
<p>En nuestra sección de cultura, tenemos muchos emojis de slack, stickers de WhatsApp, filtros de Instagram y gifs de nuestra mascota alienígena Leni, que pueden descargar gratis desde nuestro sitio o jugar con nuestro <a href="https://lenimatic.com/" rel="nofollow noopener noreferrer" target="_blank">Lenimatic</a> generador para crear sus propios Lenis.</p>
<img src="/blog/blog-lenio-08.gif" alt="">
<img src="/blog/blog-lenio-09.png" alt="">
<h3 id="nos-encantan-las-sorpresas"><a href="#nos-encantan-las-sorpresas" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Nos encantan las sorpresas</h3>
<p>Pueden venir y visitar el sitio por la noche, pero también el próximo invierno, y tal vez intentar otra visita en enero si pueden :) hay toneladas de sorpresas escondidas dependiendo del mes y la hora en que nos visiten.</p>
<img src="/blog/blog-lenio-10.gif" alt="">
<img src="/blog/blog-lenio-11.gif" alt="">
<h2 id="próximos-pasos"><a href="#pr%C3%B3ximos-pasos" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Próximos pasos</h2>
<p>Como parte de esta nueva identidad, comenzamos a rediseñar todas nuestras plantillas de documentos internos, nuestra comunicación en las redes sociales y un nuevo kit de onboarding para entregar a nuestros antiguos y nuevos empleados en todo el mundo. Actualmente estamos explorando nuevos lugares donde nuestra marca sigue mutando y expandiéndose fuera de las pantallas y el entorno digital.</p>
<figure>
    <img src="/blog/blog-lenio-12.gif" alt="">
    <figcaption>Kit de incorporación. Tote bag, mug, notebook, pen, t-shirt, postales, toneladas de pegatinas.</figcaption>
</figure>
<figure>
    <img src="/blog/blog-lenio-13.png" alt="">
    <figcaption>Comunicación en redes sociales.</figcaption>
</figure>
<p>¡Gracias por leer! Todos los comentarios son bienvenidos, espero que disfruten este artículo.</p></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/leniolabs-brand-redesign" data-v-5e4666ba>
      ←
      Leniolabs Brand and Website Redesign
    </a></div> <div data-v-5e4666ba><a href="/posts/dominar-el-atributo-SVG-stroke-miterlimit" data-v-5e4666ba>
      Dominar el atributo de SVG stroke-miterlimit
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/leniolabs-rediseno-de-branding/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SVG más allá de la compresión automática con el elemento “use”]]></title>
            <link>https://holasvg.com/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use</link>
            <guid>https://holasvg.com/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>SVG más allá de la compresión automática con el elemento “use”</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">3 March 2020</span> <h1>SVG más allá de la compresión automática con el elemento “use”</h1> <p class="inner-post-subtitle">Reducí el tamaño de tus archivos y mejorá tu código</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-going-beyond.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><blockquote>
<p>Read the english version <a href="/posts/going-beyond-automatic-compression-with-use-element">here</a>.</p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<p>Si dibujas tus propios SVG o si los descargas de internet, herramientas como este <a href="https://petercollingridge.appspot.com/svg-editor" rel="nofollow noopener noreferrer" target="_blank">editor de SVG</a> o <a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noopener noreferrer" target="_blank">SVGOMG</a> son tus amigos. Comprimir los archivos con estas herramientas puede tomar solo unos segundos y reducir su tamaño muchísimo. Pero si usás tu SVG inline para animar o interactuar con el código, hay mucho que podés hacer respecto a su legibilidad.
Reutilizar contenido con el elemento <code>&lt;use></code> de SVG no siempre es una opción, pero cuando lo es, vale la pena tomarse unos minutos extra para ponerlo en práctica.</p>
<p>En este artículo, voy a mostrar un ejemplo del cual pude sacar mucha ventaja con este elemento — no solo para mantener un archivo liviano, sino también conseguir un código limpio, legible y fácil de mantener.</p>
<p>Este es el primer diseño con el que tenía que trabajar. Fue originalmente creado en Illustrator:</p>
<figure>
    <img src="/blog/blog-going-beyond-01.png" alt="">
    <figcaption>First draft with user flow.</figcaption>
</figure>
<p>En el siguiente Codepen se ve el código original directamente exportado desde el software, pesa <strong>2.05kb</strong>:</p>
<iframe width="100%" height="300" scrolling="no" title="SVG exported from Illustrator" src="https://codepen.io/marianab/embed/RwwmmLd?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen loading="lazy">
  See the Pen &lt;a href='https://codepen.io/marianab/pen/RwwmmLd'>SVG exported from Illustrator&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>No es un archivo pesado para nada. Sin embargo al abrirlo encontraremos un montón de tags vacíos, namespaces en desuso, espacio en blanco innecesario, comas e información extra <a href="https://css-tricks.com/one-illustration-three-svg-outputs/" rel="nofollow noopener noreferrer" target="_blank">aplicada por el software</a>. Esto hace que el código sea difícil para trabajar, molesto para escanear y genera un scroll eterno con cientos de líneas en nuestro documento.</p>
<p>También notarás que este archivo está efectivamente usando elementos <code>&lt;use></code> y <code>&lt;defs></code>, pero no de la mejor manera posible. Y eso no es culpa del software! En el archivo original cada ilustración del astronauta tiene una máscara de recorte: un círculo invisible que actúa como ventana a través de la cual podemos ver a nuestro personaje. Sin ella, veríamos el traje del astronauta desbordando por fuera del círculo. Hay maneras de evitar esto en Illustrator, como por ejemplo cropeando esas partes con una opción de pathfinder. De esa forma ganaríamos algunos bytes y evitaríamos usar un círculo extra sólo para clipear información que no mostraremos en el gráfico. La compresión del archivo empieza en el software. Aun así, hay muchas cosas que podemos mejorar en el código en caso de que no podamos editar el archivo original.</p>
<blockquote>
<p>Comprimir el SVG en SVGOMG manteniendo las opciones por defecto, no costará ningún esfuerzo y obtendremos un archivo que pesa <strong>1.46kb</strong>. Eso es una reducción de 30% comparado al peso original y se ve exactamente igual.</p>
</blockquote>
<h2 id="reusando-contenido"><a href="#reusando-contenido" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Reusando contenido</h2>
<p>Esto implicará revisar el SVG y hacer algunos ajustes. Sé que esta opción suele tomar más tiempo respecto a la anterior, pero no es tan difícil como parece.</p>
<p>Tenemos un elemento que se repite, que es el astronauta dentro del círculo. Este será el que comprimiremos en SVGOMG, el resultado se verá así:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xlink</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/1999/xlink<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 95.8 95.8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token selector"><span class="token class">.st3</span><span class="token punctuation">,</span><span class="token class">.st4</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span><span class="token hexcode color">#ffcb2f</span><span class="token punctuation">;</span><span class="token property">stroke</span><span class="token punctuation">:</span><span class="token hexcode color">#12192c</span><span class="token punctuation">;</span><span class="token property">stroke-width</span><span class="token punctuation">:</span><span class="token number">1.4891</span><span class="token punctuation">;</span><span class="token property">stroke-miterlimit</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token selector"><span class="token class">.st4</span></span><span class="token punctuation">{</span><span class="token property">fill</span><span class="token punctuation">:</span><span class="token hexcode color">#69b2b1</span><span class="token punctuation">}</span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>    
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40.7<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#f6a2a4<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>    
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>defs</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>SVGID_1_<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40.7<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>defs</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>clipPath</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>SVGID_2_<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#SVGID_1_<span class="token punctuation">"</span></span> <span class="token attr-name">overflow</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>visible<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>clipPath</span><span class="token punctuation">></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">clip-path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>url(#SVGID_2_)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M63.9 45.6H32c-4 0-7.2 1.9-7.3 4.3l-.8 26.6H72l-.8-26.6c-.2-2.5-3.4-4.3-7.3-4.3z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M74.3 86.9L66 88.2C53.8 90 41.4 90 29.1 88.1l-7.7-1.2v-14c0-4 3.2-7.2 7.2-7.2h38.5c4 0 7.2 3.2 7.2 7.2v14z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M31.8 47.3h-.6c-.7 0-1.2-.6-1.2-1.2V23.2c0-.7.6-1.2 1.2-1.2h.6c.7 0 1.2.6 1.2 1.2v22.9c0 .7-.6 1.2-1.2 1.2z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>31.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.7<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2.8<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>51.4<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.3<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M64.5 53.1c0 8-7.4 11.2-16.5 11.2S31.4 61 31.4 53.1s7.4-14.4 16.5-14.4 16.6 6.4 16.6 14.4z<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#13192d<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.489<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.489<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-dasharray</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>9.6793,3.7228<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M65.9 88V76.9<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.489<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M29.6 87.9v-11<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<h3 id="primeras-recomendaciones"><a href="#primeras-recomendaciones" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Primeras recomendaciones:</h3>
<ol>
<li>Mové el contenido de los estilos al archivo CSS (asumiendo que podés usar el SVG inline y que tenés una hoja de estilos linkeada al documento).</li>
<li>Renombrá los IDs con algo que tenga sentido para vos.</li>
<li>Redondeá esos números complicados, como <code>stroke-width="1.489"</code> a <code>stroke-width="1.5"</code>. Esos números suelen aparecer cuando cambiás el tamaño del gráfico en Illustrator con la opción de <code>“escalar borders”</code> activa.</li>
<li>Borrá los <code>stroke-miterlimit="10"</code> ya que no se necesitan cuando <code>stroke-linejoin </code>tiene el varlor <code>round</code>.</li>
<li>Este código será nuestro template para los astronautas. Ahora hay que envolverlo en un grupo, agregar un ID a ese grupo y ubicarlo dentro del tag <code>&lt;defs></code>. Hay que tener en cuenta que ya tenemos un elemento <code>&lt;defs></code> con un círculo adentro. Movamos todo dentro del mismo tag para quedarnos con una sola etiqueta.</li>
</ol>
<p>Los primeros dos círculos que aparecen son dos figuras rellenas con diferente radio y color. Podemos mantener sólo el más pequeño y agregarle un borde lo suficientemente grande para conseguir el mismo efecto — de nuevo, algo que pudimos haber evitado desde el principio, usando un círculo con borde en Illustrator.</p>
<p>Otra cosa importante es que nuestro viewBox actual es muy pequeño para lo que queremos construir. Podemos agrandarlo agregando espacio negativo en el eje x para poder empezar a clonar el astronauta desde el medio.</p>
<blockquote>
<p>Para aprender más acerca del viewBox, mirá esta <a href="https://wattenberger.com/guide/scaling-svg" rel="nofollow noopener noreferrer" target="_blank">hermosa guía</a> sobre escalar SVG hecha por Amelia Wattenberger.</p>
</blockquote>
<p>El resultado será algo así:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2000/svg<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xlink</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/1999/xlink<span class="token punctuation">"</span></span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-400 0 1000 5000<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>defs</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>astronaut<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>94.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>48<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>44<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>currentColor<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>8<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>clipPath</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>a<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>94.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>47.9<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>clipPath</span><span class="token punctuation">></span></span>    
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">clip-path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>url(#a)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M110.5 45.6H78.6c-4 0-7.2 1.9-7.3 4.3l-.8 26.6h48.1l-.8-26.6c-.1-2.5-3.4-4.3-7.3-4.3z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M121 86.9l-8.3 1.3C100.4 90 88 90 75.8 88.1l-7.7-1.2v-14c0-4 3.2-7.2 7.2-7.2h38.5c4 0 7.2 3.2 7.2 7.2v14z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st3<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M78.4 47.3h-.6c-.7 0-1.2-.6-1.2-1.2V23.2c0-.7.6-1.2 1.2-1.2h.6c.7 0 1.2.6 1.2 1.2v22.9c0 .7-.5 1.2-1.2 1.2z<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>78.1<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.7<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2.8<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>circle</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>st4<span class="token punctuation">"</span></span> <span class="token attr-name">cx</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>94.5<span class="token punctuation">"</span></span> <span class="token attr-name">cy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>51.4<span class="token punctuation">"</span></span> <span class="token attr-name">r</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>20.3<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M111.1 53.1c0 8-7.4 11.2-16.5 11.2S78 61 78 53.1s7.4-14.4 16.5-14.4 16.6 6.4 16.6 14.4z<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#13192d<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.5<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M112.5 88V76.9<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#12192c<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.5<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linecap</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M76.3 87.9v-11<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>defs</span><span class="token punctuation">></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Lo que va dentro de <code>&lt;defs></code> no se renderiza en ningún lado. Para empezar a clonar nuestro astronauta, debemos linkear su ID dede el elemento <code>&lt;use></code> así:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#astronaut<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<blockquote>
<p><code>xlink:href </code>está obsoleto desde SVG2, pero es mejor usarlo por cuestiones de compatibilidad. En algunos navegadores modernos se puede simplemente usar <code>href</code> pero al momento de escribir esta nota lo testié en Safari y no está funcionando ahí. Si usás <code>xlink:href</code> asegurate de incluir este namespace en tu SVG tag: <code>xmlns:xlink="http://www.w3.org/1999/xlink"</code> (no lo necesitarás si decidís usar <code>href</code>).</p>
</blockquote>
<p>Ahora podemos agregar el texto correspondiente a este primer clon y alinearlo con el atributo transform. Es recomendable ubicar ambos elementos dentro de un mismo grupo, para que en futuras instancias podamos trasladar todo junto a la posición que corresponde:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>translate(-95 210)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#astronaut<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>text</span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>translate(25 130)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Tech Leader<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>text</span><span class="token punctuation">></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>Las líneas conectoras son simples formas que puede ser dibujadas directamente con <code>&lt;path></code>. Los paths parecen complejos, pero para líneas rectas, no hay mucho de qué preocuparse. Voy a explicar el siguiente código:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>line<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M-4 200v-25h200<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre></div>
<p><code>d=""</code> significa data y ahí dentro escribiremos los comandos necesarios. <code>M</code> es el comando para mover la mano al lugar de la hoja donde empezaremos a dibujar (pero no dibuja nada). <code>-4 200</code> significa que ubicaremos el lápiz cuatro unidades a la izquierda y 200 unidades para abajo dentro de nuestro viewBox (siguiendo la orientación del sistema de coordenadas de SVG). <code>v</code> es el comando para empezar a dibujar una línea vertical que irá desde este punto -25 unidades arriba (negativo va para arriba). <code>h</code> es el comando para línea horizontal, así que dibujaremos una línea desde allí hasta 200 unidades a la derecha. Casi como el logo writer.</p>
<p>Separé todas las líneas en tres paths, pero podemos usar sólo una cambiando el valor de M después de una serie de comandos para mover la mano y seguir dibujando desde un nuevo punto dentro del sistema de coordenadas.</p>
<p>Si ves el código del documento final, ahora el archivo pesa <strong>779 bytes</strong> y tiene sólo <strong>12 líneas de código</strong> legible y escalable:</p>
<iframe width="100%" height="300" scrolling="no" title="SVG with <use>" src="https://codepen.io/marianab/embed/gOOJJVp?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen loading="lazy">
  See the Pen &lt;a href='https://codepen.io/marianab/pen/gOOJJVp'>SVG with &amplt;use&ampgt;&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Si declaramos algún valor en los atributos que definimos dentro del elemento <code>&lt;defs></code> no será posible cambiarlo dentro de sus clones debido a la naturaleza del elemento <code>&lt;use></code>. Por eso en el ejemplo de arriba, el relleno del círculo principal fue reemplazado por el valor currentColor para poder tener control de los colores de fondo de todas las instancias replicadas. currentColor heredará en CSS el valor del color del elemento (o cualquier elemento arriba de éste). En el SVG, estoy agregando una clase a algunas replicas del astronauta y agregando un valor de color a esas clases en CSS. De esta forma, podré cambiar el color en todas las instancias del elemento <code>&lt;use></code> con esa clase. Para entender más acerca del <code>&lt;use></code> y cómo estilear su contenido, <a href="https://tympanus.net/codrops/2015/07/16/styling-svg-use-content-css/" rel="nofollow noopener noreferrer" target="_blank">este post</a> de <a href="https://www.sarasoueidan.com/" rel="nofollow noopener noreferrer" target="_blank">Sara Soueidan</a> tiene todo lo que necesitas saber.</p>
<p>Con el código listo, seremos capaces de escalar más fácilemente el gráfico inicial a algo así:</p>
<figure>
    <img src="/blog/blog-going-beyond-02.png" alt="">
    <figcaption>SVG Org Chart.</figcaption>
</figure>
<p>El código completo está en este Codepen:</p>
<iframe width="100%" height="300" scrolling="no" title="SVG Org Chart - reusing content " src="https://codepen.io/marianab/embed/abbrgag?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen loading="lazy">
  See the Pen &lt;a href='https://codepen.io/marianab/pen/abbrgag'>SVG Org Chart - reusing content &lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Acá están los tres ejemplos lado a lado para comparar legibilidad y cantidad de código, fuimos de 241 a 12 líneas:</p>
<figure>
    <img src="/blog/blog-going-beyond-03.jpg" alt="">
    <figcaption>From left to right: Code direct from Illustrator, code after SVGOMG, code after optimization.</figcaption>
</figure>
<blockquote>
<p>Este artículo fue publicado originalmente en  <a href="https://css-tricks.com/going-beyond-automatic-svg-compression-with-the-use-element/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> editado por <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> y <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a></p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/going-beyond-automatic-compression-with-use-element" data-v-5e4666ba>
      ←
      Going beyond automatic SVG compression with &lt;use>
    </a></div> <div data-v-5e4666ba><a href="/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones" data-v-5e4666ba>
      Usar y reusar todo en SVG … ¡Incluso animaciones!
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Un stand virtual con SVG]]></title>
            <link>https://holasvg.com/posts/un-stand-virtual-con-SVG</link>
            <guid>https://holasvg.com/posts/un-stand-virtual-con-SVG</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Un stand virtual con SVG</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/un-stand-virtual-con-SVG/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/un-stand-virtual-con-SVG/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">22 September 2021</span> <h1>Un stand virtual con SVG</h1> <p class="inner-post-subtitle">Un sitio web ilustrado receptivo con CSS Grid.</p> <a href="/categories/branding?type=posts" class="card-category"><span>#branding</span></a><a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/grid?type=posts" class="card-category"><span>#grid</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-virtual-stand-01.jpg"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p><a href="https://nerdear.la/" rel="nofollow noopener noreferrer" target="_blank">Nerdearla</a> es una conferencia anual con charlas y talleres sobre tecnología y ciencia aquí en Buenos Aires.</p>
<p>Como patrocinadores del evento con <a href="https://www.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">Leniolabs</a>, solíamos tener un puesto donde la gente podía venir y saludarnos, jugar con nosotros, hablar sobre las tecnologías que amamos y obtener algunos de nuestros [merchandising alienígena] (<a href="https://www.behance.net/gallery/90294769/Leniolabs_-merchandising" rel="nofollow noopener noreferrer" target="_blank">https://www.behance.net/gallery/90294769/Leniolabs_-merchandising</a>). <strong>Fue la excusa perfecta para conocernos en esta comunidad</strong>.</p>
<figure>
    <img src="/blog/blog-virtual-stand-02.jpg" alt="">
	<figcaption>Merchandising de Leniolabs en eventos</figcaption>
</figure>
<p>Entonces la pandemia lo cambió todo. Y el evento como lo conocíamos ya no fue posible. Resolvieron hacer esta última edición en línea, así que <strong>decidimos construir un sitio para poder interactuar con la gente</strong> y jugar los juegos que hemos estado desarrollando. No sabíamos qué esperar. Tratar de mantenernos más cerca en la distancia fue un desafío para nosotros. Pero al mismo tiempo, había una audiencia más grande con la que conectarse, ya que muchos oradores y asistentes podían estar presentes desde cualquier parte del mundo.</p>
<p><strong>Primero intentamos crear una ciudad interactiva</strong> para charlar en bares o compartir artículos en la biblioteca, hablar en los teatros o jugar en el parque. Pero todos esos lugares parecían lejanos a nuestra realidad en ese momento.</p>
<figure>
    <img src="/blog/blog-virtual-stand-03.jpg" alt="">
	<figcaption>Primera idea Ciudad de Leniolabs.</figcaption>
</figure>
<p>Luego, el popular hashtag <em>#stayathome</em> nos golpeó: <strong>¿por qué no ilustrar nuestra propia casa en Leniolabs?</strong></p>
<p><strong>Cada habitación se referiría a un área de la empresa</strong>; teníamos nuestros videos de talleres y charlas en el garaje, nuestras publicaciones de blog en la biblioteca de la casa, el chat en vivo en la sala de estar, los juegos en el jardín, los desafíos de trivia en el desván, nuestro laboratorio en el sótano, el Bootcamp que estaban cocinando en la cocina, y la sección de trabajo en la sala de la oficina. Y todos fueron invitados; Queríamos compartir lo que sucede dentro de Leniolabs, nuestros talleres internos y los artículos que escribimos para compartir nuestro conocimiento.</p>
<figure>
    <img src="/blog/blog-virtual-stand-04.jpg" alt="">
	<figcaption>Diseño del sitio web de la casa de Leniolabs.</figcaption>
</figure>
<h2 id="codificar-el-diseño-y-hacerlo-receptivo"><a href="#codificar-el-dise%C3%B1o-y-hacerlo-receptivo" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Codificar el diseño y hacerlo receptivo</h2>
<p>Hubo un desafío para hacer que este sitio web fuera compatible con dispositivos móviles, ya que todo el sitio era una gran ilustración. Después de jugar con diferentes enfoques, decidimos usar <a href="https://grid.layoutit.com/" rel="nofollow noopener noreferrer" target="_blank">Layoutit</a> para crear una cuadrícula CSS. Exportamos cada habitación como un único SVG e hicimos de cada SVG un componente. Luego <strong>creamos una cuadrícula donde cada elemento de la cuadrícula era uno de estos componentes</strong>. Cambiamos el diseño y la posición de las áreas de la cuadrícula según el tamaño de la pantalla, pasando de un diseño de 4 columnas en pantallas grandes a una sola columna en dispositivos móviles.</p>
<figure>
    <img src="/blog/blog-virtual-stand-05.gif" alt="">
	<figcaption>Cuadrícula CSS y componentes SVG.</figcaption>
</figure>
<h2 id="la-tecnología-utilizada"><a href="#la-tecnolog%C3%ADa-utilizada" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>La tecnología utilizada</h2>
<p>Elegimos <a href="https://nuxtjs.org/" rel="nofollow noopener noreferrer" target="_blank">Nuxt</a> porque necesitábamos un sitio que durara 5 días pero con un mes para construirlo desde cero. No se perdió tiempo en la configuración del enrutador, los componentes importados automáticamente y una buena estructura de carpetas en un sitio prerenderizado. Y elegimos <a href="https://www.netlify.com/" rel="nofollow noopener noreferrer" target="_blank">Netlify</a> porque necesitábamos iterar y compartir los resultados con frecuencia. Una plataforma gratuita y sin servidor para impulsar e implementar.</p>
<h2 id="animaciones-css"><a href="#animaciones-css" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Animaciones CSS</h2>
<p>Usamos algunas animaciones pequeñas al pasar el mouse para hacer que la casa tuviera un poco más de vida, todo con movimiento reducido preferido para accesibilidad.</p>
<figure class="grid-gifs">
    <img src="/blog/blog-virtual-stand-06.gif" alt="">
    <img src="/blog/blog-virtual-stand-07.gif" alt="">
    <img src="/blog/blog-virtual-stand-08.gif" alt="">
    <img src="/blog/blog-virtual-stand-09.gif" alt="">
    <img src="/blog/blog-virtual-stand-10.gif" alt="">
    <img src="/blog/blog-virtual-stand-11.gif" alt="">
  <figcaption>Micro animaciones</figcaption>
</figure>
<h1 id="modo-nocturno-y-huevos-de-pascua"><a href="#modo-nocturno-y-huevos-de-pascua" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Modo nocturno y huevos de Pascua</h1>
<p><strong>Después de cierta hora, la casa se apaga</strong>, algunas luces están apagadas y otras encendidas. El gato dormido ahora está atrapando una araña; Leni (nuestra mascota alienígena) se queda dormida fuera de la casa. <strong>Nos encanta la idea de que cuanto más visites el sitio, más detalles encontrarás ocultos</strong>. Cada SVG es un componente reutilizable que aparece en cada página interna y cambia a medida que se activa el modo oscuro.</p>
<figure>
    <img src="/blog/blog-virtual-stand-12.gif" alt="">
    <img src="/blog/blog-virtual-stand-13.gif" alt="">
  <div class="grid-gifs-two">
    <img src="/blog/blog-virtual-stand-14.gif" alt="">
    <img src="/blog/blog-virtual-stand-15.gif" alt="">
    <figcaption>Modo diurno - modo nocturno.</figcaption>
  </div>
</figure>
<p>Entre las 4 pm y las 7 am, esta función agrega una clase al contenedor del sitio para activar el modo oscuro:</p>
<div class="nuxt-content-highlight"><pre class="language-javascript line-numbers"><code><span class="token operator">&lt;</span>template<span class="token operator">></span>
 <span class="token operator">&lt;</span>div <span class="token operator">:</span><span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"{ night: isDark }"</span><span class="token operator">></span>
 <span class="token spread operator">...</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>template<span class="token operator">></span>
<span class="token operator">&lt;</span>script<span class="token operator">></span>
 <span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token punctuation">{</span>
  <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword control-flow">return</span> <span class="token punctuation">{</span> <span class="token literal-property property">isDark</span><span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
 <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span>
  <span class="token function">updateTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>process<span class="token punctuation">.</span><span class="token property-access">client</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 
    <span class="token keyword">const</span> hours <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">getHours</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token property-access">isDark</span> <span class="token operator">=</span> hours <span class="token operator">&lt;</span> <span class="token number">7</span> <span class="token operator">||</span> hours <span class="token operator">></span> <span class="token number">16</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
 <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token spread operator">...</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">></span>
</code></pre></div>
<p>Este terminó siendo nuestro sitio oficial de eventos para Nerdearla, ya que lo seguirán haciendo en línea y somos parte de la edición 2021 del 20 al 23 de octubre. ¡Organizaremos juegos y enviaremos regalos a todos los que se unirán a nosotros este año! Pero incluso si no se une a la conferencia <strong>aún puede visitar nuestro stand virtual en <a href="https://nerdearla.leniolabs.com/" rel="nofollow noopener noreferrer" target="_blank">https://nerdearla.leniolabs.com</a></strong></p>
<p>Más detalles sobre la creación del sitio están en esta charla (versión en español):</p>
<iframe width="100%" height="460" src="https://www.youtube.com/embed/fUTEryzf6ag" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/building-an-svg-virtual-stand" data-v-5e4666ba>
      ←
      Building an SVG virtual stand
    </a></div> <div data-v-5e4666ba><a href="/posts/como-hice-un-generador-para-loaders-SVG" data-v-5e4666ba>
      Cómo hice un generador para loaders SVG con opciones Sass y SMIL
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/un-stand-virtual-con-SVG/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mastering SVG's stroke-miterlimit Attribute]]></title>
            <link>https://holasvg.com/posts/mastering-SVGs-stroke-miterlimit-Attribute</link>
            <guid>https://holasvg.com/posts/mastering-SVGs-stroke-miterlimit-Attribute</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Mastering SVG's stroke-miterlimit Attribute</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/mastering-svgs-stroke-miterlimit-attribute/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/mastering-SVGs-stroke-miterlimit-Attribute/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/mastering-SVGs-stroke-miterlimit-Attribute/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">11 June 2022</span> <h1>Mastering SVG's stroke-miterlimit Attribute</h1> <p class="inner-post-subtitle">An overlooked SVG attribute</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-miterlimit-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><p>So, SVG has this <code>stroke-miterlimit</code> presentation attribute. You’ve probably seen it when exporting an SVG from a graphic editor program, or perhaps you find out you could remove it without noticing any change to the visual appearance.</p>
<p>After a good amount of research, one of the first things I discovered is that the attribute works alongside <code>stroke-linejoin</code>, and I’ll show you how as well as a bunch of other things I learned about this interesting (and possibly overlooked) SVG attribute.</p>
<h2 id="tldr"><a href="#tldr" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>TLDR;</h2>
<p><code>stroke-miterlimit</code> depends on <code>stroke-linejoin</code>: if we use <code>round</code> or <code>bevel</code> for joins, then there’s no need to declare <code>stroke-miterlimit</code>. But if we use <code>miter</code> instead, we can still delete it and maybe the default value will be enough. Beware that many graphic software editors will add this attribute even when is not necessary.</p>
<h2 id="what-is-stroke-linejoin"><a href="#what-is-stroke-linejoin" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>What is <code>stroke-linejoin</code>?</h2>
<p>I know, we’re actually here to talk about <code>stroke-miterlimit</code>, but I want to start with <code>stroke-linejoin</code> because of how tightly they work together. This is the definition for <code>stroke-linejoin</code> pulled straight from the SVG Working Group (SVGWG):</p>
<blockquote>
<p><code>stroke-linejoin</code> specifies the shape to be used at the corners of paths or basic shapes when they are stroked.</p>
</blockquote>
<p>This means <strong>we can define how the corner looks when two lines meet at a point</strong>. And this attribute accepts five possible values, though two of them have <a href="https://github.com/w3c/svgwg/issues/592" rel="nofollow noopener noreferrer" target="_blank">no browser implementation</a> <a href="https://github.com/w3c/svgwg/issues/592" rel="nofollow noopener noreferrer" target="_blank"></a>and are <a href="https://svgwg.org/svg2-draft/painting.html#issue592" rel="nofollow noopener noreferrer" target="_blank">identified by the spec as at risk of being dropped</a>. So, I’ll briefly present the three supported values the attribute accepts.</p>
<p><strong><code>miter</code> is the default value</strong> and it just so happens to be the most important one of the three we’re looking at. If we don’t explicitly declare <code>stroke-linejoin</code> in the SVG code, then <code>miter</code> is used to shape the corner of a path. We know a join is set to <code>miter</code> when both edges meet at a sharp angle.</p>
<p>But we can also choose <code>round</code> which softens the edges with — you guessed it — rounded corners.</p>
<p>The <code>bevel</code> value, meanwhile, produces a flat edge that sort of looks like a cropped corner.</p>
<iframe height="300" scrolling="no" title="SVG stroke-linejoin supported values" src="https://codepen.io/marianab/embed/yLvVRbr?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/marianab/pen/yLvVRbr">
  SVG stroke-linejoin supported values&lt;/a> by Mariana Beldi (&lt;a href="https://codepen.io/marianab">@marianab&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="what-is-stroke-miterlimit"><a href="#what-is-stroke-miterlimit" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>What is <code>stroke-miterlimit</code>?</h2>
<p>OK, now that we know what <code>stroke-linejoin</code> is, let’s get back to the topic at hand and pick apart the definition of <code>stroke-miterlimit</code> from the book <a href="https://www.oreilly.com/library/view/using-svg-with/9781491921968/" rel="nofollow noopener noreferrer" target="_blank">Using SVG with CSS3 and HTML5</a>:</p>
<blockquote>
<p>[…] on really tight corners, you have to extend the stroke for quite a distance, before the two edges meet. For that reason, there is a secondary property: <code>stroke-miterlimit</code>. It defines how far you can extend the point when creating a miter corner.</p>
</blockquote>
<p>In other words, <code>stroke-miterlimit</code> sets how far the stroke of the edges goes before they can meet at a point. And only when the <code>stroke-linejoin</code> is <code>miter</code>.</p>
<figure>
    <img src="/blog/blog-miterlimit-02.png" alt="">
    <figcaption>Miter join with miter limit in grey.</figcaption>
</figure>
<p>So, the <code>stroke-miterlimit</code> value can be any positive integer, where <code>4</code> is the default value. The higher the value, the further the corner shape is allowed to go.</p>
<h2 id="how-they-work-together"><a href="#how-they-work-together" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>How they work together</h2>
<p>You probably have a good conceptual understanding now of how <code>stroke-linejoin</code> and <code>stroke-miterlimit</code> work together. But depending on the <code>stroke-miterlimit</code> value, you might get some seemingly quirky results.</p>
<p>Case in point: if <code>stroke-linejoin</code> is set to <code>miter</code>, it can actually wind up looking like the <code>bevel</code> value instead when the miter limit is too low. <a href="https://svgwg.org/svg2-draft/painting.html#LineJoin" rel="nofollow noopener noreferrer" target="_blank">Here’s the spec again</a> to help us understand why:</p>
<blockquote>
<p>If the miter length divided by the stroke width exceeds the <code>stroke-miterlimit</code> then [the <code>miter</code> value] is converted to a bevel.</p>
</blockquote>
<p>So, mathematically we could say that this:</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code>[miter length] / [stroke width] > [stroke-miterlimit] = miter
[miter length] / [stroke width] &lt; [stroke-miterlimit] = bevel
</code></pre></div>
<p>That makes sense, right? If the miter is unable to exceed the width of the stroke, then it ought to be a flat edge. Otherwise, the miter can grow and form a point.</p>
<p>Sometimes seeing is believing, so here’s Ana Tudor with a wonderful demo showing how the <code>stroke-miterlimit</code> value affects an SVG’s <code>stroke-linejoin</code>:</p>
<iframe height="300" scrolling="no" title="stroke-miterlimit" src="https://codepen.io/thebabydino/embed/GJEYbO?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen style="width:100%">
  See the Pen &lt;a href="https://codepen.io/thebabydino/pen/GJEYbO">
  stroke-miterlimit&lt;/a> by Ana Tudor (&lt;a href="https://codepen.io/thebabydino">@thebabydino&lt;/a>)
  on &lt;a href="https://codepen.io">CodePen&lt;/a>.
</iframe>
<h2 id="setting-miter-limits-in-design-apps"><a href="#setting-miter-limits-in-design-apps" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Setting miter limits in design apps</h2>
<p>Did you know that miter joins and limits are available in many of the design apps we use in our everyday work? Here’s where to find them in Illustrator, Figma, and Inkscape.</p>
<h3 id="setting-miter-limits-in-adobe-illustrator"><a href="#setting-miter-limits-in-adobe-illustrator" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Setting miter limits in Adobe Illustrator</h3>
<p>Illustrator has a way to modify the miter value when configuring a path’s stroke. You can find it in the “Stroke” settings on a path. Notice how — true to the spec — we are only able to set a value for the “Limit” when the path’s “Corner” is set to “Miter Join”.</p>
<figure>
    <img src="/blog/blog-miterlimit-03.gif" alt="">
    <figcaption>Applying stroke-miterlimit in Adobe Illustrator.</figcaption>
</figure>
<p>One nuance is that Illustrator has a default miter limit of <code>10</code> rather than the default <code>4</code>. I’ve noticed this every time I export the SVG file or copy and paste the resulting SVG code. That could be confusing when you open up the code because <strong>even if you do not change the miter limit value, Illustrator adds <code>stroke-miterlimit="10"</code> where you might expect <code>4</code> or perhaps no <code>stroke-miterlimit</code> at all.</strong></p>
<p>And that’s true even if we choose a different <code>stroke-linejoin</code> value other than “Miter Join”. Here is the code I got when exporting an SVG with <code>stroke-linejoin="round"</code>.</p>
<div class="nuxt-content-highlight"><pre class="language-html line-numbers"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 16 10<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>path</span> <span class="token attr-name">stroke-width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-linejoin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>round<span class="token punctuation">"</span></span> <span class="token attr-name">stroke-miterlimit</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token attr-name">d</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>M0 1h15.8S4.8 5.5 2 9.5<span class="token punctuation">"</span></span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#000<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<p>The <code>stroke-miterlimit</code> shouldn’t be there as it only works with <code>stroke-linejoin="miter"</code>. Here are a couple of workarounds for that:</p>
<ul>
<li>Set the “Limit” value to 4, as it is the default in SVG and is the only value that doesn’t appear in the code.</li>
<li>Use the “Export As” or “Export for Screen” options instead of “Save As” or copy-pasting the vectors directly.</li>
</ul>
<p>If you’d like to see that fixed, join me and <a href="https://illustrator.uservoice.com/forums/333657-illustrator-desktop-feature-requests/suggestions/33947290-allow-users-to-change-default-setting-for-miter-li" rel="nofollow noopener noreferrer" target="_blank">upvote the request to make it happen</a>.</p>
<h3 id="setting-miter-limits-in-figma"><a href="#setting-miter-limits-in-figma" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Setting miter limits in Figma</h3>
<p>Miter joins and limits are slightly different in Figma. When we click the node of an angle on a shape, under the three dots of the Stroke section, we can find a place to set the join of a corner. The option “Miter angle” appears by default, but only when the join is set to miter:</p>
<figure>
    <img src="/blog/blog-miterlimit-04.gif" alt="">
    <figcaption>Applying stroke-miterlimit in Figma</figcaption>
</figure>
<p>This part works is similar to Illustrator except for how Figma allows us to set the miter angle in degree units instead of decimal values. There are some other specific nuances to point out:</p>
<ul>
<li>The angle is 7.17° by default and there is no way to set a lower value. When exporting the SVG, that value is becomes <code>stroke-miterlimit='16</code>' in the markup, which is different from both the SVG spec and the Illustrator default.</li>
<li>The max value is 180°, and when drawing with this option, the join is automatically switched to bevel.</li>
<li>When exporting with bevel join, the <code>stroke-miterlimit</code> is there in the code, but it keeps the value that was set when the miter angle was last active (Illustrator does the same thing).</li>
<li>When exporting the SVG with a round join, the path is expanded and we no longer have a stroke, but a path with a fill color.</li>
</ul>
<p>I was unable to find a way to avoid the extra code that ends up in the exported SVG when <code>stroke-miterlimit</code> is unneeded.</p>
<h3 id="setting-miter-limits-in-inkscape"><a href="#setting-miter-limits-in-inkscape" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Setting miter limits in Inkscape</h3>
<p>Inkscape works exactly the way I’d expect a design app to manage miter joins and limits. When selecting a a miter join, the default value is <code>4</code>, exactly what it is in the spec. Better yet, <code>stroke-miterlimit</code> is excluded from the exported SVG code when it is the default value!</p>
<figure>
    <img src="/blog/blog-miterlimit-05.gif" alt="">
    <figcaption>Applying stroke-miterlimit in Inkscape.</figcaption>
</figure>
<p>Still, if we export any path with bevel or round after the limit was modified, the <code>stroke-miterlimit</code> will be back in the code, unless we keep the 4 units of the default in the Limit box. Same trick as Illustrator.</p>
<p>These examples will work nicely if we choose the <strong>Save As → Optimized SVG</strong> option. Inkscape is free and open source and, at the end of the day, has the neatest code as far as <code>stroke-miterlimit</code> goes and the many options to optimize the code for exporting.</p>
<p>But if you are more familiar with Illustrator (like I am), there is a workaround to keep in mind. Figma, because of the degree units and the expansion of the strokes, feels like the more distant from the specs and expected behavior.</p>
<h2 id="wrapping-up"><a href="#wrapping-up" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Wrapping up</h2>
<p>And that’s what I learned about SVG’s <code>stroke-miterlimit</code> attribute. It’s another one of those easy-to-overlook things we might find ourselves blindly cutting out, particularly when <a href="https://css-tricks.com/tools-for-optimizing-svg/" rel="nofollow noopener noreferrer" target="_blank">optimizing an SVG file</a>. So, now when you find yourself setting <code>stroke-miterlimit</code> you’ll know what it does, how it works alongside <code>stroke-linejoin</code>, and why the heck you might get a beveled join when setting a miter limit value.</p>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/mastering-svgs-stroke-miterlimit-attribute/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a>. Thanks to the edits of <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a> ♥</p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/dominar-el-atributo-SVG-stroke-miterlimit" data-v-5e4666ba>
      ←
      Dominar el atributo de SVG stroke-miterlimit
    </a></div> <div data-v-5e4666ba><a href="/posts/8-tricks-for-SVG-optimization" data-v-5e4666ba>
      8 tricks for SVG optimization
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/mastering-SVGs-stroke-miterlimit-Attribute/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Usar y reusar todo en SVG … ¡Incluso animaciones!]]></title>
            <link>https://holasvg.com/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones</link>
            <guid>https://holasvg.com/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>Usar y reusar todo en SVG … ¡Incluso animaciones!</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="undefined"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">10 March 2020</span> <h1>Usar y reusar todo en SVG … ¡Incluso animaciones!</h1> <p class="inner-post-subtitle">Cómo crear y optimizar SVG y animaciones CSS</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/css?type=posts" class="card-category"><span>#css</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/espanol?type=posts" class="card-category"><span>#espanol</span></a></header> <img src="/blog/blog-use-and-reuse-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><blockquote>
<p>Read the english version <a href="/posts/use-and-reuse-everything-in-svg-even-animations">here</a>.</p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<p>Si estás familiarizado con SVG y animaciones CSS, o empezaste a trabajar con ellas a menudo, acá hay algunas ideas a tener en cuenta antes de comenzar a trabajar. Este artículo trata sobre cómo escribir y optimizar código con <strong>el elemento <code>&lt;use></code>, las variables CSS y las animaciones CSS.</strong></p>
<p><video autoplay controls loop src="https://css-tricks.com/wp-content/uploads/2020/01/cubes.mp4" name="fitvid0"></video></p>
<h2 id="parte-1-el-elemento-svg-use"><a href="#parte-1-el-elemento-svg-use" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Parte 1: El elemento SVG <use></use></h2>
<p>Si sos un desarrollador al que le gusta mantener su código <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="nofollow noopener noreferrer" target="_blank">DRY</a> o sos de usar las variables Sass / CSS, es muy probable que te guste esta etiqueta.</p>
<p>Digamos que tenés un elemento que se repite muchas veces en tu gráfico. En lugar de repetir una parte compleja del código varias veces en el SVG, se puede definir esta parte una vez y luego clonarla en otro lugar del documento con el elemento <code>&lt;use></code>. Esto no solo reducirá una enorme cantidad de código, sino que también lo hará más simple y fácil de manipular.</p>
<p>Para comenzar a implementar el elemento <code>&lt;use></code>, abrí tu SVG y seguí estos pasos:</p>
<ol>
<li>Identificá la parte del código que querés clonar</li>
<li>Agregale un ID a esa parte</li>
<li>Linkeala dentro del tag <code>&lt;use></code> de esta forma: <code>&lt;use xlink:href="#id"/></code></li>
</ol>
<p>Eso es todo! Tu nuevo clon está listo, ahora podés cambiarle los atributos que necesites (por ej. la posición <code>x</code> o la posición <code>y</code>).</p>
<h3 id="veamos-un-ejemplo-muy-conveniente"><a href="#veamos-un-ejemplo-muy-conveniente" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Veamos un ejemplo muy conveniente</h3>
<p>Este es un caso real donde necesitaba animar un cubo grande compuesto por cubos más pequeños. Algo así como un <a href="https://www.rubiks.com/en-us/" rel="nofollow noopener noreferrer" target="_blank">Cubo Rubik</a>.</p>
<p>Empecemos a dibujar un pequeño cubo en SVG usando formas básicas (SVG basic shapes, en este caso sólo rect) y transformaciones (transforms):</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-130 -20 300 100<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>cubo<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>     
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>skewY(30)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>     
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>skewY(-30) translate(21 24.3)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>     
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span>  <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scale(1.41,.81)   rotate(45) translate(0 -21)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<iframe width="100%" height="300" scrolling="no" title="1. Cube unit with SVG shapes and transforms" src="https://codepen.io/marianab/embed/XWWQbYP?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/XWWQbYP'>1. Cube unit with SVG shapes and transforms&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Las formas (rects) están agrupadas con el elemento <code>&lt;g></code> (group) para poner agregarle un <code>ID</code> (#cubo) a toda la figura.</p>
<p>Ahora, hagamos un cubo más grande clonando la unidad que acabamos de crear. Primero hay que ubicar el grupo dentro del elemento <code>&lt;defs></code> dentro del tag de SVG. Dentro de <code>&lt;defs></code> podemos poner cualquier cosa que queramos reutilizar, puede ser una forma, un grupo, una gradiente, casi cualquier elemento de SVG. No se renderizará nada de lo que incluyamos dentro de <code>&lt;defs></code>, hasta que lo usemos fuera de él.</p>
<p>Para poder usar la figura que acabamos de definir, vamos a linkearla con su ID dentro del elemento <code>&lt;use></code> todas las veces que lo necesitemos, cambiando su posición <code>x</code> y su posición <code>y</code> en cada clon de la siguiente manera:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#cubo<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>142<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>124<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#cubo<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>124<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span> 
<span class="token comment">&lt;!-- ... --></span>
</code></pre></div>
<iframe width="100%" height="300" scrolling="no" title="2. Big cube reusing content SVG <use>" src="https://codepen.io/marianab/embed/wvvZXqG?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/wvvZXqG'>2. Big cube reusing content SVG &amplt;use&ampgt;&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Ahora hay que ubicar cada clon del cubo pequeño, recordando que el último elemento se muestra al frente, con esto tendremos nuestro primer gran cubo listo!</p>
<blockquote>
<p><code>xlink:href </code>está obsoleto desde SVG2, pero es mejor usarlo por cuestiones de compatibilidad. En algunos navegadores modernos se puede simplemente usar <code>href</code> pero al momento de escribir esta nota lo testié en Safari y no está funcionando ahí. Si usás <code>xlink:href</code> asegurate de incluir este namespace en tu SVG tag: <code>xmlns:xlink="http://www.w3.org/1999/xlink"</code> (no lo necesitas si decidís usar <code>href</code>).</p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<h2 id="parte-2-usando-variables-css-para-aplicar-diferentes-estilos-al-gráfico-reutilizado"><a href="#parte-2-usando-variables-css-para-aplicar-diferentes-estilos-al-gr%C3%A1fico-reutilizado" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Parte 2: Usando variables CSS para aplicar diferentes estilos al gráfico reutilizado</h2>
<p>Elegí un color principal para el cubo, con tonalidades más claras y oscuras en los lados y el borde. Pero qué pasa si quiero crear un nuevo cubo con otro color?
Podemos reemplazar el color de relleno y bordes con variables CSS para hacer estos atributos más flexibles. De esta manera, podremos reutilizar la misma unidad del pequeño cubo con otra paleta, en vez de definir un segundo pequeño cubo con distintos colores.</p>
<p>Por qué no agregar una clase al nuevo cubo y cambiar los colores con CSS? Eso haremos, pero primero, intentá inspeccionar el elemento <code>&lt;use></code>. Vas a notar que se renderiza en el Shadow DOM. Significa que no es vulnerable a scripts o estilos, como los elementos en el DOM normal. Cualquier valor que definas en la figura dentro de <code>&lt;defs></code> será heredado por todas sus instancias y no podrán reescribirse con CSS. Pero si remplazamos esos valores con variables, podremos <a href="https://tympanus.net/codrops/2015/07/16/styling-svg-use-content-css/" rel="nofollow noopener noreferrer" target="_blank">controlarlas con CSS</a>.</p>
<p>En nuestra unidad de cubo pequeño, reemplazaremos cada valor de relleno y borde con un nombre de variable semántico.</p>
<p>Por ejemplo esto:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#00affa<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#0079ad<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>… puede reemplazarse con esto:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>var(--colorPrincipal)<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>var(--colorBorde)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>A partir de acá, podemos duplicar el SVG anterior para crear un nuevo cubo grande. Sin embargo, no necesitamos duplicar el elemento <code>&lt;defs></code> si vamos a tener ambos cubos en el mismo documento. Podemos agregar una clase a cada SVG y controlar la paleta de colores con CSS, defefiniendo los valores de cada variable.</p>
<p>Creemos una paleta para el cubo azul y otra para el cubo rosa:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.cubo-azul</span></span> <span class="token punctuation">{</span>   
 <span class="token variable">--colorPrincipal</span><span class="token punctuation">:</span> <span class="token hexcode color">#009CDE</span><span class="token punctuation">;</span>   
 <span class="token variable">--colorBorde</span><span class="token punctuation">:</span> <span class="token hexcode color">#0079ad</span><span class="token punctuation">;</span>   
 <span class="token variable">--colorClaro</span><span class="token punctuation">:</span> <span class="token hexcode color">#00affa</span><span class="token punctuation">;</span>   
 <span class="token variable">--colorOscuro</span><span class="token punctuation">:</span> <span class="token hexcode color">#008bc7</span><span class="token punctuation">;</span> 
<span class="token punctuation">}</span>  
<span class="token selector"><span class="token class">.cubo-rosa</span></span> <span class="token punctuation">{</span>   
 <span class="token variable">--colorPrincipal</span><span class="token punctuation">:</span> <span class="token hexcode color">#de0063</span><span class="token punctuation">;</span>   
 <span class="token variable">--colorBorde</span><span class="token punctuation">:</span> <span class="token hexcode color">#ad004e</span><span class="token punctuation">;</span>   
 <span class="token variable">--colorClaro</span><span class="token punctuation">:</span> <span class="token hexcode color">#fa0070</span><span class="token punctuation">;</span>   
 <span class="token variable">--colorOscuro</span><span class="token punctuation">:</span> <span class="token hexcode color">#c7005a</span><span class="token punctuation">;</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<iframe width="100%" height="300" scrolling="no" title="3. Duplicating big cube with SVG <use> and CSS variables" src="https://codepen.io/marianab/embed/gOOJQmw?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/gOOJQmw'>3. Duplicating big cube with SVG &amplt;use&ampgt; and CSS variables&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>De esta manera podemos crear la cantidad de cubos que queramos y cambiar todos los colores desde un solo lugar.</p>
<div aria-hidden="true" class="separator">***</div>
<h2 id="parte-3-reusando-animaciones"><a href="#parte-3-reusando-animaciones" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Parte 3: Reusando animaciones</h2>
<p>La idea de esta parte es quebrar el cubo cuando pasamos el mouse sobre él — algo así como una vista explotada, algunas piezas se alejarán del centro cuando pasamos el cursor sobre los cubos.</p>
<iframe width="100%" height="300" scrolling="no" title="4. Big cubes animation with SVG <use> and CSS variables" src="https://codepen.io/marianab/embed/KKKYdxE?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/KKKYdxE'>4. Big cubes animation with SVG &amplt;use&ampgt; and CSS variables&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Empecemos definiendo dos movimientos, uno por cada eje: <code>move Y</code> y <code>move X</code>. Al definir las animaciones en movimientos, podremos reutilizarlas en cada cubo. Las animaciones consistirán en mover al cubo desde su posición inicial hasta 30px o 50px de distancia en una misma dirección. Podemos usar un transform translate (<code>X</code> o <code>Y</code>) para lograrlo. Por ejemplo:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token atrule"><span class="token rule">@keyframes</span> moveX</span> <span class="token punctuation">{</span>   
 <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateX</span><span class="token punctuation">(</span><span class="token number">-35</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>Pero si queremos reutilizar esta animación, es mejor remplazar el valor numérico por una variable:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token atrule"><span class="token rule">@keyframes</span> moveX</span> <span class="token punctuation">{</span>   
 <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateX</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span><span class="token variable">--translate</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>Si la variable no está definida, el valor por defecto va a ser 35px.
Ahora necesitamos al menos una clase para enlazar a esta animación. En este caso serán dos clases, para mover los cubos en el eje x: <code>.m-izquierda</code> y <code>.m-derecha</code>.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.m-izquierda</span><span class="token punctuation">,</span> <span class="token class">.m-derecha</span></span> <span class="token punctuation">{</span>    
 <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token unit">s</span> moveX alternate infinite<span class="token punctuation">;</span>  
<span class="token punctuation">}</span>
</code></pre></div>
<p>Para que el cubo se mueva a la izquierda, necesitamos un valor negativo, pero también podemos declarar un valor numérico distinto. Podemos definir nuestra variable dentro de la clase <code>.m-izquierda</code> así:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.m-izquierda</span></span> <span class="token punctuation">{</span> <span class="token variable">--translate</span><span class="token punctuation">:</span> <span class="token number">-50</span><span class="token unit">px</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
</code></pre></div>
<p>Acá estamos declarando que, cuando agreguemos la clase <code>.m-izquierda</code> a un elemento, se lanzará la animación <code>moveX</code> (la que definimos en los<code> @keyframes</code>) que tardará dos segundos en moverse en el eje x hasta alcanzar una nueva posición 50px a la izquierda (los números negativos se mueven a la izquierda). Luego, la animación alterna de dirección para empezar a moverse desde esta última posición durante dos segundos hasta alcanzar su estado inicial. Lo hará en un loop infinito, porque eso hemos declarado al poner infinite.</p>
<p>Podemos declarar otra variable para la clase <code>.m-derecha</code> pero si no lo hacemos, recordá que tomará el valor por defecto de 35px que declaramos al principio.</p>
<p>Por defecto el valor de <code>animation-play-state</code> es <code>running</code> pero quizás no queremos que los cubos se muevan todo el tiempo. Sería muy molesto si usamos estas cubos en un sitio con texto cerca de ellos. Así que intentaremos hacer que la animación se ejecute sólo cuando pasamos el cursor por encima:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">svg<span class="token pseudo-class">:hover</span> <span class="token class">.m-izquierda</span></span> <span class="token punctuation">{</span>
 <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token unit">s</span> moveX alternate infinite<span class="token punctuation">;</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>Podés probar este código por tu cuenta y verás que la animación salta muy rápido a su estado inicial cada vez que quitamos el cursor de encima. Para evitar esto, podemos usar el valor <code>paused</code> al final de la propiedad animation:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.m-izquierda</span></span> <span class="token punctuation">{</span>   
 <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token unit">s</span> moveX alternate infinite paused<span class="token punctuation">;</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>Ahora la animación está pausada pero se disparará on hover agregando esta línea de CSS:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">svg<span class="token pseudo-class">:hover</span> *</span> <span class="token punctuation">{</span>
 <span class="token property">animation-play-state</span><span class="token punctuation">:</span> running<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div>
<p>Podemos aplicar cada una de estas clases a diferentes elementos dentro del SVG. En el primer cubo estamos moviendo algunas unidades; en el segundo cubo, estamos aplicando estas clases a grupos de unidades.</p>
<h3 id="para-terminar"><a href="#para-terminar" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Para terminar…</h3>
<p>Tardé mucho en darme cuenta que podía reutilizar un simple cubo pequeño para construir todo. Trabajé en esa unidad para hacerla isométrica y así poder alinearla fácilmente con las demás unidades. A esta altura mi unidad era un <code>path</code>, pero decidí reemplazarlo por SVG rect para reducir la cantidad de código y hacerlo más legible.</p>
<p>Aprendí que es mejor tomarse un tiempo para analizar qué se puede hacer con SVG antes de embarcarse en la tarea. En este caso hubo que modificar el diseño original levemente, pero esa modificación permitió hacer un código más mantenible y escalable. Puede tomar más tiempo al principio pero a largo plazo ganaremos mucho más.</p>
<blockquote>
<p>Este artículo fue publicado originalmente en  <a href="https://css-tricks.com/use-and-reuse-everything-in-svg-even-animations/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> editado por <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> y <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a></p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/svg-mas-alla-de-la-compresion-automatica-con-el-elemento-use" data-v-5e4666ba>
      ←
      SVG más allá de la compresión automática con el elemento “use”
    </a></div> <div data-v-5e4666ba><a href="/posts/use-and-reuse-everything-in-svg-even-animations" data-v-5e4666ba>
      How to use and reuse everything in SVG… even animations
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to use and reuse everything in SVG… even animations]]></title>
            <link>https://holasvg.com/posts/use-and-reuse-everything-in-svg-even-animations</link>
            <guid>https://holasvg.com/posts/use-and-reuse-everything-in-svg-even-animations</guid>
            <content:encoded><![CDATA[<!doctype html>
<html data-n-head-ssr lang="en" data-n-head="%7B%22lang%22:%7B%22ssr%22:%22en%22%7D%7D">
  <head>
    <title>How to use and reuse everything in SVG… even animations</title><meta data-n-head="ssr" charset="utf-8"><meta data-n-head="ssr" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="ssr" name="msapplication-TileColor" content="#ffffff"><meta data-n-head="ssr" name="msapplication-TileColor" content="/ms-icon-144x144.png"><meta data-n-head="ssr" name="theme-color" content="#ffffff"><meta data-n-head="ssr" data-hid="twitter:image" name="Mariana Beldi Website. Portfolio, blog, talks, about SVG, code and design." content="https://holasvg.com/meta-img.jpg" property="twitter:image"><meta data-n-head="ssr" data-hid="description" name="description" content="undefined"><meta data-n-head="ssr" data-hid="canonical" name="canonical" content="https://css-tricks.com/use-and-reuse-everything-in-svg-even-animations/"><link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="ssr" rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"><link data-n-head="ssr" rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link data-n-head="ssr" rel="icon" type="image/png" sizes="192x192" href="/favicon-16x16.png"><link data-n-head="ssr" rel="manifest" href="/manifest.json"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Aleo:wght@400;700&display=swap"><link data-n-head="ssr" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;1,400&display=swap"><script data-n-head="ssr" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" data-ad-client="ca-pub-6891714364460101" async></script><link rel="preload" href="/_nuxt/abd6a50.js" as="script"><link rel="preload" href="/_nuxt/23afe77.js" as="script"><link rel="preload" href="/_nuxt/d1e194c.js" as="script"><link rel="preload" href="/_nuxt/7afb437.js" as="script"><link rel="preload" href="/_nuxt/d5db247.js" as="script"><style data-vue-ssr-id="517a8dd7:0 fa7ff0ca:0 4e8213bc:0 6d8724b0:0 269ae7fd:0 af3bf052:0 61dff3ac:0 4eaf85b9:0">code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#000;z-index:999999}.nuxt-progress.nuxt-progress-notransition{transition:none}.nuxt-progress-failed{background-color:red}@view-transition{navigation:auto}:root{--darkblue:#1d1d46;--darkbluergb:29 29 70;--blue:#47509b;--red:#b3002d;--orange:#ff4b33;--green:#01828d;--darkgreen:#00828f;--lightgreen:#79e3e8;--yellow:#fee7a3;--yellowrgb:254 231 163;--navH:50px;--lightblue:#9a9ab9;--lightgrey:#f2f2f2}*{box-sizing:border-box}:after,:before{box-sizing:inherit}:focus:not(.focus-visible),:focus:not(:focus-visible){outline:0}:focus{outline:5px auto #01828d;outline:auto 5px var(--green)}blockquote,body,dd,dl,figure,h1,h2,h3,h4,p{margin:0}ol:where([role=list]),ul:where([role=list]){list-style:none;margin:0;padding:0}button,input,select,textarea{font:inherit}img,picture{display:block;max-width:100%}@media(prefers-reduced-motion:reduce){html[focus-within]{scroll-behavior:auto}html:focus-within{scroll-behavior:auto}*,:after,:before{animation-duration:NaNs!important;animation-iteration-count:1!important;transition-duration:NaNs!important;scroll-behavior:auto!important}}::-moz-selection{background:#fee7a3;background:var(--yellow)}::selection{background:#fee7a3;background:var(--yellow)}html{scroll-behavior:smooth}body{color:#1d1d46;color:var(--darkblue);font-family:"IBM Plex Sans",serif;margin:0 auto;overflow-x:hidden;text-rendering:optimizeSpeed}h1{font-size:2rem;line-height:1.1}h2{font-size:2.2rem;margin-bottom:2rem}h3{font-size:1.5rem;margin-bottom:1rem}p{line-height:1.5}mark{background-color:#fee7a3;background-color:var(--yellow)}a{color:#00828f;color:var(--darkgreen)}a:focus,a:hover{cursor:pointer;color:#47509b;color:var(--blue)}.border-top{border-top:6px double #dbdbe4;margin-top:3rem}a.btn{background-color:#b3002d;background-color:var(--red);border-radius:4px;border:0;color:#fff;font-family:inherit;font-size:1.2rem;padding:.8rem 1.6rem;text-decoration:none}a.btn:focus,a.btn:hover{cursor:pointer;background-color:#da1f4e}.red{color:#b3002d;color:var(--red)}header{margin:0 auto;max-width:90%;padding-top:7rem}.wrapper{margin:0 auto;max-width:74rem;width:100%}.pattern{background-image:linear-gradient(0deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,rgba(0,0,0,.1) 25%,rgba(0,0,0,.1) 26%,transparent 27%,transparent 74%,rgba(0,0,0,.1) 75%,rgba(0,0,0,.1) 76%,transparent 77%,transparent);background-size:18px 18px;height:100%}@media screen and (min-width:56.25em){h1{font-size:3rem}header{margin-bottom:4em;max-width:67%}.wrapper{margin:3em auto}}nav[data-v-022dd828]{background-color:#fff;border-bottom:6px double var(--green);font-size:1.5rem;position:fixed;top:0;width:100%;z-index:9}nav ul[data-v-022dd828]{align-items:center;display:flex;grid-gap:2.2rem;gap:2.2rem;justify-content:center;height:var(--navH);list-style-type:none;margin:0;padding-left:0}nav li[data-v-022dd828]{position:relative}nav li a[data-v-022dd828]{color:var(--red);text-decoration:none}nav li:focus a[data-v-022dd828],nav li:hover a[data-v-022dd828]{color:var(--green);text-decoration:none}nav li.active a[data-v-022dd828]:before,nav li:hover:not(.logo-icon) a[data-v-022dd828]:before{content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30'%3E%3Cpath fill='%2300b6c6' d='M.1 0L0 22.4l6.2-5.2 7.3 10.7.3-22.7-6.2 5.2L.1 0z'/%3E%3C/svg%3E") no-repeat;display:block;height:22px;width:14px;position:absolute;right:-20px;top:0;transform:rotate(45deg)}.arrow-back{font-size:2rem}.arrow-back:focus,.arrow-back:hover{color:var(--red)}.inner-post-head+img{height:480px;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;width:100%}.inner-post-head{margin-bottom:2rem;position:relative}.inner-post-head a.btn{position:absolute;top:calc(var(--navH) + 2rem);right:0}.inner-post-head h1{margin:1rem 0 0}.inner-post-head .inner-post-subtitle{color:var(--darkblue);display:block;font-size:2rem;margin:0 0 2.5rem;opacity:.4}.inner-post-body{background:#fff;box-shadow:0 2px 2px 2px rgba(30,29,69,.1);border-radius:2px;font-family:"IBM Plex Sans",sans-serif;font-size:1.2rem;line-height:1.5;margin:0 auto;max-width:78ch;padding:2rem 6rem 4rem;transform:translateY(-2rem)}@media screen and (max-width:37.5em){.inner-post-body{font-size:1.1rem;padding:2rem 2rem 4rem}}.inner-post-body h2,.inner-post-body h3{font-weight:500;line-height:1.3}.inner-post-body h2{font-size:2.4rem;margin:6rem 0 2rem}.inner-post-body h3{font-size:1.7rem;margin:4rem 0 1rem}.inner-post-body li,.inner-post-body p{opacity:.8;margin-bottom:1.5rem}.inner-post-body figure{margin:2rem 0;text-align:center}.inner-post-body figcaption{color:var(--lightblue);flex:1 1 100%;font-size:1rem;text-align:center}.inner-post-body iframe{margin-top:1rem}.inner-post-body ul li{margin-bottom:1rem}.inner-post-body .flex-imgs{align-items:center;display:flex;flex-wrap:wrap;justify-content:center}.inner-post-body .flex-imgs figcaption{flex:1 1 100%;margin-top:5px}.inner-post-body .flex-imgs.two img{max-width:340px;width:100%}.separator{letter-spacing:1em;text-align:center}.grid-gifs{display:flex;flex-wrap:wrap;align-items:flex-start}.grid-gifs img{margin:2px;width:calc(33.33333% - 4px)}.grid-gifs-two{display:flex;flex-wrap:wrap}.grid-gifs-two>img{margin:2px;width:calc(50% - 4px)}blockquote{border-left:4px solid rgba(var(--darkbluergb)/20%);color:rgba(var(--darkbluergb)/80%);font-size:1.2rem;font-style:italic;line-height:1.8;margin:4rem 0;padding:0 2rem}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:rgba(var(--darkbluergb)/4%);border-radius:4px;color:var(--darkblue);font-size:1rem;margin:2rem auto}code{background-color:#f6f6f8;word-break:break-word}video{max-width:100%}.vimeo{max-height:80vh}@media screen and (max-width:56.25em){blockquote{font-size:1.3rem;margin:0}}.footer-links[data-v-5e4666ba]{display:flex;flex-wrap:wrap;font-size:1.1rem;justify-content:space-between;margin:2rem auto}.footer-links a[data-v-5e4666ba]:hover,.footer-links[data-v-5e4666ba]:focus{color:var(--red)}.footer-links div[data-v-5e4666ba]{margin:1rem}.footer-links div+div[data-v-5e4666ba]{text-align:right}.contact[data-v-08850a32]{padding:0 1em 2em}.contact h2[data-v-08850a32]{font-size:3rem;margin:0}.contact p[data-v-08850a32]{font-size:2rem;margin:0}.contact a[data-v-08850a32]:focus,.contact a[data-v-08850a32]:hover{color:var(--red)}.social a[data-v-08850a32]{display:inline-block}.social a:focus svg[data-v-08850a32],.social a:hover svg[data-v-08850a32]{fill:var(--red);transition:all .5s ease;filter:hue-rotate(1turn)}.social svg[data-v-08850a32]{fill:var(--darkblue);margin:.6em 1em 0 0;width:2rem}@media screen and (min-width:56.25em){.contact[data-v-08850a32]{border-top:6px double;padding-top:2em}}footer[data-v-27ba9c71]{background-color:var(--lightgreen);border-top:6px double;padding:.5em;text-align:center}</style><link rel="preload" href="/_nuxt/static/1766065364/posts/use-and-reuse-everything-in-svg-even-animations/state.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/posts/use-and-reuse-everything-in-svg-even-animations/payload.js" as="script"><link rel="preload" href="/_nuxt/static/1766065364/manifest.js" as="script">
  </head>
  <body>
    <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><nav data-v-022dd828><ul data-v-022dd828><li class="logo-icon" data-v-022dd828><a href="/" class="nuxt-link-active" data-v-022dd828><svg viewBox="0 -10 180 180" width="30" height="30" data-v-022dd828><ellipse cx="90" cy="90" rx="86.36" ry="77.72" fill="#00b6c6" data-v-022dd828></ellipse> <path d="m43.39 3.64-.68 138.79 42.49-32.07 50 66 2-140-42.4 32.05Z" fill="#fee7a3" data-v-022dd828></path></svg></a></li> <li data-v-022dd828><a href="/work" data-v-022dd828>Work</a></li> <li data-v-022dd828><a href="/blog" data-v-022dd828>Blog</a></li> <li data-v-022dd828><a href="/talks" data-v-022dd828>Talks</a></li></ul></nav> <div class="inner-post"><header class="inner-post-head"><a href="https://holasvg.com/feed.xml" class="btn">RSS</a> <a href="/blog" class="arrow-back">←</a> <span class="card-date">10 March 2020</span> <h1>How to use and reuse everything in SVG… even animations</h1> <p class="inner-post-subtitle">Build and optimize SVG and CSS animations.</p> <a href="/categories/svg?type=posts" class="card-category"><span>#svg</span></a><a href="/categories/css?type=posts" class="card-category"><span>#css</span></a><a href="/categories/tutorial?type=posts" class="card-category"><span>#tutorial</span></a><a href="/categories/english?type=posts" class="card-category"><span>#english</span></a></header> <img src="/blog/blog-use-and-reuse-01.png"> <div class="pattern"><article class="inner-post-body"><div class="nuxt-content"><blockquote>
<p>Leer versión en español <a href="/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones">acá</a>.</p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<p>If you are familiar with SVG and CSS animations and starting to work with them often, here are some ideas you might want to keep in mind before jumping into the next job. This article will be about learning how to build and optimize your code with <strong>the <code>&lt;use></code> element, CSS Variables and CSS animations</strong>.</p>
<p><video autoplay controls loop src="https://css-tricks.com/wp-content/uploads/2020/01/cubes.mp4" name="fitvid0"></video></p>
<h2 id="part-1-the-svg-useelement"><a href="#part-1-the-svg-useelement" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Part 1: The SVG <use> element</use></h2>
<p>If you are a developer that likes to keep your code <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="nofollow noopener noreferrer" target="_blank">DRY</a> or a big fan of Sass/CSS variables, there is a good chance that you will like this tag.</p>
<p>Let's say you have an element that is repeated many times in your graphic. Instead of having a complex part of your code repeated many times in your SVG, you can define this part once and then clone it somewhere else in your document with the <code>&lt;use></code> element. This will not only reduce an enormous amount of code but also will make your markup simpler and easier to manipulate.</p>
<p>To start implementing the <code>&lt;use></code> element, go to your SVG and follow these steps:</p>
<ol>
<li>Identify the part of the code that you want to clone</li>
<li>Add an ID to that part</li>
<li>Link it inside your <code>&lt;use></code> tag like this: <code>&lt;use xlink:href="#id"/></code></li>
</ol>
<p>That's it! Your new clone is ready, now you can change its attributes (e.g. <code>x</code> and <code>y</code> position) to fit your needs.</p>
<h3 id="lets-dive-into-a-very-convenient-example"><a href="#lets-dive-into-a-very-convenient-example" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Let's dive into a very convenient example</h3>
<p>I want to share this real case where I needed to animate a big cube made of little cube units. (Imagine the classic <a href="https://www.rubiks.com/en-us/" rel="nofollow noopener noreferrer" target="_blank">Rubik's Cube</a>.)</p>
<p>We'll start by drawing the cube unit in SVG using basic shapes and transforms:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span> <span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-130 -20 300 100<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>g</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>cube<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>     
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>skewY(30)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>     
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span> <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>skewY(-30) translate(21 24.3)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>     
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>21<span class="token punctuation">"</span></span>  <span class="token attr-name">transform</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scale(1.41,.81)   rotate(45) translate(0 -21)<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>   
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>g</span><span class="token punctuation">></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">></span></span>
</code></pre></div>
<iframe width="100%" height="300" scrolling="no" title="1. Cube unit with SVG shapes and transforms" src="https://codepen.io/marianab/embed/XWWQbYP?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/XWWQbYP'>1. Cube unit with SVG shapes and transforms&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Note that the shapes are grouped in a <code>&lt;g></code> element so we can add the <code>ID</code> to the whole figure.</p>
<p>Next, let's build a bigger cube cloning this unit. First, we need to wrap the cube from the previous example inside the <code>&lt;defs></code> tag inside the SVG. In the <code>&lt;defs></code> element we can put whatever we want to reuse, which could be a single shape, a group, a gradient.. almost any SVG element. They won't render anywhere unless we use them outside this tag.</p>
<p>Then we can link the unit as many times as we want using its ID and change the <code>x</code> and <code>y</code> position on every clone like this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#cube<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>142<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>124<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span> <span class="token attr-name"><span class="token namespace">xlink:</span>href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#cube<span class="token punctuation">"</span></span> <span class="token attr-name">x</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100<span class="token punctuation">"</span></span> <span class="token attr-name">y</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>124<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span> 
<span class="token comment">&lt;!-- ... --></span>
</code></pre></div>
<iframe width="100%" height="300" scrolling="no" title="2. Big cube reusing content SVG <use>" src="https://codepen.io/marianab/embed/wvvZXqG?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/wvvZXqG'>2. Big cube reusing content SVG &amplt;use&ampgt;&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Now we have to position every cube remembering that the last element will appear at the front, after that, we'll have our first big cube ready!</p>
<blockquote>
<p><em><code>xlink:href</code> is deprecated since SVG2, but it is better to use it for compatibility purposes. In modern browsers, you can just use <code>href</code> but I tested it on Safari and at the time of writing is not working there. If you use <code>xlink:href</code> make sure you include this namespace in your SVG tag: <code>xmlns:xlink="http://www.w3.org/1999/xlink"</code> (you won't need it if you decide to use <code>href</code>).</em></p>
</blockquote>
<div aria-hidden="true" class="separator">***</div>
<h2 id="part-2-using-css-variables-to-apply-different-styles-to-your-reusedgraphic"><a href="#part-2-using-css-variables-to-apply-different-styles-to-your-reusedgraphic" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Part 2: Using CSS variables to apply different styles to your reused graphic</h2>
<p>I chose a main color for the cube, which is a lighter and a darker shade for the sides and a stroke color. But what if we want to make a second cube a different color?</p>
<p>We can replace the fills and strokes with CSS variables to make these attributes more flexible. That way, we'll be able to reuse the same cube unit with another palette (instead of defining a second unit with different colors for a second cube).</p>
<p>Why not add a class to the new cube and change the fill color with CSS? We'll do that, but first, try to inspect a <code>&lt;use></code> element. You'll notice it renders in the Shadow DOM, which means it is not vulnerable to scripts and styles, like elements in the normal DOM. Whatever values you define in the figure inside <code>&lt;defs></code> will be inherited by all its instances and you won't be able to rewrite those with CSS. But if you replace those values with variables, then you'll be able to <a href="https://tympanus.net/codrops/2015/07/16/styling-svg-use-content-css/" rel="nofollow noopener noreferrer" target="_blank">control them in CSS</a>.</p>
<p>In our cube unit, we'll go through each side and replace the fill and stroke values with semantic variable names.</p>
<p>For example, this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#00affa<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#0079ad<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>…can be replaced with this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rect</span> <span class="token attr-name">fill</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>var(--mainColor)<span class="token punctuation">"</span></span> <span class="token attr-name">stroke</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>var(--strokeColor)<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
</code></pre></div>
<p>From here, we must duplicate the SVG to build a second cube. However, we don't need to duplicate <code>&lt;defs></code> if we are keeping both in the same document. We can add a class to each SVG and control the color palette through CSS, redefining the values of the variable.</p>
<p>Let's create a palette for the blue cube and another one for the pink cube:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.blue-cube</span></span> <span class="token punctuation">{</span>   
 <span class="token variable">--mainColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#009CDE</span><span class="token punctuation">;</span>   
 <span class="token variable">--strokeColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#0079ad</span><span class="token punctuation">;</span>   
 <span class="token variable">--lightColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#00affa</span><span class="token punctuation">;</span>   
 <span class="token variable">--darkColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#008bc7</span><span class="token punctuation">;</span> 
<span class="token punctuation">}</span>  
<span class="token selector"><span class="token class">.pink-cube</span></span> <span class="token punctuation">{</span>   
 <span class="token variable">--mainColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#de0063</span><span class="token punctuation">;</span>   
 <span class="token variable">--strokeColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#ad004e</span><span class="token punctuation">;</span>   
 <span class="token variable">--lightColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#fa0070</span><span class="token punctuation">;</span>   
 <span class="token variable">--darkColor</span><span class="token punctuation">:</span> <span class="token hexcode color">#c7005a</span><span class="token punctuation">;</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<iframe width="100%" height="300" scrolling="no" title="3. Duplicating big cube with SVG <use> and CSS variables" src="https://codepen.io/marianab/embed/gOOJQmw?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/gOOJQmw'>3. Duplicating big cube with SVG &amplt;use&ampgt; and CSS variables&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>This way, we can add as many cubes as we want and change all colors from one place.</p>
<div aria-hidden="true" class="separator">***</div>
<h2 id="part-3-reusing-animations"><a href="#part-3-reusing-animations" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Part 3: Reusing animations</h2>
<p>The idea for this instance is to break the cubes on hover - something like an exploded view so some pieces will move away from the center when we place the cursor over the cubes.</p>
<iframe width="100%" height="300" scrolling="no" title="4. Big cubes animation with SVG <use> and CSS variables" src="https://codepen.io/marianab/embed/KKKYdxE?height=265&theme-id=dark&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen>
  See the Pen &lt;a href='https://codepen.io/marianab/pen/KKKYdxE'>4. Big cubes animation with SVG &amplt;use&ampgt; and CSS variables&lt;/a> by Mariana
  (&lt;a href='https://codepen.io/marianab'>@marianab&lt;/a>) on &lt;a href='https://codepen.io'>CodePen&lt;/a>.
</iframe>
<p>Let's start by defining two movements, one for each axis: <code>move Y</code> and <code>move X</code>. By dividing the animations into movements, we'll be able to reuse them in every cube. The animations will consist of moving the cube from its initial position to 30px or 50px away in one direction. We can use a transform translate (<code>X</code> or <code>Y</code> ) to achieve that.</p>
<p>For example:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token atrule"><span class="token rule">@keyframes</span> moveX</span> <span class="token punctuation">{</span>   
 <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateX</span><span class="token punctuation">(</span><span class="token number">-35</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>But if we want to be able to reuse this animation, it's better to replace the numeric value with a variable, like this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token atrule"><span class="token rule">@keyframes</span> moveX</span> <span class="token punctuation">{</span>   
 <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateX</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span><span class="token variable">--translate</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token unit">px</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>If the variable is not defined, the default value will be 35px.</p>
<p>Now we need at least one class to bind to the animation. In this case, though, we need two classes to move cubes in the x-axis: <code>.m-left</code> and <code>.m-right</code>.</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.m-left</span><span class="token punctuation">,</span> <span class="token class">.m-right</span></span> <span class="token punctuation">{</span>    
 <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token unit">s</span> moveX alternate infinite<span class="token punctuation">;</span>  
<span class="token punctuation">}</span>
</code></pre></div>
<p>For the cube to move left, we need a negative value, but we can also declare a different number. We can define our variable like this inside the <code>.m-left</code> class:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.m-left</span></span> <span class="token punctuation">{</span> <span class="token variable">--translate</span><span class="token punctuation">:</span> <span class="token number">-50</span><span class="token unit">px</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
</code></pre></div>
<p>What's happening here is we're declaring that when we add the class <code>.m-left</code> to one element, this will play the animation <code>moveX</code> (the one defined in the <code>@keyframes</code>) which will last two seconds to translate in the x-axis and reach a new position that is -50px left. Then, the animation alternates directions so that it moves from the last position and take two more seconds to go to its original state. And so on, because it's an infinite loop.</p>
<p>We can declare another variable to the <code>.m-right</code> class but if we don't, remember that it will take the 35px we declared at the beginning.</p>
<p>The default <code>animation-play-state</code> value is <code>running</code> but maybe we don't want the cubes to move all the time. It would be very distracting and annoying to use on a site with some nearby content. So, let's try to play the animation only on hover by adding this:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">svg<span class="token pseudo-class">:hover</span> <span class="token class">.m-left</span></span> <span class="token punctuation">{</span>
 <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token unit">s</span> moveX alternate infinite<span class="token punctuation">;</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>You can try it by yourself and will find that the animation is jumping super fast to the initial state every time we place the cursor out of the cube. To avoid it, we can add the value <code>paused</code> at the end of the animation shorthand:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector"><span class="token class">.m-left</span></span> <span class="token punctuation">{</span>   
 <span class="token property">animation</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token unit">s</span> moveX alternate infinite paused<span class="token punctuation">;</span> 
<span class="token punctuation">}</span>
</code></pre></div>
<p>Now the animation is paused but will be running on hover by adding this line of CSS:</p>
<div class="nuxt-content-highlight"><pre class="line-numbers language-css"><code><span class="token selector">svg<span class="token pseudo-class">:hover</span> *</span> <span class="token punctuation">{</span>
 <span class="token property">animation-play-state</span><span class="token punctuation">:</span> running<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div>
<p>We can apply each class to different elements in the SVG. In the first blue cube, we are moving single cubes; in the second one, we're applying those classes to groups of cubes.</p>
<h3 id="one-lastthing"><a href="#one-lastthing" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>One last thing…</h3>
<p>It wasn't until later that I realized I could reuse a single unit to build them all. I worked on the small cube to make it isometric enough so it could align easily with the other ones next to it. At this point, my unit was a <code>&lt;path></code> but I decided to replace it with SVG shapes to reduce the code and get cleaner markup.</p>
<p>I learned that it is better to take some time to analyze what can be done with SVG before drawing every single shape and dealing with a huge amount of code. It might take more time in the beginning but will save you a lot of time and effort in the long run.</p>
<blockquote>
<p>This article was first published on <a href="https://css-tricks.com/use-and-reuse-everything-in-svg-even-animations/" rel="nofollow noopener noreferrer" target="_blank">CSS-Tricks</a> with edits from <a href="https://chriscoyier.net/" rel="nofollow noopener noreferrer" target="_blank">Chris Coyier</a> and <a href="https://geoffgraham.me/" rel="nofollow noopener noreferrer" target="_blank">Geoff Graham</a></p>
</blockquote></div></article></div> <div class="footer-links wrapper" data-v-5e4666ba><div data-v-5e4666ba><a href="/posts/usar-y-reusar-todo-en-SVG-incluso-animaciones" data-v-5e4666ba>
      ←
      Usar y reusar todo en SVG … ¡Incluso animaciones!
    </a></div> <div data-v-5e4666ba><a href="/posts/DIY-svg-icons" data-v-5e4666ba>
      How to Simplify SVG Code Using Basic Shapes
      →
    </a></div></div></div> <section id="contact" class="contact wrapper" data-v-08850a32><h2 data-v-08850a32>Let's stay in touch.</h2> <p data-v-08850a32><a mailto="mbeldi@gmail.com" data-v-08850a32>mbeldi@gmail.com</a></p> <div class="social" data-v-08850a32><a href="https://marianabeldi.medium.com/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="2 0 46 46" data-v-08850a32><title id="Medium" data-v-08850a32>Mariana Beldi on Medium</title> <path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z" data-v-08850a32></path></svg></a> <a href="https://dribbble.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 0 512 512" data-v-08850a32><title id="Dribbble" data-v-08850a32>Mariana Beldi on Dribbble</title> <path d="M256 68.4C152.4 68.4 68.4 152.4 68.4 256c0 103.6 84 187.6 187.6 187.6S443.6 359.6 443.6 256C443.6 152.4 359.6 68.4 256 68.4zM410.6 247.3c-40.3-6.6-77.3-7-111-1.1 -3.8-8.8-7.8-17.6-12-26.3 36.1-15.6 65.1-36.9 86.7-63.8C395.4 181 408.6 212.6 410.6 247.3zM350.5 133.4c-18.8 24.3-44.8 43.5-78 57.5 -15.9-29.1-34-57.5-54.5-85 12.2-3.1 24.9-4.9 38-4.9C291.6 101 324.3 113.2 350.5 133.4zM186.1 117.9c20.8 27.2 39.3 55.3 55.3 84.1 -38 11.2-83.4 16.9-135.8 17.3C116.4 175 146.3 138.1 186.1 117.9zM101 256c0-1.3 0.2-2.7 0.2-4 60.2-0.1 112.1-7 155.6-20.7 3.6 7.4 7.1 14.9 10.5 22.4 -52.8 16.5-96.4 50.4-130.3 101.3C114.5 328.2 101 293.6 101 256zM160.9 378.1c30.8-48.3 70.1-79.7 118.8-94.2 14.5 37.8 25.2 76.8 31.9 116.6 -17.3 6.7-36 10.5-55.6 10.5C220.1 411 187.2 398.6 160.9 378.1zM342 384.8c-6.9-36.8-16.9-72.8-30-107.8 29.3-4.1 61.6-3.1 96.9 3.1C402.1 323.6 377.2 361.3 342 384.8z" data-v-08850a32></path></svg></a> <a href="https://codepen.io/marianab/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on Codepen</title> <path d="M427 201.9c-0.6-4.2-2.9-8-6.4-10.3L264.2 87.3c-4.9-3.3-11.4-3.3-16.3 0L91.4 191.6c-4 2.7-6.5 7.4-6.5 12.2v104.3c0 4.8 2.5 9.6 6.5 12.2l156.4 104.3c4.9 3.3 11.4 3.3 16.3 0L420.6 320.4c4-2.6 6.6-7.4 6.6-12.2V203.9C427.1 203.2 427.1 202.6 427 201.9 427 201.7 427.1 202.6 427 201.9zM270.7 127.1l115.2 76.8 -51.5 34.4 -63.8-42.7V127.1zM241.3 127.1v68.6l-63.8 42.7 -51.5-34.4L241.3 127.1zM114.3 231.4l36.8 24.6 -36.8 24.6V231.4zM241.3 384.9L126.1 308.1l51.5-34.4 63.8 42.6V384.9zM256 290.8l-52-34.8 52-34.8 52 34.8L256 290.8zM270.7 384.9V316.3l63.8-42.6 51.5 34.4L270.7 384.9zM397.7 280.6l-36.8-24.6 36.8-24.6V280.6z" data-v-08850a32></path></svg></a> <a href="https://www.behance.net/MarianaBeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 420 420" data-v-08850a32><title id="Behance" data-v-08850a32>Mariana Beldi on Behance</title> <path d="M254.8 171.8c6.4 8.9 9.6 19.6 9.6 32 0 12.8-3.2 23.1-9.7 30.9 -3.6 4.4-9 8.4-16 12 10.7 3.9 18.8 10.1 24.2 18.5 5.5 8.4 8.2 18.7 8.2 30.7 0 12.4-3.1 23.6-9.3 33.5 -4 6.6-8.9 12.1-14.9 16.5 -6.7 5.1-14.6 8.6-23.7 10.5 -9.1 1.9-19 2.8-29.6 2.8H99.1V149.5h101.4C226.1 149.8 244.2 157.3 254.8 171.8zM140.9 185.9v46.3h51c9.1 0 16.5-1.7 22.2-5.2 5.7-3.5 8.5-9.6 8.5-18.4 0-9.8-3.8-16.2-11.3-19.4 -6.5-2.2-14.7-3.3-24.8-3.3H140.9zM140.9 266.9v55.9h50.9c9.1 0 16.2-1.2 21.2-3.7 9.2-4.6 13.8-13.3 13.8-26.2 0-10.9-4.5-18.4-13.4-22.5 -5-2.3-12-3.5-21-3.6H140.9L140.9 266.9zM396.4 207.3c10.8 4.8 19.8 12.5 26.8 23 6.4 9.2 10.5 19.9 12.4 32.1 1.1 7.1 1.5 17.4 1.3 30.8H323.9c0.6 15.6 6 26.5 16.2 32.7 6.2 3.9 13.6 5.8 22.4 5.8 9.2 0 16.8-2.4 22.5-7.1 3.2-2.6 5.9-6.1 8.4-10.7h41.4c-1.1 9.2-6.1 18.5-15 28 -13.9 15.1-33.4 22.6-58.4 22.6 -20.6 0-38.9-6.4-54.6-19.1 -15.8-12.7-23.7-33.4-23.7-62.1 0-26.9 7.1-47.5 21.4-61.8 14.2-14.3 32.7-21.5 55.5-21.5C373.4 200 385.6 202.4 396.4 207.3zM335.7 242.3c-5.7 5.9-9.3 13.9-10.8 24h69.9c-0.7-10.8-4.3-18.9-10.8-24.5 -6.5-5.6-14.5-8.4-24.1-8.4C349.5 233.4 341.4 236.4 335.7 242.3zM402.8 161.5h-91.2V182.7h91.2V161.5z" data-v-08850a32></path></svg></a> <a href="https://www.linkedin.com/in/marianabeldi/" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="30 30 456 446" data-v-08850a32><title id="Linkedin" data-v-08850a32>Linkedin Profile</title> <path d="M186.4 142.4c0 19-15.3 34.5-34.2 34.5 -18.9 0-34.2-15.4-34.2-34.5 0-19 15.3-34.5 34.2-34.5C171.1 107.9 186.4 123.4 186.4 142.4zM181.4 201.3h-57.8V388.1h57.8V201.3zM273.8 201.3h-55.4V388.1h55.4c0 0 0-69.3 0-98 0-26.3 12.1-41.9 35.2-41.9 21.3 0 31.5 15 31.5 41.9 0 26.9 0 98 0 98h57.5c0 0 0-68.2 0-118.3 0-50-28.3-74.2-68-74.2 -39.6 0-56.3 30.9-56.3 30.9v-25.2H273.8z" data-v-08850a32></path></svg></a> <a href="https://github.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-60 -60 1150 1150" overflow="visible" data-v-08850a32><title id="Codepen" data-v-08850a32>Mariana Beldi on GitHub</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" transform="scale(64)" data-v-08850a32></path></svg></a> <a href="https://www.redbubble.com/people/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -5 43 43" data-v-08850a32><title id="RB" data-v-08850a32>Mariana Beldi on Redbubble</title> <path d="M25.2 24.7h-4.8c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.5c3.4 0 4.1 2 4.1 3.7 0 1-.3 1.7-.8 2.3 1.2.5 1.9 1.7 1.9 3.3 0 2.4-1.8 3.8-4.9 3.8zm-7 0H8.1c-.3 0-.5-.2-.5-.5V12.1c0-.3.2-.5.5-.5h4.7c2.9 0 4.7 1.6 4.7 4.2 0 1.8-.9 3.1-2.3 3.7l3.4 4.4c.2.3 0 .8-.4.8zm0-24.7C8.1 0 0 8.1 0 18.2c0 10 8.1 18.2 18.2 18.2 10 0 18.2-8.1 18.2-18.2S28.2 0 18.2 0z" data-v-08850a32></path></svg></a> <a href="https://dev.to/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="0 -120 500 600" data-v-08850a32><title id="Dev.to" data-v-08850a32>Mariana Beldi on DEV.to</title> <path d="M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z" data-v-08850a32></path></svg></a> <a href="https://www.instagram.com/marianabelda" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="-27 -27 300 300" data-v-08850a32><title id="Instagram" data-v-08850a32>Mariana Beldi on Instagram</title> <path d="M128 23.06c34.18 0 38.23.13 51.72.75 12.48.57 19.26 2.65 23.77 4.4a39.66 39.66 0 0114.72 9.58 39.66 39.66 0 019.57 14.72c1.76 4.51 3.84 11.29 4.41 23.77.62 13.5.75 17.54.75 51.72s-.13 38.23-.75 51.72c-.57 12.48-2.65 19.26-4.4 23.77a39.66 39.66 0 01-9.58 14.72 39.66 39.66 0 01-14.72 9.57c-4.51 1.76-11.29 3.84-23.77 4.41-13.5.62-17.54.75-51.72.75s-38.23-.13-51.72-.75c-12.48-.57-19.26-2.65-23.77-4.4a39.65 39.65 0 01-14.72-9.58 39.66 39.66 0 01-9.57-14.72c-1.76-4.51-3.84-11.29-4.41-23.77-.62-13.5-.75-17.54-.75-51.72s.13-38.23.75-51.72c.57-12.48 2.65-19.26 4.4-23.77a39.66 39.66 0 019.58-14.72 39.66 39.66 0 0114.72-9.57c4.51-1.76 11.29-3.84 23.77-4.41 13.5-.62 17.54-.75 51.72-.75M128 0C93.24 0 88.88.15 75.23.77 61.6 1.39 52.3 3.56 44.15 6.72a62.74 62.74 0 00-22.67 14.76A62.74 62.74 0 006.72 44.16C3.56 52.3 1.39 61.6.77 75.23.15 88.88 0 93.23 0 128c0 34.76.15 39.12.77 52.77.62 13.63 2.79 22.93 5.95 31.08a62.75 62.75 0 0014.76 22.67 62.74 62.74 0 0022.67 14.76c8.15 3.16 17.45 5.33 31.08 5.95 13.65.62 18 .77 52.77.77 34.76 0 39.12-.15 52.77-.77 13.63-.62 22.93-2.79 31.07-5.95a62.74 62.74 0 0022.68-14.76 62.74 62.74 0 0014.76-22.67c3.16-8.15 5.33-17.45 5.95-31.08.62-13.65.77-18 .77-52.77 0-34.76-.15-39.12-.77-52.77-.62-13.63-2.79-22.93-5.95-31.07a62.74 62.74 0 00-14.76-22.68 62.74 62.74 0 00-22.68-14.76C203.7 3.56 194.4 1.39 180.77.77 167.12.15 162.77 0 128 0zm0 62.27a65.73 65.73 0 100 131.46 65.73 65.73 0 000-131.46zm0 108.4a42.67 42.67 0 110-85.34 42.67 42.67 0 010 85.34zm83.69-111a15.36 15.36 0 11-30.72 0 15.36 15.36 0 0130.72 0z" data-v-08850a32></path></svg></a> <a href="https://twitter.com/marianabeldi" target="_blank" rel="noopener" data-v-08850a32><svg role="img" viewBox="60 60 380 380" data-v-08850a32><title id="Twitter" data-v-08850a32>Mariana Beldi on Twitter</title> <path d="M419.6 168.6c-11.7 5.2-24.2 8.7-37.4 10.2 13.4-8.1 23.8-20.8 28.6-36 -12.6 7.5-26.5 12.9-41.3 15.8 -11.9-12.6-28.8-20.6-47.5-20.6 -42 0-72.9 39.2-63.4 79.9 -54.1-2.7-102.1-28.6-134.2-68 -17 29.2-8.8 67.5 20.1 86.9 -10.7-0.3-20.7-3.3-29.5-8.1 -0.7 30.2 20.9 58.4 52.2 64.6 -9.2 2.5-19.2 3.1-29.4 1.1 8.3 25.9 32.3 44.7 60.8 45.2 -27.4 21.4-61.8 31-96.4 27 28.8 18.5 63 29.2 99.8 29.2 120.8 0 189.1-102.1 185-193.6C399.9 193.1 410.9 181.7 419.6 168.6z" data-v-08850a32></path></svg></a> <a href="https://bsky.app/profile/holasvg.com" target="_blank" rel="noopener" data-v-08850a32><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 550" overflow="visible" data-v-08850a32><title id="Bluesky" data-v-08850a32>Mariana Beldi on Bluesky</title> <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" data-v-08850a32></path></svg></a></div></section> <footer data-v-27ba9c71>Eternal WIP <span class="red" data-v-27ba9c71>♥</span></footer></div></div></div><script defer src="/_nuxt/static/1766065364/posts/use-and-reuse-everything-in-svg-even-animations/state.js"></script><script src="/_nuxt/abd6a50.js" defer></script><script src="/_nuxt/d5db247.js" defer></script><script src="/_nuxt/23afe77.js" defer></script><script src="/_nuxt/d1e194c.js" defer></script><script src="/_nuxt/7afb437.js" defer></script>
  </body>
</html>
]]></content:encoded>
        </item>
    </channel>
</rss>