<?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>DEV Community: FeldsparTech</title>
    <description>The latest articles on DEV Community by FeldsparTech (@feldspartech).</description>
    <link>https://dev.to/feldspartech</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%2Forganization%2Fprofile_image%2F3329%2F2d0ed014-d75d-4f85-a3c8-89d7fb9f9fb8.jpg</url>
      <title>DEV Community: FeldsparTech</title>
      <link>https://dev.to/feldspartech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/feldspartech"/>
    <language>en</language>
    <item>
      <title>Vue Data Object : Details You Must Know</title>
      <dc:creator>Karna Gogoi</dc:creator>
      <pubDate>Sat, 12 Mar 2022 14:33:45 +0000</pubDate>
      <link>https://dev.to/feldspartech/vue-data-object-details-you-must-know-261n</link>
      <guid>https://dev.to/feldspartech/vue-data-object-details-you-must-know-261n</guid>
      <description>&lt;p&gt;We at FeldsparTech are using Vue to build our no code/low code platform ATMAN. And just like any other Vue application, data object is one of the most used options in our application too. Even though using a data object is very simple, there are a few minute but important details about it that one should understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  1) What is the data object?
&lt;/h2&gt;

&lt;p&gt;Vue provides an option called data, which is a function that Vue calls every time it creates a new instance of the component.This function has to return an object which Vue will wrap up in its reactivity system. That means if you are using a data object in your html, then, any change to that object will cause the html to render.&lt;/p&gt;

&lt;h2&gt;
  
  
  2) How do you create one?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jsfiddle.net/karna_gogoi/vqj9w67n/5/"&gt;JSFiddle&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;new Vue({
  el: "#example",
  data() {
    return {
      hello: "Hello World!!"
    }
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and use it in your html as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="example"&amp;gt;
  &amp;lt;h2&amp;gt;
    {{ hello }}
  &amp;lt;/h2&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3) When is a property not reactive?
&lt;/h2&gt;

