<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Johan Villanueva</title>
    <description>The latest articles on Forem by Johan Villanueva (@johanfvn).</description>
    <link>https://forem.com/johanfvn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F132147%2Fb36e855e-00f4-481c-961d-4036bc3b8672.jpg</url>
      <title>Forem: Johan Villanueva</title>
      <link>https://forem.com/johanfvn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/johanfvn"/>
    <language>en</language>
    <item>
      <title>Basic Starter Kits for ReactJS</title>
      <dc:creator>Johan Villanueva</dc:creator>
      <pubDate>Mon, 07 Dec 2020 00:55:17 +0000</pubDate>
      <link>https://forem.com/johanfvn/basic-starter-kits-for-reactjs-489e</link>
      <guid>https://forem.com/johanfvn/basic-starter-kits-for-reactjs-489e</guid>
      <description>&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;Recently, I created two starter kits for my &lt;a href="https://reactjs.org/"&gt;React Apps&lt;/a&gt; ⚛. They are very simple and have the basics to start a quick project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repositories links
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/JohanVillanueva/react-starter-kit"&gt;React using JSX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JohanVillanueva/react-ts-starter-kit"&gt;React using TypeScript (TSX)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💅 Styled Components&lt;/li&gt;
&lt;li&gt;📦 Webpack 5.9 (includes CSS Loader)&lt;/li&gt;
&lt;li&gt;⚡ TypeScript 4.1&lt;/li&gt;
&lt;li&gt;📃 Linting with ESLint + Airbnb JS Style Guide&lt;/li&gt;
&lt;li&gt;🐩 Pre commit hooks with Husky (Run linter before commit)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I hope they help you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;💡 And one last thing... PR's are welcome!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Happy coding! 🙋‍♂️&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>webpack</category>
    </item>
    <item>
      <title>From JSON to Stylus variables with one line</title>
      <dc:creator>Johan Villanueva</dc:creator>
      <pubDate>Wed, 15 Jul 2020 03:18:46 +0000</pubDate>
      <link>https://forem.com/johanfvn/from-json-to-stylus-variables-with-one-line-3bm3</link>
      <guid>https://forem.com/johanfvn/from-json-to-stylus-variables-with-one-line-3bm3</guid>
      <description>&lt;p&gt;Well, my first post is here. I hope it's useful to you 😎.&lt;/p&gt;

&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;The last week, I've been reading about &lt;a href="https://css-tricks.com/what-are-design-tokens/"&gt;Design Tokens&lt;/a&gt; because in the company project where I work, we need to have a common language between developers and UI/UX designers (Yes, the usual). I think this solution can help us have a single source of truth about some parameters that we handle between the two teams. &lt;/p&gt;

&lt;p&gt;By the way, this is another topic you might write about later. It's time to talk about &lt;a href="https://stylus-lang.com/"&gt;Stylus&lt;/a&gt; and how it can help us in handling variables and tokens.&lt;/p&gt;

&lt;h1&gt;
  
  
  A little problem
&lt;/h1&gt;

&lt;p&gt;The important thing about this research was the subject of the technical implementation of this tokens. Many &lt;a href="https://medium.com/@didoo/how-to-manage-your-design-tokens-with-style-dictionary-98c795b938aa"&gt;posts&lt;/a&gt; about this recommend generating a &lt;strong&gt;JSON File&lt;/strong&gt; like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tokens.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8px"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"brand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#05efd0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"secondary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#FF39a6"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"font"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"xs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"md"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"16px"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"regular"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"semi-bold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"bold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"space"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"xxs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"xs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4px"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then transform it to css/stylus/sass/less variables. In this case, Stylus. But... How? 🤔&lt;/p&gt;

&lt;p&gt;Well, the basic solution would be write all the variables, one by one. Like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="c1"&gt;// variables.styl&lt;/span&gt;

&lt;span class="nt"&gt;grid-base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;8px&lt;/span&gt;
&lt;span class="nt"&gt;color-brand-primary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;#05be50&lt;/span&gt;
&lt;span class="nt"&gt;color-brand-secondary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;#FF39a6&lt;/span&gt;
&lt;span class="nc"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;// A lot of variables 😣&lt;/span&gt;
&lt;span class="nc"&gt;...&lt;/span&gt;
&lt;span class="nt"&gt;space-xs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;4px&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, it's a possible solution. But... &lt;strong&gt;it's a lot of work to write the variables and also keep them up to date every time our JSON File is updated&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Stylus ❤ JSON
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://stylus-lang.com/"&gt;Stylus&lt;/a&gt; is here for help us 😍. &lt;/p&gt;

&lt;p&gt;Reviewing its documentation I was surprised that we have a &lt;a href="https://stylus-lang.com/docs/bifs.html#jsonpath-options"&gt;built-in function&lt;/a&gt; to work with JSON files. This has the following description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Convert a .json file into stylus variables or an object. Nested variable object keys are joined with a dash (-).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think it's a great feature as css preprocessor. It's magic ✨.&lt;/p&gt;

&lt;h3&gt;
  
  
  So, how does it work?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We need a JSON (Duh 😅). For this example, we take the JSON I wrote lines above.&lt;/li&gt;
&lt;li&gt;Then, write de following line of Stylus code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="c1"&gt;// variables.styl&lt;/span&gt;

&lt;span class="c1"&gt;// Just we need the path of our JSON file&lt;/span&gt;
&lt;span class="nt"&gt;json&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./path-to-json/tokens.json'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;That's all. Yes, I'm not kidding. 😂 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This function creates all the variables for us when it's executed. It means that the final &lt;strong&gt;variables file&lt;/strong&gt; would look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="c1"&gt;// variables.styl&lt;/span&gt;

&lt;span class="nt"&gt;grid-base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;8px&lt;/span&gt;
&lt;span class="nt"&gt;color-brand-primary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;#05be50&lt;/span&gt;
&lt;span class="nt"&gt;color-brand-secondary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;#FF39a6&lt;/span&gt;
&lt;span class="nc"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;// A lot of variables. But... Stylus did it for us 😀&lt;/span&gt;
&lt;span class="nc"&gt;...&lt;/span&gt;
&lt;span class="nt"&gt;space-xs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;4px&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage example
&lt;/h3&gt;

&lt;p&gt;Now, we have all our variables created and available to use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components.styl&lt;/span&gt;

&lt;span class="c1"&gt;// We need import variables.styl file or &lt;/span&gt;
&lt;span class="c1"&gt;// make some setting for use it as global&lt;/span&gt;
&lt;span class="k"&gt;@require&lt;/span&gt; &lt;span class="s1"&gt;'variables'&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;color-brand-primary&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;space-md&lt;/span&gt; &lt;span class="n"&gt;space-lg&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  That's all! 🎉
&lt;/h2&gt;

&lt;p&gt;As an additional comment I would recommend testing this feature in its 'hash' mode as well. For some use cases. Maybe this can help you in what you are looking for.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="err"&gt; = &lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="err"&gt;('&lt;/span&gt;&lt;span class="na"&gt;tokens&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="err"&gt;', { &lt;/span&gt;&lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope to write again soon. 👋 See you!&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>stylus</category>
      <category>design</category>
    </item>
  </channel>
</rss>