&lt;p&gt;Vue allows you to create a property outside of the data option. So, if you want you can create a property like this:&lt;br&gt;
&lt;a href="https://jsfiddle.net/karna_gogoi/nLrb84wz/5/"&gt;JSFiddle&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;new Vue({
  el: "#example",
  -
  -
  -
  mounted() {
    this.defaultName = ""
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  But!!
&lt;/h3&gt;

&lt;p&gt;One problem with this way of creating a property is that Vue will not be able to add it to its reactivity system. And therefore if you use this property in your html like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="example"&amp;gt;
  &amp;lt;h2&amp;gt;
    {{ defaultName }}
  &amp;lt;/h2&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and later make a change to this property,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="example"&amp;gt;
  -
  -
  -
  &amp;lt;button @click="changeName"&amp;gt;Change Name&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;

new Vue({
  el: "#example",
  -
  -
  -
  mounted() {
    this.defaultName = ""
  },
  methods: {
      changeName() {
          this.defaultName = "Enoch"
      }
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vue will not be able to catch the change and the template will not update. &lt;/p&gt;

&lt;p&gt;But there can be situations when you might need to make this kind of change and want the html to be reactive. So, for that Vue provides various ways to make the changes reactive, about which you can read more in detail &lt;a href="https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4) Common mistake
&lt;/h2&gt;

&lt;p&gt;One common mistake that one should be aware of is that &lt;strong&gt;initialising a data property with another property does not make it reactive.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's say you are making a todo application and you have created it like this&lt;br&gt;
&lt;a href="https://jsfiddle.net/karna_gogoi/kfrxmc86/3/"&gt;JSFiddle&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="example"&amp;gt;
  &amp;lt;div v-for="(todo, i) in todos" :key="i"&amp;gt;
    {{todo}}
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


new Vue({
  el: "#example",
  data() {
    return {
      todos: ["todo1", "todo2", "todo3"]
    }
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's say you want to have a default todo item always added to the top of the list and its value changes depending on which day it is.&lt;br&gt;
So you add it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;new Vue({
  el: "#example",
  data() {
      return {
          defaultItem: "MondayTask",
          todos: [this.defaultItem, "todo1","todo2","todo3"]
      }
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now even if you change &lt;code&gt;defaultItem&lt;/code&gt; property, the &lt;code&gt;todos&lt;/code&gt; list will remain the same. As both the properties are initialised at the same time Vue doesn't know that it has to react to any change in &lt;code&gt;defaultItem&lt;/code&gt; and update &lt;code&gt;todos&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learnings:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create all your properties in the data option for them to be reactive.&lt;/li&gt;
&lt;li&gt;Initialising a data property by another property does not make it reactive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  References:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://vuejs.org/v2/guide/instance.html#Data-and-Methods"&gt;https://vuejs.org/v2/guide/instance.html#Data-and-Methods&lt;/a&gt;&lt;br&gt;
&lt;a href="https://vuejs.org/v2/guide/reactivity.html"&gt;https://vuejs.org/v2/guide/reactivity.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to move on from the tutorial phase as a beginner?</title>
      <dc:creator>Nikhat</dc:creator>
      <pubDate>Fri, 31 Dec 2021 12:36:53 +0000</pubDate>
      <link>https://dev.to/feldspartech/how-to-move-on-from-the-tutorial-phase-as-a-beginner-1bmj</link>
      <guid>https://dev.to/feldspartech/how-to-move-on-from-the-tutorial-phase-as-a-beginner-1bmj</guid>
      <description>&lt;p&gt;If you are new to programming, one of the first things that probably aids you in your self-learning process is the many resources and tutorials that are available. A quick google search can be both a blessing as well as an overwhelming experience thanks to the digital connectivity we have today. After going through multiple suggestions on various portals, I found these to be most commonly listed to help a budding programmer.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Build Projects
&lt;/h4&gt;

&lt;p&gt;Ask someone who codes for a living how to get better at coding, I can guarantee you that they will all tell you: &lt;em&gt;build projects, start working on something you feel invested in, it doesn’t have to be a huge project!&lt;/em&gt; You will probably be left wondering what falls under a project? How do I build one? Where do I start? Firstly, take a step back and breathe. Then, break down your idea into multiple sub tasks, write down what all you want to achieve and begin. Also, it’s perfectly all right if what you want to do isn’t unique at all. The point is to build something on your own.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Practice, practice, practice!
&lt;/h4&gt;

&lt;p&gt;As with many other skills, your programming gets better only with time and dedication from your end. Make sure to spend an hour a day or so working on the concepts you struggle with, most often used modules in the language you’re learning, get your basics correct by working on exercises - I personally find exercise problems at the end of textbook chapters quite helpful to develop logical skills; there are a few websites like &lt;a href="https://edabit.com/"&gt;Edabit&lt;/a&gt; dedicated for that purpose alone. These problems could comprise a small program using multiple methods or just a single method.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Read Code!
&lt;/h4&gt;

&lt;p&gt;You know how something clicks simply by looking at it repeatedly? Read it once and you have no idea what it means but give it a few more tries and the brain fog gets clearer? Well, I feel it’s like that with code too. Not only will you get familiar with the language but you will also get an idea on how a particular problem is solved or what course another coder has taken. Basically, you will be learning from their thought process. At the end of the day, code is a structured write up telling you what exactly is being done.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Go through the tutorial again
&lt;/h4&gt;

&lt;p&gt;Once you feel like you have gotten better than you were before, go back to the basics. I know this particular point feels like you will be kept in the loop instead of breaking out of it, but give it a try if the course you initially started with was a detailed one and you might not have grasped its concepts better back then. The purpose is to strengthen your basics, it is a major plus if the course is more hands-on. This time you can actually pause, attempt a problem on your own and take help from the tutorial if you feel the need to.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Read technical articles, follow other developers and their work
&lt;/h4&gt;

&lt;p&gt;There’s a ton of programmers out there producing quality work every single day. Ranging from keeping you up-to-date with here-to-stay technologies like no-code/low-code platforms to covering concepts through detailed code, you will learn a lot and can decide the extent of programming you wish to add to your portfolio. Follow them on blogging websites or their social media, I promise you will get a little bit of technical exposure every day! This will make you feel like a part of the developer’s community and sometimes that might be the push you need to stay consistent. &lt;/p&gt;

&lt;h4&gt;
  
  
  6. Teach - and finally, teach!
&lt;/h4&gt;

&lt;p&gt;If you really want to learn something and be good at it, you have to attempt to teach it. Not only do you feel confident at your skills by doing this, but there’s also more clarity that comes along with it. You can either blog about what you’ve learnt or teach it to someone else. Find any means which work for you. If you aren't sure where to begin, start with teaching yourself: write down what you’ve learnt and explain that certain bit that confused you earlier and how you arrived at a solution. Just like building your first projects, this doesn't have to be spectacularly grand either - keep it simple and short and grow from there. &lt;/p&gt;

&lt;p&gt;So, this is it then! I'm going to conclude my first technical blog post here. These tips are more of a continual reminder for me and anyone who's feeling lost and unready out there. If you have any more suggestions or would like to add onto these points, do let me know below.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>codenewbie</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Speeding up Cypress Automation Tests</title>
      <dc:creator>Vivek Kodira</dc:creator>
      <pubDate>Sat, 18 Sep 2021 15:56:36 +0000</pubDate>
      <link>https://dev.to/feldspartech/speeding-up-cypress-automation-tests-e14</link>
      <guid>https://dev.to/feldspartech/speeding-up-cypress-automation-tests-e14</guid>
      <description>&lt;p&gt;Here are a few tips on making your &lt;a href="https://docs.cypress.io/guides/overview/why-cypress" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt; automation tests runs faster. &lt;/p&gt;

&lt;p&gt;NOTE: Some of these may seem trivial but they are all actual mistakes made by me. I hope you'll learn from my mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write one big test rather than several small ones
&lt;/h3&gt;

&lt;p&gt;A real-world integration test typically involves signon, etc before testing the actual functionality. Each test you add will therefore add to the time taken. Also, as Cypress's best practices document &lt;a href="https://docs.cypress.io/guides/references/best-practices#Creating-tiny-tests-with-a-single-assertion" rel="noopener noreferrer"&gt;explains&lt;/a&gt;, Cypress does some housekeeping between each test. This will also slow you down if there are too many small tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;before&lt;/code&gt; &amp;amp; &lt;code&gt;beforeEach&lt;/code&gt; judiciously.
&lt;/h3&gt;

&lt;p&gt;Consider this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[.homePage]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="c1"&gt;//10 tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the test will login 10 times - once before each test. What I actually wanted was to login once and so should replace &lt;code&gt;beforeEach&lt;/code&gt; with &lt;code&gt;before&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nf"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[.homePage]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="c1"&gt;//10 tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Avoid waiting for arbitrary periods of time.
&lt;/h3&gt;

&lt;p&gt;Cypress explains that &lt;code&gt;cy.wait(Number)&lt;/code&gt; is an anti-pattern and you can almost always replace it with an assertion. Read Cypress's &lt;a href="https://docs.cypress.io/guides/references/best-practices#Unnecessary-Waiting" rel="noopener noreferrer"&gt;detailed explanation and examples&lt;/a&gt; to understand more. If you succumb to the temptation to add cy.wait() anyway, they will eventually become a time-sink.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tweak Cypress's configuration to remove unnecessary disk I/O
&lt;/h3&gt;

&lt;p&gt;Cypress aims to "just work" and does this admirably. A configuration file is automatically created by Cypress on the first run. Some of the options here increase the disk I/O and hence slow down Cypress itself. The main culprits are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.cypress.io/guides/references/configuration#Videos" rel="noopener noreferrer"&gt;video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.cypress.io/guides/references/configuration#Videos" rel="noopener noreferrer"&gt;videoUploadOnPasses&lt;/a&gt; &lt;em&gt;NOTE:&lt;/em&gt; This one only applies if you are also using Cypress's dashboard. By default Cypress uploads all videos when connected to Dashboard which you probably don't need.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.cypress.io/guides/references/configuration#Screenshots" rel="noopener noreferrer"&gt;screenshotOnRunFailure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turn these off or turn on only for nightly runs etc. where you are not worried about the time taken.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tag tests and run only the ones you need to
&lt;/h3&gt;

&lt;p&gt;Cypress's list of &lt;a href="https://docs.cypress.io/plugins/directory" rel="noopener noreferrer"&gt;curated plugins&lt;/a&gt; includes &lt;a href="https://github.com/cypress-io/cypress-grep" rel="noopener noreferrer"&gt;cyress-grep&lt;/a&gt;. Using this plugin, you can run tests by grepping their titles or custom tags you've added to each test. Use this ability to run only the necessary &lt;a href="https://en.wikipedia.org/wiki/Smoke_testing_(software)" rel="noopener noreferrer"&gt;smoke&lt;/a&gt; or feature-specific tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incorporate Cypress into your CI/CD
&lt;/h3&gt;

&lt;p&gt;This one is a little harder to implement but worth the effort. Take the time to read and understand how Cypress can be plugged into your &lt;a href="https://docs.cypress.io/guides/continuous-integration/introduction" rel="noopener noreferrer"&gt;CI/CD pipeline&lt;/a&gt;. As with everything else, Cypress's documentation here is extensive. As your test suite grows, offloading running the suite to some other system may be more performant than running all the tests locally on your laptop.&lt;/p&gt;

</description>
      <category>cypress</category>
    </item>
    <item>
      <title>Extending a Component Library using Vuex</title>
      <dc:creator>Vivek Kodira</dc:creator>
      <pubDate>Mon, 07 Dec 2020 16:27:15 +0000</pubDate>
      <link>https://dev.to/feldspartech/extending-a-component-library-using-vuex-5aka</link>
      <guid>https://dev.to/feldspartech/extending-a-component-library-using-vuex-5aka</guid>
      <description>&lt;p&gt;At &lt;a href="https://www.feldspartech.com/" rel="noopener noreferrer"&gt;FeldsparTech&lt;/a&gt; we are working on a no-code platform called &lt;a href="https://www.feldspartech.com/atman" rel="noopener noreferrer"&gt;Atman&lt;/a&gt;. Atman's UI is a component library that works as a standalone application or can be embedded into another application to enable quick no-code workflows.&lt;/p&gt;

&lt;p&gt;One of our goals is to allow granular control over our components. If this only meant rendering - we would build &lt;a href="https://adamwathan.me/renderless-components-in-vuejs/" rel="noopener noreferrer"&gt;Renderless components&lt;/a&gt;. However, we also want the consuming application to be able to override, modify and augment behavior.&lt;/p&gt;

&lt;p&gt;The approach we have chosen to achieve this goal is to use a &lt;a href="https://vuex.vuejs.org/#what-is-a-state-management-pattern" rel="noopener noreferrer"&gt;Vuex&lt;/a&gt; store.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisite: Both the consuming application and the library should import and use Vuex.&lt;/li&gt;
&lt;li&gt;We first need to dynamically register our library as a module in the application's store. This is possible through the &lt;a href="https://vuex.vuejs.org/guide/modules.html#dynamic-module-registration" rel="noopener noreferrer"&gt;registerModule&lt;/a&gt; method
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ourlibrary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ourlibrary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Methods that need to be customizable are implemented as actions in a vuex module. Within the action, the behavior could vary:

&lt;ul&gt;
&lt;li&gt;If we want the consuming application to be able to &lt;strong&gt;&lt;em&gt;override&lt;/em&gt;&lt;/strong&gt; behavior, the &lt;em&gt;action&lt;/em&gt; first checks if a global &lt;em&gt;action&lt;/em&gt; is available and invokes it. If not, the &lt;em&gt;action&lt;/em&gt; proceeds to perform the default logic specified in the library.&lt;/li&gt;
&lt;li&gt;If we want the consuming application to &lt;strong&gt;&lt;em&gt;augment&lt;/em&gt;&lt;/strong&gt; behavior, the module &lt;em&gt;action&lt;/em&gt; first performs the internal logic and then invokes the global &lt;em&gt;action&lt;/em&gt; (or vice versa) to perform any augmentation as necessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F15ex2ilcmoobubyeemj5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F15ex2ilcmoobubyeemj5.jpg" alt="https://dev-to-uploads.s3.amazonaws.com/i/15ex2ilcmoobubyeemj5.jpg" width="771" height="342"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Overriding behavior example
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nf"&gt;overriddenMethod&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_actions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;overriddenMethod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;overriddenMethod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;//Default behavior&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Augmenting behavior example
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nf"&gt;augmentedMethod&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="cm"&gt;/*
        Internal logic which updates `response`
        ...
     */&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_actions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;augmentedMethod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nx"&gt;globalResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;augmentedMethod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="cm"&gt;/*
        Update `response` with `globalResponse`
    */&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This pattern is quite powerful. For instance, you can now even allow the consuming application to entirely replace a particular nested component with one of its own.&lt;/p&gt;

&lt;p&gt;Here, the vuex action functions as a &lt;a href="https://en.wikipedia.org/wiki/Factory_method_pattern" rel="noopener noreferrer"&gt;Factory&lt;/a&gt;. Now you can customize the logic as per your needs. The Overriding approach will entirely replace default component. The Augmentation approach will allow the consuming application to add business-specific components you may not want in the library.&lt;/p&gt;
&lt;h2&gt;
  
  
  Dynamic Component in the Library
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;component&lt;/span&gt; &lt;span class="na"&gt;v-if&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"currentComponent"&lt;/span&gt; &lt;span class="na"&gt;v-bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;is&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"currentComponent"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;component&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
export &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//...&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;module&amp;gt;/deriveComponent`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Action in Library's store
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;deriveComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;//augment or override as per your requirements&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;currentComponent&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Resources I found useful during this exercise
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Github template to create a vuetify component library
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mitevpi" rel="noopener noreferrer"&gt;
        mitevpi
      &lt;/a&gt; / &lt;a href="https://github.com/mitevpi/vuetify-component-lib-template" rel="noopener noreferrer"&gt;
        vuetify-component-lib-template
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Template for creating a component library/design system using Vue.js and Vuetify.js.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/04056528fb46dbdcfac38d14d8465f269b055a8f926123d30e2ea10eb450d1cb/68747470733a2f2f63646e2e61757468302e636f6d2f626c6f672f7675656a732f7675652d6c6f676f2e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/04056528fb46dbdcfac38d14d8465f269b055a8f926123d30e2ea10eb450d1cb/68747470733a2f2f63646e2e61757468302e636f6d2f626c6f672f7675656a732f7675652d6c6f676f2e706e67" alt="Vue.js" width="100"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0fed18d041694558c0b11c60a0f52e668557a2b6c85bf00700ce1524c5e730b8/68747470733a2f2f7777772e736161736875622e636f6d2f696d616765732f6170702f736572766963655f6c6f676f732f382f3230656639306430346233352f6c617267652e706e673f31353237373431363039"&gt;&lt;img src="https://camo.githubusercontent.com/0fed18d041694558c0b11c60a0f52e668557a2b6c85bf00700ce1524c5e730b8/68747470733a2f2f7777772e736161736875622e636f6d2f696d616765732f6170702f736572766963655f6c6f676f732f382f3230656639306430346233352f6c617267652e706e673f31353237373431363039" alt="Vuetify.js" width="100"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/17a58938ab5bd7de0a895991a3c309842f41b3e6a6fc4f0028489ca665bc4c61/68747470733a2f2f6f70656e636f6c6c6563746976652d70726f64756374696f6e2e73332d75732d776573742d312e616d617a6f6e6177732e636f6d2f30313166633632302d346362322d313165392d613531612d6664626231306234636162622e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/17a58938ab5bd7de0a895991a3c309842f41b3e6a6fc4f0028489ca665bc4c61/68747470733a2f2f6f70656e636f6c6c6563746976652d70726f64756374696f6e2e73332d75732d776573742d312e616d617a6f6e6177732e636f6d2f30313166633632302d346362322d313165392d613531612d6664626231306234636162622e706e67" alt="Storybook" width="100"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Vue.js + Vuetify.js Component Library Template&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a70df05a17ebb58d9ea33c41e4f52959757785d18eefb519f64170e2ca77378d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/a70df05a17ebb58d9ea33c41e4f52959757785d18eefb519f64170e2ca77378d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub issues"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9a42446b1648ddf9fee389c5e89db998ec25737ea9aa3bdf1f0cb4fb5a680472/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722d7261772f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/9a42446b1648ddf9fee389c5e89db998ec25737ea9aa3bdf1f0cb4fb5a680472/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722d7261772f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub pull requests"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ea5ed122ef6ad36610ef245a3f62d47dbbe94e9b9979966116d10bc87003d5ed/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/ea5ed122ef6ad36610ef245a3f62d47dbbe94e9b9979966116d10bc87003d5ed/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub contributors"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0e98792cc679939c86fc268ddcb2d4d9b51385717cafe58b752e6b49edf14fe8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/0e98792cc679939c86fc268ddcb2d4d9b51385717cafe58b752e6b49edf14fe8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub last commit"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4c779de60571248858113f714384536932f75ff367ea526393c164ebfa971a9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d646174652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/4c779de60571248858113f714384536932f75ff367ea526393c164ebfa971a9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d646174652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub Release Date"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/076ced63fabefda00f4b3257e68ba85049712035b467af43aa33db3cc9e12258/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f64652d73697a652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/076ced63fabefda00f4b3257e68ba85049712035b467af43aa33db3cc9e12258/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f64652d73697a652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub code size in bytes"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/12db9acc10b79522424f3f34100b74c476052ece214e727dc101ca5dc14dc6ec/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/12db9acc10b79522424f3f34100b74c476052ece214e727dc101ca5dc14dc6ec/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub repo size"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f6771bd09ec339185bd869fb81cbf422443932a2c5751b937d6eb7b8d87b3d2d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/f6771bd09ec339185bd869fb81cbf422443932a2c5751b937d6eb7b8d87b3d2d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6d6974657670692f767565746966792d636f6d706f6e656e742d6c69622d74656d706c617465" alt="GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Design System / Component Library Template for enabling graphic
consistency and legibility across web development projects by creating
reusable components and styles with accessible &amp;amp; legible documentation
Built on top of Vue.js and &lt;a href="https://vuetifyjs.com/en/" rel="nofollow noopener noreferrer"&gt;Vuetify.js&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;This Template is comprised of two major categories: &lt;a href="https://github.com/mitevpi/vuetify-component-lib-templatesrc/styles" rel="noopener noreferrer"&gt;Styles&lt;/a&gt;
and &lt;a href="https://github.com/mitevpi/vuetify-component-lib-templatesrc/components" rel="noopener noreferrer"&gt;Components&lt;/a&gt;. It builds to compiled components
(&lt;code&gt;.js&lt;/code&gt;) and compiled styles (&lt;code&gt;.css&lt;/code&gt;) from the source (&lt;code&gt;.vue&lt;/code&gt;) files
which can be used across web applications. It also creates a
&lt;a href="https://storybook.js.org/" rel="nofollow noopener noreferrer"&gt;Storybook&lt;/a&gt; site for component/design system
documentation.&lt;/p&gt;

&lt;p&gt;Clone this repository locally, and use it as a starting point for
building a component library / design system on top of Vue.js and
&lt;a href="https://vuetifyjs.com/en/" rel="nofollow noopener noreferrer"&gt;Vuetify.js&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Added/Updated Configurations to Vue CLI Starter&lt;/h2&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/javascript" rel="noopener noreferrer"&gt;AirBnB Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prettier.io/" rel="nofollow noopener noreferrer"&gt;Prettier Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint.org/" rel="nofollow noopener noreferrer"&gt;ESLint (Style Enforcing)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://storybook.js.org/" rel="nofollow noopener noreferrer"&gt;Storybook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.vuejs.org/guide/build-targets.html#library" rel="nofollow noopener noreferrer"&gt;Library Build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sass/node-sass" rel="noopener noreferrer"&gt;SCSS/SASS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vuetifyjs.com/en/" rel="nofollow noopener noreferrer"&gt;Vuetify.js&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Commands&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;After cloning/downloading the repository locally, install the required
dependencies using…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mitevpi/vuetify-component-lib-template" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;

&lt;/li&gt;

&lt;li&gt;A step-by-step series by siegerts on how to create a Vue JS component library

&lt;div class="ltag__link"&gt;
  &lt;a href="/siegerts" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F424003%2Fee361bd1-6389-4720-9e06-dfa72626ceb1.jpeg" alt="siegerts"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/siegerts/creating-a-vue-js-component-library-part-i-introduction-2o9f" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Creating a Vue.js component library: Part I - Introduction&lt;/h2&gt;
      &lt;h3&gt;siegerts ・ Jul 7 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vue&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#library&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#plugin&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vuepress&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Also cross-posted on &lt;a href="https://feldspar-tech.medium.com/extending-a-component-library-using-vuex-965b45f0bfcc" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>vuex</category>
    </item>
    <item>
      <title>Online Reading — Why it fails for some formats</title>
      <dc:creator>Vivek Kodira</dc:creator>
      <pubDate>Sat, 21 Nov 2020 14:05:04 +0000</pubDate>
      <link>https://dev.to/feldspartech/online-reading-why-it-fails-for-some-formats-3pp6</link>
      <guid>https://dev.to/feldspartech/online-reading-why-it-fails-for-some-formats-3pp6</guid>
      <description>&lt;p&gt;Did you know that the world does not know whom to credit as the inventor of E-books? There are contenders for the title from as far back as 1946. &lt;a href="https://en.wikipedia.org/wiki/E-book#Inventor" rel="noopener noreferrer"&gt;Ref&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For you and me, our first time experiencing e-books were as PDF documents. These were typically technical journals and pirated scanned versions of popular books.&lt;/p&gt;

&lt;p&gt;It took some time for traditional publishers to accept this new format and begin selling them but since then e-books have exploded. Project Gutenberg now has over 60000 books one can read for free. For many of us, E-books are now the preferred format. This could be for several reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cost (an e-book is typically cheaper than the physical alternative)&lt;/li&gt;
&lt;li&gt;Space (e-books don’t take up any space. You can carry a thousand on a holiday)&lt;/li&gt;
&lt;li&gt;Convenience (you can read an e-book in the dark)&lt;/li&gt;
&lt;li&gt;Environmental impact (e-books don’t need paper and so fewer )&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But even the most ardent fans of the format will admit that there are disadvantages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;With e-books we lose the tactile experience of touching and feeling a physical book&lt;/li&gt;
&lt;li&gt;Some formats, graphic novels, comics and childrens’ books for instance do not lend themselves to an e-book format
The second disadvantage is the focus of this blog.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Graphic Novels and Comics as Ebooks
&lt;/h2&gt;

&lt;p&gt;With the limited screen real estate in small devices, text such as speech bubbles in graphic novels and comics are often not seen clearly. Google and Amazon, the big two players in the e-book market both address this in similar ways — by zooming in certain portions of the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxdi2owo7qhjf37wnwirf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxdi2owo7qhjf37wnwirf.gif" alt="Amazon’s Guided view" width="571" height="1015"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuxxt6n9ocjr0g3mzo0jk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuxxt6n9ocjr0g3mzo0jk.gif" alt="Alt Text" width="350" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google’s Bubble Zoom enhances speech bubbles in each panel. Amazon’s Guided View  navigates a comic panel-by-panel&lt;/p&gt;

&lt;p&gt;These approaches address one problem but end up creating another. Arbitrarily zooming in on certain portions and truncating others may make the text legible but harm the overall experience.&lt;/p&gt;

&lt;p&gt;The focus on the textual content mean that user loses out on experiencing the art.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you do justice to art?
&lt;/h2&gt;

&lt;p&gt;Graphic Novels, comics and Childrens’ books are as much about the illustrations and the art as the story.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3j2hbhzcs40fizro8kl3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3j2hbhzcs40fizro8kl3.jpeg" alt="Watchmen" width="700" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The art in such books are a labour of love and painstakingly detailed. Mobile Form factors do not render these as originally intended by the artist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fstgl3r9rw3g8c89hdh2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fstgl3r9rw3g8c89hdh2j.png" alt="Gosu" width="209" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artists and authors recognize the issue and are beginning to address this problem in new ways. Webtoons, a site with mostly South Korean artists, formats all content in vertical panels with very large text bubbles — this is art designed specifically for consumption on mobile devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphics are not just for entertainment
&lt;/h2&gt;

&lt;p&gt;Before we dismiss this problem as trivial and relevant only to entertainment, consider that graphics are an integral portion of most technical manuals. To quote a cliche “a picture is worth a thousand words”.&lt;/p&gt;

&lt;p&gt;Today, graphical novels are being used for more than just comics. Google has used them to explain the inner workings of a browser. Universities use them to explain copyright laws. So this isn’t a challenge to be taken lightly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where do we go from here?
&lt;/h2&gt;

&lt;p&gt;Content creators are evolving to produce art that is more easily rendered on mobile devices. E-book stores are creating technology to help improve a consumer’s experience of consuming such content. However, convenience and market forces are not the only driving factors. As technology makes them more affordable, people who can afford it, are moving to other larger form factors such as tablets. These solve the problem of real estate.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://www.feldspartech.com/" rel="noopener noreferrer"&gt;FeldsparTech&lt;/a&gt;, one of our design tenets is to model technology after nature and the real world. We believe that reading a digital book should be as similar to reading a physical one as we can make it. And that everything else that consuming digital media typically entails (algorithms, annoying ads) should be removed or reduced from the user’s experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/E-book#Inventor" rel="noopener noreferrer"&gt;Ebook Inventor — Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theverge.com/2016/7/21/12229074/google-play-books-bubble-zoom-machine-learning-sdcc-2016" rel="noopener noreferrer"&gt;Google’s new Bubble Zoom feature will make reading comics on your phone easier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.comixology.com/new-to-comixology" rel="noopener noreferrer"&gt;Comics by comiXology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/googlebooks/chrome/" rel="noopener noreferrer"&gt;Google Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.law.duke.edu/cspd/comics/zoomcomic.html" rel="noopener noreferrer"&gt;CSPD Zoomed Comic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also posted &lt;a href="https://feldspar-tech.medium.com/online-reading-why-it-fails-for-some-formats-53714754e568" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>books</category>
      <category>startup</category>
    </item>
    <item>
      <title>Sunk Cost Fallacy and Books</title>
      <dc:creator>Vivek Kodira</dc:creator>
      <pubDate>Sat, 21 Nov 2020 13:50:51 +0000</pubDate>
      <link>https://dev.to/feldspartech/sunk-cost-fallacy-and-books-15l8</link>
      <guid>https://dev.to/feldspartech/sunk-cost-fallacy-and-books-15l8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Individuals commit the sunk cost fallacy when they continue a behavior or endeavor as a result of previously invested resources (time, money or effort)&lt;br&gt;
(Arkes &amp;amp; Blumer, 1985)”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How often have you read a terrible book all the way through just because you have already paid for it or read halfway through it. This is the sunk cost fallacy at play.&lt;/p&gt;

&lt;p&gt;Online book stores allow you to preview books — read the first few pages before deciding. But what if you decide you don’t like a book halfway through?&lt;/p&gt;

&lt;p&gt;There are two factors that typically contribute to the sunk cost fallacy — one is the effort and time already invested, the second is the actual money already spent.&lt;/p&gt;

&lt;p&gt;There is not much one can do about the former, but the financial cost is definitely something that can be addressed. There are two ways to do this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The easiest is to reduce the cost so that you the consumer don’t have to worry about it when deciding what to do next. This approach however is zero-sum — i.e to benefit you, the creator of the content you are consuming will have to suffer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Another is a pay-per-use model. You pay only for what you consume. When you decide to stop, you can. But not all media lends itself to this model; books for instance. But what if there was a way to implement pay-per-use for books?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We at &lt;a href="https://www.feldspartech.com/" rel="noopener noreferrer"&gt;FeldsparTech&lt;/a&gt; think we know of a way and can’t wait to show you what we have in mind.&lt;/p&gt;

&lt;p&gt;Also posted &lt;a href="https://feldspar-tech.medium.com/sunk-cost-fallacy-and-books-3cb5bc9c12d0" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>books</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
