<?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: Sung M. Kim</title>
    <description>The latest articles on Forem by Sung M. Kim (@dance2die).</description>
    <link>https://forem.com/dance2die</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%2F28849%2F5e7067cb-3d4d-4bd9-9f5a-c5183a93fb51.jpeg</url>
      <title>Forem: Sung M. Kim</title>
      <link>https://forem.com/dance2die</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dance2die"/>
    <language>en</language>
    <item>
      <title>Notes on the Dip by Seth Godin</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Tue, 13 Oct 2020 21:08:22 +0000</pubDate>
      <link>https://forem.com/dance2die/notes-on-the-dip-by-seth-godin-4p2l</link>
      <guid>https://forem.com/dance2die/notes-on-the-dip-by-seth-godin-4p2l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Second time reading &lt;a href="https://www.goodreads.com/book/show/324748.The_Dip"&gt;The Dip&lt;/a&gt; by &lt;a href="https://www.sethgodin.com/"&gt;Seth Godin&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Without notes/reflection, I forgot all about it.&lt;br&gt;&lt;br&gt;
Only relevant part of the book is here so read the whole book.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson
&lt;/h2&gt;

&lt;p&gt;The Dip is&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I've double quoted "best" everywhere. Reason coming later.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What
&lt;/h3&gt;

&lt;p&gt;Quitting always and be the "best"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ihw8xhrm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3p8vkvonv659n0puynq0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ihw8xhrm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3p8vkvonv659n0puynq0.jpg" alt="all the things"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  When
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Quitting in Cul-de-Sac ("dead end") or in Cliff&lt;/li&gt;
&lt;li&gt;Quitting at the moment of hardship is the worst time while in the Dip&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Plan ahead before quitting (not at the moment of hardship)&lt;/li&gt;
&lt;li&gt;Specify the "quit condition" ahead of time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why
&lt;/h3&gt;

&lt;p&gt;Quitting has a bad reputation.&lt;br&gt;&lt;br&gt;
Can't become the "best" (contextual, flexible, subject) in the world? Then quit.&lt;br&gt;&lt;br&gt;
The "best" in any reaps much more reward than the rest&lt;/p&gt;

&lt;h3&gt;
  
  
  Where
&lt;/h3&gt;

&lt;p&gt;Persevere across the market&lt;/p&gt;

&lt;h2&gt;
  
  
  To be the "Best"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Quit the wong stuff (&lt;em&gt;Cul-de-Sac and the Cliff&lt;/em&gt;)&lt;br&gt;&lt;br&gt;
Stick with the right stuff (&lt;em&gt;And getting thru the Dip&lt;/em&gt;)&lt;br&gt;&lt;br&gt;
Have the guts to do one or the other&lt;br&gt;
page 4&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Curves
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Dip
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YXTdrhPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/phj47rruoc45r0zw26db.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YXTdrhPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/phj47rruoc45r0zw26db.jpg" alt="the dip"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;source: &lt;a href="https://seths.blog/2007/05/images_from_the/"&gt;https://seths.blog/2007/05/images_from_the/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Things start easy and fun.&lt;br&gt;&lt;br&gt;
In days or weeks, your experience level tanks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is the dip&lt;/li&gt;
&lt;li&gt;This is where you should persevere (e.g. bureaucracy and busywork on page 17)&lt;/li&gt;
&lt;li&gt;This is what separates a beginner from an expert&lt;/li&gt;
&lt;li&gt;This is the "set of artificial screens set up to keep people like you out" (page 18)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;IMPORTANT NOTE&lt;/strong&gt;:
&lt;/h4&gt;

&lt;p&gt;Successful people don't just ride out the Dip.&lt;br&gt;&lt;br&gt;
&lt;em&gt;They push harder, changing the rules as they go.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cul-de-Sac ("Dead End")
&lt;/h3&gt;

&lt;p&gt;There is no progress. "It just is."&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Quit this RIGHT AWAY!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--frcVl32O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fs9995bzuuaaubwnixel.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--frcVl32O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fs9995bzuuaaubwnixel.jpg" alt="cul-de-sac"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;source: &lt;a href="https://seths.blog/2007/05/images_from_the/"&gt;https://seths.blog/2007/05/images_from_the/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cliff (Rare but scary)
&lt;/h3&gt;

&lt;p&gt;The graph goes up, but at the end, it drops hard...&lt;br&gt;&lt;br&gt;
e.g.) Smokers get pleasures over time but the end is normally not good&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D7RAAlZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s3izj7kq1ayulsnqj2nr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D7RAAlZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s3izj7kq1ayulsnqj2nr.jpg" alt="the cliff"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;source: &lt;a href="https://seths.blog/2007/05/images_from_the/"&gt;https://seths.blog/2007/05/images_from_the/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "Best" is
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;page 10&lt;/em&gt;&lt;br&gt;&lt;br&gt;
I double-quoted "best" everywhere because it is&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contextual - "best" for some people but not for others

&lt;ul&gt;
&lt;li&gt;"best" depends&lt;/li&gt;
&lt;li&gt;"best" in the world as in what people have "access" to (to the best of people's knowledge)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Flexible&lt;/li&gt;
&lt;li&gt;Subjective - because consumer decides what's "best"&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Reasons why the "best" matters
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;We intentionally narrow our choices to those at the top&lt;br&gt;&lt;br&gt;
The rewards for being first are enormous&lt;br&gt;
Scarcity makes being at the top worth something&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Infinity Problem
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 12&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The more choice there are, the more people panic (and don't buy/decide anything)&lt;/li&gt;
&lt;li&gt;People get lazy and go with the market leader&lt;/li&gt;
&lt;li&gt;The "best" is even more relevant&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Unlearn what you learned in schools
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 15&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Schools taught us to be well rounded to be successful.&lt;br&gt;&lt;br&gt;
It's wrong because, a free market rewards the exceptional.&lt;/p&gt;

&lt;p&gt;Schools taught us to take care of easy tasks and skip hard questions, maybe not even take care of it.&lt;/p&gt;

&lt;p&gt;But you have to eat frogs first and superstars are rewarded hansomely because they can't skip hard tasks and very good at taking care of tasks they don't know&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.goodreads.com/book/show/95887.Eat_That_Frog"&gt;Eat that Frog!&lt;/a&gt; by Brian Tracy&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "Strategic quitting"
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 16&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;... is the secret of successful organizations&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;People normally quit at the moment they thought they should quit.&lt;br&gt;&lt;br&gt;
But you need to think ahead before quitting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The first step toward getting what you want is understanding the different types of situations that lead you to quit - or that should cause you to quit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Page 63&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;is a conscious decision you make based on the choices that are available to you.&lt;br&gt;&lt;br&gt;
But "Failing" means that your dream is over&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It happens&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"when you give up"&lt;/li&gt;
&lt;li&gt;"when there are no other options"&lt;/li&gt;
&lt;li&gt;"when you quit so often that you've used up all your time and resources"&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"Coping" is a lousy alternative to quitting and what people do when they try to muddle through&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The dip is where success happens
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 23&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;brave&lt;/strong&gt; thing is to get through the dip and reap rewards&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;mature&lt;/strong&gt; thing to do is not even start something you can't be best at&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;stupid&lt;/strong&gt; thing is to start and give up in the Dip&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real success goes to those who obsess
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 29&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;한우물만 파라. 깊게.&lt;br&gt;&lt;br&gt;
You must obsess and persevere across the market. (More on this later)&lt;/p&gt;

&lt;p&gt;e.g.) A woodpecker pecking one tree 10k times VS. A woodpecker pecking 10k trees one time&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven reasons you might fail to become the best in the world
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 33&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You run out of time (and quit)&lt;/li&gt;
&lt;li&gt;You run out of money (and quit)&lt;/li&gt;
&lt;li&gt;You get scared (and quit)&lt;/li&gt;
&lt;li&gt;You're not serious about it (and quit)&lt;/li&gt;
&lt;li&gt;You lose interest or enthusiasm or settle for being mediocre (and quit)&lt;/li&gt;
&lt;li&gt;You focus on the short term instead of the long (and quit when the short term gets too hard)&lt;/li&gt;
&lt;li&gt;You pick the wrong thing at which to be the best in the world (because you don't have the talent)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can plan ahead to get around those seven reasons of failures.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most of the time, if you fail to become the best in the world, it's either because you planned wrong or because you gave up before you reached your goal&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Eight Dip Curves
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 36&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I will focus on only three.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conceptual Dip

&lt;ul&gt;
&lt;li&gt;The dip is to unlearn what you learned (your "assumptions")&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Education Dip

&lt;ul&gt;
&lt;li&gt;Dip often hits when it's time to go learn something new, to reinvent or rebuild your skills&lt;/li&gt;
&lt;li&gt;So basically when you gotta do something yourself&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Distribution Dip

&lt;ul&gt;
&lt;li&gt;The dip is to distribute via scare channels&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Valley of Death
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 41&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Competitotrs strive to create a very deep Dip&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to prevent competitors to catch up&lt;/li&gt;
&lt;li&gt;by making it harder to get through the Dip&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The opposite of quitting isn't "Waiting Around"
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 51&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The opposite is "rededication"&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;an invigorated new strategy designed to break the problem apart&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Dip is not "static" but "flexible".&lt;br&gt;&lt;br&gt;
The more effort you put into it (for better or worse).&lt;/p&gt;

&lt;h2&gt;
  
  
  No one quits the Boston marathon at mile 25
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 54&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No one quits when you can see the end.&lt;br&gt;&lt;br&gt;
Once you can "&lt;strong&gt;visualize&lt;/strong&gt;" the end, you can persist to reach the end&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Pride is the enemy of the smart quitter&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 65&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You feel good after quitting because "hurting one's pride is not fatal"&lt;/p&gt;

&lt;h2&gt;
  
  
  Three questions to ask before quitting
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 66&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Question 1: Am i panicking?

&lt;ul&gt;
&lt;li&gt;Don't quit at the moment you are in panic.&lt;/li&gt;
&lt;li&gt;"it's the exactly the wrong time to make such a critical decision"&lt;/li&gt;
&lt;li&gt;"Decide in advance" when to quit (You can quit after panic settles)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Question 2: Who am I trying to influence?

&lt;ul&gt;
&lt;li&gt;"One person or organizations will behave differently than a market of people"&lt;/li&gt;
&lt;li&gt;"the rules are different"

&lt;ul&gt;
&lt;li&gt;"Influencing one person is like scaling a wall" - Making a progress can get easier or even harder over time&lt;/li&gt;
&lt;li&gt;"Influencing a market is more of a hill than a wall" - Making a progress get easier over time one step at a time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Question 3: What sort of measurable progress am I making?

&lt;ul&gt;
&lt;li&gt;The measurable progress can be "subtle, but it needs to be more than a mantra"&lt;/li&gt;
&lt;li&gt;"Surviving is succeeding" doesn't work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All those perseverance stories of nothing quitting "almost always comes from people moving through a market"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to quit
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Page 71&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write down the condition/circumstances under which you are willing to quit

&lt;ul&gt;
&lt;li&gt;And then "stick with it"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;"Outline your quitting strategy BEFORE the discomfort sets in"

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;because it's hard to see when you are in the Dip or Cul-de-Sac, differentiating those is hard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/einladung_zum_essen-3625323/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=4171459"&gt;Bernadette Wurzinger&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=4171459"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>books</category>
      <category>notes</category>
    </item>
    <item>
      <title>Tailwind CSS - Fluid Width Video</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Sat, 10 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://forem.com/dance2die/tailwind-css-fluid-width-video-4082</link>
      <guid>https://forem.com/dance2die/tailwind-css-fluid-width-video-4082</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Learned how to make YouTube videos from this CSS Tricks article, &lt;a href="https://css-tricks.com/fluid-width-video/"&gt;Fluid Width Video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The following code snippet is a Tailwind CSS version of &lt;a href="https://css-tricks.com/fluid-width-video/#iframe-video-youtube-vimeo-etc"&gt;&amp;lt;iframe&amp;gt; Video (YouTube, Vimeo, etc.)&lt;/a&gt; section._&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluid Width iFrame Video
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add a wrapper element with following classes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tailwindcss.com/docs/position#relative"&gt;relative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Tailwind CSS &lt;code&gt;padding&lt;/code&gt; extension
&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;purge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...],&lt;/span&gt;
    &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fluid-video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;56.25%&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="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&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;ol&gt;
&lt;li&gt;Remove the wrapper height with &lt;a href="https://tailwindcss.com/docs/height#app"&gt;h-0&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Position &lt;code&gt;iframe&lt;/code&gt; with an &lt;a href="https://tailwindcss.com/docs/position#absolute"&gt;absolute&lt;/a&gt; positioning on &lt;a href="https://tailwindcss.com/docs/top-right-bottom-left#app"&gt;top left&lt;/a&gt; (&lt;code&gt;top-0&lt;/code&gt;, &lt;code&gt;left-0&lt;/code&gt;), with 100% &lt;a href="https://tailwindcss.com/docs/width#app"&gt;width&lt;/a&gt; and &lt;a href="https://tailwindcss.com/docs/height#app"&gt;height&lt;/a&gt; (&lt;code&gt;w-full&lt;/code&gt;, &lt;code&gt;h-full&lt;/code&gt;).&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"responsiveVideoWrapper"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative h-0 pb-fluid-video"&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;iframe&lt;/span&gt;
    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute top-0 left-0 w-full h-full"&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://www.youtube.com/embed/zihoyz0u_cs"&lt;/span&gt;
    &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"&lt;/span&gt;
    &lt;span class="na"&gt;allowFullScreen&lt;/span&gt;
  &lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iframe&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;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/skitterphoto-324082/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1017451"&gt;Rudy and Peter Skitterians&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1017451"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>css</category>
      <category>youtube</category>
      <category>cheatsheet</category>
    </item>
    <item>
      <title>Trying to understand Etag</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Fri, 09 Oct 2020 02:17:12 +0000</pubDate>
      <link>https://forem.com/dance2die/trying-to-understand-etag-oo</link>
      <guid>https://forem.com/dance2die/trying-to-understand-etag-oo</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I found out about &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag" rel="noopener noreferrer"&gt;Etag&lt;/a&gt; while reading thru &lt;a href="https://developers.google.com/youtube/v3/docs/playlistItems#etag" rel="noopener noreferrer"&gt;Youtube Data API documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the properties returned as part of JSON response was &lt;code&gt;etag&lt;/code&gt; with description "The Etag of this resource."&lt;/p&gt;

&lt;p&gt;Fascinating how I wasn't aware of this nice web feature.&lt;/p&gt;

&lt;p&gt;This post is the summary of what I understood from reading the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag" rel="noopener noreferrer"&gt;Etag documentation&lt;/a&gt; on MDN (Mozilla Developer Network) documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an ETag?
&lt;/h2&gt;

&lt;p&gt;It's a response header returned from a server to identify the resource version.&lt;br&gt;&lt;br&gt;
It's a simple string value (or prefixed with &lt;code&gt;W/&lt;/code&gt;, more on this later).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e.g.) 
etag: "123dklj"
etag: W/"diekjfk"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: Youtube Data API returns it as part of the resource "body" instead of as a response header&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before diving into how it's useful, let's check out two types of etags (weak &amp;amp; strong).&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Etags
&lt;/h2&gt;

&lt;p&gt;There are two types of Etags, "Weak" and "Strong".&lt;/p&gt;

&lt;h3&gt;
  
  
  A Weak Etag
&lt;/h3&gt;

&lt;p&gt;This is a "fuzzy" resource match against what a client has against what the server has.&lt;br&gt;&lt;br&gt;
If a blog post content hasn't changed only the dates shown on the post, then the weak Etag would validate to be true.&lt;/p&gt;

&lt;p&gt;You need to prefix the Etag value with &lt;code&gt;W/&lt;/code&gt; (a capital "W") to identify the value as weak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e.g.)
etag: W/"3121lasjd"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A Strong ETag
&lt;/h3&gt;

&lt;p&gt;This matches etag value for a "byte-to-byte" equivalence of resource on the server.&lt;br&gt;&lt;br&gt;
This is a digital finger print and can be generated using MD5 hash.&lt;/p&gt;

&lt;p&gt;There is no prefix required unlike the weak version, just a string value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e.g.)
etag: "12343hdhjkakiek"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What problems does it solve?
&lt;/h2&gt;

&lt;p&gt;Etag solves two issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mid-air collision detection ("Optimistic concurrency control
")&lt;/li&gt;
&lt;li&gt;Unchanged Resource caching&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Mid-air collision detection
&lt;/h3&gt;

&lt;p&gt;Etag solves the issue of, is the resource I am updating the same or modified by someone else?&lt;/p&gt;

&lt;p&gt;Suppose that there are two web clients, "Client #1" and "Client #2" and retrieved the same resource from a server (They both have the same etag).&lt;/p&gt;

&lt;p&gt;When the client #1 updates the resource, the server will now generate a new etag as the content has changed.&lt;br&gt;&lt;br&gt;
If the client #2 tries to write to the same resource, the server will reject as it was modified by another client and client #2 needs to get a new resource, and try to write again.&lt;/p&gt;

&lt;p&gt;In detail, clients will include &lt;code&gt;If-Match: &amp;lt;EtagValue&amp;gt;&lt;/code&gt; request header to make sure to update only "if matching" etag exists (meaning, resource hasn't changed).&lt;/p&gt;

&lt;p&gt;In database term, it's called &lt;a href="https://en.wikipedia.org/wiki/Optimistic_concurrency_control" rel="noopener noreferrer"&gt;Optimistic concurrency control&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can see the flow in the drawing below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm0kpb7901cellhcucdw8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm0kpb7901cellhcucdw8.jpg" alt="if-match"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Unchanged Resource caching
&lt;/h3&gt;

&lt;p&gt;Etag also tries to solve the issue of loading resources from cache when the resource requested hasn't changed on the server.&lt;/p&gt;

&lt;p&gt;Youtube Data API has a quota for API calls and you can  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Increase a resource load time if it hasn't changed.&lt;/li&gt;
&lt;li&gt;Save on a quota cost.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When a resource hasn't changed, the server implementing Etag returns the HTTP Status code, 304 (Not Modified), thus a client can load data from cache.&lt;br&gt;&lt;br&gt;
If it has changed, then the server would return an updated resource.&lt;/p&gt;

&lt;p&gt;A client would include a request header, &lt;code&gt;If-None-Match: &amp;lt;EtagValue&amp;gt;&lt;/code&gt; when making a request. The server checks if the specified etag value exists. The server would return a new resource "if none matching" etag is found.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj6hlqopt1k6k0t6gefvp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj6hlqopt1k6k0t6gefvp.jpg" alt="if-none-match"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/BRRT-122519/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=3150731" rel="noopener noreferrer"&gt;BRRT&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=3150731" rel="noopener noreferrer"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>etag</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Ubuntu - IBus not working on Visual Studio Code</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Fri, 09 Oct 2020 02:13:30 +0000</pubDate>
      <link>https://forem.com/dance2die/ubuntu-ibus-not-working-on-visual-studio-code-1m37</link>
      <guid>https://forem.com/dance2die/ubuntu-ibus-not-working-on-visual-studio-code-1m37</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Install the official &lt;code&gt;.deb&lt;/code&gt; version of VS Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue
&lt;/h2&gt;

&lt;p&gt;Running Ubuntu 20.04 LTS, I was unable to type in Korea in VS Code as I was trying out &lt;a href="https://react.i18next.com/"&gt;react-i18next&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;IBus IME doesn't work on &lt;a href="https://snapcraft.io/code"&gt;Snap version of VS Code&lt;/a&gt;, reported on GitHub but not addressed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/vscode/issues/68625"&gt;Snap: keyboard input method ibus for Korean doesn't work. #68625&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Microsoft/vscode/issues/46941"&gt;Can't input Chinese in Linux system #46941&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What happened?
&lt;/h2&gt;

&lt;p&gt;Ubuntu 20.04 version of "Ubuntu Software" now installs snap version of software.  &lt;/p&gt;

&lt;p&gt;Refer to &lt;a href="https://www.omgubuntu.co.uk/2020/02/ubuntu-snap-store-transition"&gt;Ubuntu Switches to a Snap’d Software Store for 20.04&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolution
&lt;/h2&gt;

&lt;p&gt;Go and download the official &lt;code&gt;.deb&lt;/code&gt; version of VS Code...&lt;br&gt;&lt;br&gt;
Yes. That worked great.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Refer to the "answer #4" in &lt;a href="https://www.tutorialfor.com/questions-81682.htm"&gt;linux - japanese input is not possible on vscode on ubuntu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/philippreiner-685280/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=590114"&gt;Philipp Reiner&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=590114"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>vscode</category>
      <category>ibus</category>
    </item>
    <item>
      <title>Namespace separator syntax using gatsby-plugin-react-i18next</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Fri, 09 Oct 2020 02:12:07 +0000</pubDate>
      <link>https://forem.com/dance2die/namespace-separator-syntax-using-gatsby-plugin-react-i18next-m7j</link>
      <guid>https://forem.com/dance2die/namespace-separator-syntax-using-gatsby-plugin-react-i18next-m7j</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;First time learning i18n (internationalization) using &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-react-i18next/"&gt;gatsby-plugin-react-i18next&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I chose this specific Gatsby plugin as it wraps around &lt;a href="https://react.i18next.com/"&gt;react-i18next&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason is similar to Robin Wieruch's description in his blog, &lt;a href="https://www.robinwieruch.de/react-internationalization#react-internationalization-which-library-should-i-use"&gt;React Internationalization with i18n &amp;gt; REACT INTERNATIONALIZATION: WHICH LIBRARY SHOULD I USE?&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;But I had trouble accessing keys by namespace using ":" syntax.&lt;/p&gt;

&lt;p&gt;e.g.) Accessing &lt;code&gt;text&lt;/code&gt; under &lt;code&gt;header&lt;/code&gt; namespace&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;i18next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;header:text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;declared as following file, &lt;code&gt;&amp;lt;project root&amp;gt;/locales/&amp;lt;language&amp;gt;/header.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;text:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Greetings"&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;The React page was displaying &lt;code&gt;header:text&lt;/code&gt; instead of &lt;code&gt;Greetings&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue
&lt;/h2&gt;

&lt;p&gt;The issue was to blindly copy the example configuration in the &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-react-i18next/"&gt;gatsby-plugin-react-i18net &amp;gt; Configure the plugin&lt;/a&gt; documentation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In your gatsby-config.js&lt;/span&gt;
&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`gatsby-plugin-react-i18next`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/locales`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`en`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`es`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`de`&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;defaultLanguage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`en`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// you can pass any i18next options&lt;/span&gt;
      &lt;span class="c1"&gt;// pass following options to allow message content as a key&lt;/span&gt;
      &lt;span class="na"&gt;i18nextOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;interpolation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;escapeValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;// not needed for react as it escapes by default&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;keySeparator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// 👇 issue here&lt;/span&gt;
        &lt;span class="na"&gt;nsSeparator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;matchPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:lang?/blog/:uid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;getLanguageFromPath&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="na"&gt;excludeLanguages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es&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="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;matchPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/preview&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&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="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&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;I didn't know each of those options without understanding each option.&lt;br&gt;&lt;br&gt;
After few hours of digging around, the culprit turned out to be &lt;a href="https://www.i18next.com/overview/configuration-options#misc"&gt;nsSeparator&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Either leave the &lt;code&gt;nsSeparator&lt;/code&gt; option out for a default &lt;code&gt;:&lt;/code&gt; separator or pass a string to it to use the namespace syntax.&lt;/p&gt;

&lt;p&gt;e.g.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;nsSeparator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>react</category>
      <category>gatsby</category>
    </item>
    <item>
      <title>Check out repository before using GitHub @actions/glob</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Fri, 09 Oct 2020 02:10:02 +0000</pubDate>
      <link>https://forem.com/dance2die/check-out-repository-before-using-github-actions-glob-3mka</link>
      <guid>https://forem.com/dance2die/check-out-repository-before-using-github-actions-glob-3mka</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Check out repository with &lt;a href="https://github.com/actions/checkout"&gt;actions/checkout@v2&lt;/a&gt; before &lt;a href="https://github.com/actions/toolkit/tree/master/packages/glob"&gt;@actions/glob&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The goal was to use &lt;a href="https://docs.github.com/en/actions/creating-actions/creating-a-javascript-action"&gt;GitHub JavaScript Action&lt;/a&gt; to validate URLs in a repostory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;The problem was that, &lt;code&gt;@actions/glob&lt;/code&gt; library did not return any files even with a global matching pattern, &lt;code&gt;**&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;glob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@actions/glob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;globber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;globber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// files = []&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Fix
&lt;/h2&gt;

&lt;p&gt;To access the file in GitHub action, one needs to check out a repository to access files for.&lt;/p&gt;

&lt;p&gt;e.g.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Report broken URLs&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;report_job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# 👇 Check out the repository&lt;/span&gt;
      &lt;span class="c1"&gt;# to be able to access the repository files&lt;/span&gt;
      &lt;span class="c1"&gt;# in "my_action"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate repository URLs and report broken link(s)&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_action@master&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;p&gt;Image by &lt;a href="https://pixabay.com/photos/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1246588"&gt;Free-Photos&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1246588"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>github</category>
      <category>actions</category>
    </item>
    <item>
      <title>Prerequisite to understanding TypeScript Omit in React TypeScript Cheatsheet</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Fri, 09 Oct 2020 02:08:15 +0000</pubDate>
      <link>https://forem.com/dance2die/prerequisite-to-understanding-typescript-omit-in-react-typescript-cheatsheet-4k4b</link>
      <guid>https://forem.com/dance2die/prerequisite-to-understanding-typescript-omit-in-react-typescript-cheatsheet-4k4b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;A note to self lest I forget the resources I learned from.&lt;/p&gt;

&lt;p&gt;As I was going thru &lt;a href="https://twitter.com/swyx"&gt;Swyx&lt;/a&gt;'s React TypeScript Cheatsheet, &lt;a href="https://react-typescript-cheatsheet.netlify.app/docs/advanced/patterns_by_usecase/#props-omit-prop-from-a-type"&gt;Props: Omit prop from a type&lt;/a&gt;, I had trouble understand the definition of &lt;code&gt;Omit&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// this comes inbuilt with TS 3.5&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Could not wrap my heads around it so Googled and found &lt;a href="https://twitter.com/mariusschulz"&gt;Marius Schulz&lt;/a&gt;'s blog posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blog read order
&lt;/h2&gt;

&lt;p&gt;I read these backwards initially but the posts in following order seems to make sense.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://mariusschulz.com/blog/keyof-and-lookup-types-in-typescript"&gt;keyof and Lookup Types in TypeScript&lt;/a&gt; - Learn about &lt;code&gt;keyof&lt;/code&gt; used for &lt;code&gt;Omit&lt;/code&gt; and &lt;code&gt;Exclude&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mariusschulz.com/blog/conditional-types-in-typescript"&gt;Conditional Types in TypeScript&lt;/a&gt; - To understand &lt;code&gt;Exclude&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://mariusschulz.com/blog/the-omit-helper-type-in-typescript"&gt;The Omit Helper Type in TypeScript&lt;/a&gt; - To finally learn how &lt;code&gt;Omit&lt;/code&gt; is implemented&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/utility-types.html"&gt;Advaned utlity type document&lt;/a&gt; and &lt;a href="https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts"&gt;sources&lt;/a&gt; for&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Omit&amp;lt;Type, Keys&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definition&lt;/strong&gt;: Constructs a type by picking all properties from Type and then removing Keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys"&gt;https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts#L1504"&gt;https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts#L1504&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="cm"&gt;/**
    * Construct a type with the properties of T except for those in type K.
    */&lt;/span&gt;
   &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Pick&amp;lt;Type, Keys&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definition&lt;/strong&gt;: Constructs a type by picking the set of properties Keys from Type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys"&gt;https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts#L1480"&gt;https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts#L1480&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="cm"&gt;/**
    * From T, pick a set of properties whose keys are in the union K
    */&lt;/span&gt;
   &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&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;P&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&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;ol&gt;
&lt;li&gt;&lt;code&gt;Exclude&amp;lt;Type, ExcludedUnion&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definition&lt;/strong&gt;: Constructs a type by excluding from Type all union members that are assignable to ExcludedUnion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://www.typescriptlang.org/docs/handbook/utility-types.html#excludetype-excludedunion"&gt;https://www.typescriptlang.org/docs/handbook/utility-types.html#excludetype-excludedunion&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts#L1494"&gt;https://github.com/microsoft/TypeScript/blob/master/lib/lib.es5.d.ts#L1494&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="cm"&gt;/**
    * Exclude from T those types that are assignable to U
    */&lt;/span&gt;
   &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Misc. Link
&lt;/h2&gt;

&lt;p&gt;Need to watch Marius Schulz's Egghead course, &lt;a href="https://egghead.io/courses/advanced-static-types-in-typescript"&gt;Advanced Static Types in TypeScript&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/AJEL-676477/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2969490"&gt;Edward Lich&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2969490"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;cuz, Donut's hole reminds me of Omit 😉&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>typescript</category>
      <category>react</category>
    </item>
    <item>
      <title>CSS Gradient Text Note</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Thu, 01 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://forem.com/dance2die/css-gradient-text-note-1jgk</link>
      <guid>https://forem.com/dance2die/css-gradient-text-note-1jgk</guid>
      <description>&lt;p&gt;A note to self on how to make HTML text with gradient background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I saw a cool text with animated gradient for text on &lt;a href="https://www.digitalocean.com/deploy/" rel="noopener noreferrer"&gt;Digital Ocean's Delploy conference site&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;I wanted to know how it was implemented but didn't know how the gradient font was implemented in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  An easy trick on CSS Tricks?
&lt;/h2&gt;

&lt;p&gt;CSS-Tricks has a short article, &lt;a href="https://css-tricks.com/snippets/css/gradient-text/" rel="noopener noreferrer"&gt;Gradient Text&lt;/a&gt;, on how a gradient font is implemented.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;72px&lt;/span&gt;&lt;span class="p"&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;-webkit-linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-text-fill-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&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;&lt;em&gt;Source from &lt;a href="https://css-tricks.com/" rel="noopener noreferrer"&gt;CSS-Tricks&lt;/a&gt; article, &lt;a href="https://css-tricks.com/snippets/css/gradient-text/" rel="noopener noreferrer"&gt;Gradient Text&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As the &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix" rel="noopener noreferrer"&gt;CSS vendor prefix&lt;/a&gt;, &lt;code&gt;-webkit&lt;/code&gt; shows, it works for browsers like Chrome, Safari, or new Opera browsers (Works on FireFox on testing).&lt;/p&gt;

&lt;h3&gt;
  
  
  Webkit properties
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://webkit.org/blog/1424/css3-gradients/" rel="noopener noreferrer"&gt;-webkit-linear-gradient&lt;/a&gt;: An easy way to implement a linear gradient (introduced in 2008).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://css-tricks.com/almanac/properties/b/background-clip/#text" rel="noopener noreferrer"&gt;-webkit-background-clip&lt;/a&gt;: Works on &lt;code&gt;text&lt;/code&gt; clip while &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/background-clip" rel="noopener noreferrer"&gt;background-clip&lt;/a&gt; doesn't.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/background-clip" rel="noopener noreferrer"&gt;MDN uses&lt;/a&gt; &lt;code&gt;-webkit-background-clip&lt;/code&gt; for the text clip demo.
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;-webkit-background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&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;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;⚠ Provide a fallback &lt;code&gt;color&lt;/code&gt; property incase the text clip doesn't work.

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-text-fill-color" rel="noopener noreferrer"&gt;-webkit-text-fill-color&lt;/a&gt;: This looks replaceable with &lt;code&gt;color&lt;/code&gt; property.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Animating the background
&lt;/h2&gt;

&lt;p&gt;I have never used &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/animation" rel="noopener noreferrer"&gt;CSS animation&lt;/a&gt; and it requires declaring an animation as keyframes (a sequence?) and apply the animation on an HTML element using &lt;code&gt;animation&lt;/code&gt; specifying&lt;/p&gt;

&lt;p&gt;e.g.) &lt;a href="https://codepen.io/dance2die/pen/poyXVLx?editors=1100" rel="noopener noreferrer"&gt;Demo on CodePen&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML content
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"css-gnissy"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NOVEMBER 10-11 • A FREE 24-HOUR GLOBAL CONFERENCE&lt;span class="nt"&gt;&amp;lt;/span&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CSS style
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.css-gnissy&lt;/span&gt; &lt;span class="p"&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;-webkit-linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="no"&gt;red&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="no"&gt;green&lt;/span&gt; &lt;span class="m"&gt;40%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="no"&gt;blue&lt;/span&gt; &lt;span class="m"&gt;60%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="no"&gt;cyan&lt;/span&gt; &lt;span class="m"&gt;80%&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nl"&gt;-webkit-background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/*   
    `color` seems to work too
    -webkit-text-fill-color: transparent; 
  */&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200%&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;shine&lt;/span&gt; &lt;span class="m"&gt;2s&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;shine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200%&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&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;&lt;code&gt;animation: shine 2s linear infinite;&lt;/code&gt; breaks down to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/animation#keyframes-name" rel="noopener noreferrer"&gt;Keyframes name&lt;/a&gt; or &lt;a href="https://dev.toanimation-name"&gt;animation-name&lt;/a&gt;: &lt;code&gt;shine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toanimation-duration"&gt;animation-duration&lt;/a&gt;: &lt;code&gt;2s&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timing-function" rel="noopener noreferrer"&gt;animation-timing-function&lt;/a&gt;: &lt;code&gt;linear&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/animation-iteration-count" rel="noopener noreferrer"&gt;animation-iteration-count&lt;/a&gt;: &lt;code&gt;infinite&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;@keyframes&lt;/code&gt; seems like a monster of its own so I will just add an &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes" rel="noopener noreferrer"&gt;MDN link&lt;/a&gt; to refer to later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tailwind Gradient Text
&lt;/h2&gt;

&lt;p&gt;You can achive the gradient text effect with Tailwind CSS with &lt;a href="https://tailwindcss.com/docs/background-clip#cropping-to-text" rel="noopener noreferrer"&gt;bg-clip-text&lt;/a&gt; utility.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-center text-5xl font-extrabold leading-none tracking-tight"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-clip-text text-transparent bg-gradient-to-r from-teal-400 to-blue-500"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Hello world
  &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/lichtmagnet-14706/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=73350" rel="noopener noreferrer"&gt;Lichtmagnet&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=73350" rel="noopener noreferrer"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>devjournal</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Snowpack - The requested module '/web_modules/recoil.js' does not provide an export named 'RecoilRoot'</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Tue, 07 Jul 2020 15:53:02 +0000</pubDate>
      <link>https://forem.com/dance2die/snowpack-the-requested-module-webmodules-recoil-js-does-not-provide-an-export-named-recoilroot-1b84</link>
      <guid>https://forem.com/dance2die/snowpack-the-requested-module-webmodules-recoil-js-does-not-provide-an-export-named-recoilroot-1b84</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I started learning &lt;a href="https://www.snowpack.dev/"&gt;Snowpack&lt;/a&gt; and have been pleased with the speed and development experience.&lt;/p&gt;

&lt;p&gt;As I was learning &lt;a href="https://recoiljs.org/"&gt;Recoil&lt;/a&gt;, a new React state management library by Facebook (but not by React core team), I was running into following error message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uncaught SyntaxError: The requested module '/web_modules/recoil.js' does not provide an export named 'RecoilRoot'&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I will talk about how to get around the issue and this won't be about how to use Snowpack or Recoil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducing the error
&lt;/h2&gt;

&lt;p&gt;I used &lt;a href="https://www.snowpack.dev/#create-snowpack-app-(csa)"&gt;Create Snowpack App (CSA)&lt;/a&gt; with a React template, &lt;a href="https://github.com/pikapkg/create-snowpack-app/tree/master/templates/app-template-react"&gt;@snowpack/app-template-react&lt;/a&gt; to bootstrap a new React project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-snowpack-app new-dir &lt;span class="nt"&gt;--template&lt;/span&gt; @snowpack/app-template-react &lt;span class="nt"&gt;--use-yarn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And then &lt;a href="https://recoiljs.org/docs/introduction/getting-started#installation"&gt;installed Recoil&lt;/a&gt; as a dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add recoil
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I initially wrapped the root element with &lt;a href="https://recoiljs.org/docs/introduction/getting-started/#recoilroot"&gt;RecoilRoot&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// imported 👇 as shown in the Reoil doc&lt;/span&gt;
&lt;span class="c1"&gt;// https://recoiljs.org/docs/introduction/getting-started/#recoilroot&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RecoilRoot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;recoil&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StrictMode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RecoilRoot&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/RecoilRoot&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.StrictMode&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&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;// Hot Module Replacement (HMR) - Remove this snippet to remove HMR.&lt;/span&gt;
&lt;span class="c1"&gt;// Learn more: https://www.snowpack.dev/#hot-module-replacement&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;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accept&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;But then the error mentioned in the "Introduction" occurred.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CGOIkD2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/dcb264add0f54fe8f9d0335494c4a1e6/c8cd5/error-in-browser.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CGOIkD2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/dcb264add0f54fe8f9d0335494c4a1e6/c8cd5/error-in-browser.jpg" alt="error" title="error"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolution
&lt;/h2&gt;

&lt;p&gt;It looks like Snowpack has an issue with CJS (CommonJS) libraries according this issue, &lt;a href="https://github.com/pikapkg/snowpack/issues/440"&gt;https://github.com/pikapkg/snowpack/issues/440&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The resolution in the GitHub issue is not to use named export, but to import the whole module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Import 👇 the library as a whole&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Recoil&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;recoil&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StrictMode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 👇 Explicitly named element */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Recoil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RecoilRoot&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Recoil.RecoilRoot&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.StrictMode&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&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;// Hot Module Replacement (HMR) - Remove this snippet to remove HMR.&lt;/span&gt;
&lt;span class="c1"&gt;// Learn more: https://www.snowpack.dev/#hot-module-replacement&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;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accept&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 means, everywhere you use Recoil, you need to import the whole module.&lt;br&gt;
I found it a bit annoying but haven't been able to find out a better solution.  &lt;/p&gt;

&lt;p&gt;Please leave a comment if you can share a different way :)&lt;/p&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/zmortero-1348534/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=912247"&gt;zmortero&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=912247"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>snowpack</category>
    </item>
    <item>
      <title>Tampermonkey script to show anchor tag links on dev.to articles</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Thu, 02 Jul 2020 20:40:20 +0000</pubDate>
      <link>https://forem.com/dance2die/tampermonkey-script-to-show-anchor-tag-links-on-dev-to-articles-bln</link>
      <guid>https://forem.com/dance2die/tampermonkey-script-to-show-anchor-tag-links-on-dev-to-articles-bln</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I started using &lt;a href="https://www.tampermonkey.net/"&gt;Tampermonkey&lt;/a&gt; browser extension for some forums without "filtering" capabilities using a personal JavaScript code.&lt;/p&gt;

&lt;p&gt;As I've been moderating dev.to, I found it necessary to go thru all links to verify they follow dev.to &lt;a href="https://dev.to/terms#content-policy"&gt;Content Policy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tampermonkey made it easy to display all anchor links on a specific domain using a client-side JavaScript YOU write.&lt;/p&gt;

&lt;p&gt;I won't go into much details on Tampermonkey installation but will cover just how to create a script to display all anchor links in a post.&lt;/p&gt;

&lt;p&gt;If you want to quickly just paste a CSS to achieve a similar effect, check out this CSS by Robin &lt;a class="comment-mentioned-user" href="https://dev.to/darksmile92"&gt;@darksmile92&lt;/a&gt;
 Kretzschmar :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#article-body&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;" ("&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s1"&gt;") "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#52d849&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;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;What you will see in the end on every dev.to post looks like this.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://dev.to/avinash8847/mesure-your-create-react-app-build-331h"&gt;Mesure your create react app build.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KvEfe9gd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/945e569c53601208b9948cd1b8c4a7da/6bb2e/result.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KvEfe9gd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/945e569c53601208b9948cd1b8c4a7da/6bb2e/result.jpg" alt="result" title="result"&gt;&lt;/a&gt;](/static/945e569c53601208b9948cd1b8c4a7da/6bb2e/result.jpg)&lt;/p&gt;

&lt;h2&gt;
  
  
  Tampermonkey script
&lt;/h2&gt;

&lt;p&gt;Let's take a full source first (as it's short)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ==UserScript==&lt;/span&gt;
&lt;span class="c1"&gt;// @name         dev.to&lt;/span&gt;
&lt;span class="c1"&gt;// @namespace    http://tampermonkey.net/&lt;/span&gt;
&lt;span class="c1"&gt;// @version      0.1&lt;/span&gt;
&lt;span class="c1"&gt;// @description  try to take over the world!&lt;/span&gt;
&lt;span class="c1"&gt;// @author       You&lt;/span&gt;
&lt;span class="c1"&gt;// @match        https://dev.to/*&lt;/span&gt;
&lt;span class="c1"&gt;// @grant        none&lt;/span&gt;
&lt;span class="c1"&gt;// ==/UserScript==&lt;/span&gt;

&lt;span class="p"&gt;;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

  &lt;span class="c1"&gt;// Your code here...&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#article-body a&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;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertAdjacentHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;beforeEnd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;`➡&amp;lt;strong style="color: red"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/strong&amp;gt;`&lt;/span&gt;
      &lt;span class="p"&gt;)&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;&lt;code&gt;@match&lt;/code&gt; is the important bit, where we instruct Tampermonkey which domain we want to execute the JavaScript code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Refer to Tampermonkey documentation for other &lt;a href="https://www.tampermonkey.net/documentation.php"&gt;UserScript header&lt;/a&gt; (such as &lt;code&gt;@name&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Let's see how JavaScript code is implemented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selecting article links only
&lt;/h2&gt;

&lt;p&gt;Each DEV article has an element with &lt;code&gt;id='article-body'&lt;/code&gt;, which is what we are interested in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#article-body a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As there are multiple links, I used &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll"&gt;querySelectorAll&lt;/a&gt; to match only anchor tags under &lt;code&gt;#article-body&lt;/code&gt; using the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Descendant_combinator"&gt;descendant combinator&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Showing raw link next to anchor tags
&lt;/h2&gt;

&lt;p&gt;As &lt;code&gt;document.querySelectorAll("#article-body a")&lt;/code&gt; returns multiple anchor elements, we can iterate it with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach"&gt;NodeList#forEach&lt;/a&gt; (Note that &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll#Return_value"&gt;querySelectorAll returns a NodeList&lt;/a&gt;, not an array).&lt;/p&gt;

&lt;p&gt;We can then get a hold of an anchor element in the callback (I labeld it as &lt;code&gt;a&lt;/code&gt;), to which we can insert a custom HTML. &lt;/p&gt;

&lt;p&gt;The custom HTML will be an aweful-looking red-colored &lt;strong&gt;strong&lt;/strong&gt; element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertAdjacentHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;beforeEnd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;`➡&amp;lt;strong style="color: red"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/strong&amp;gt;`&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;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML"&gt;Element.insertAdjacentHTML()&lt;/a&gt; provides a way to add a custom HTML next to the current element.  &lt;/p&gt;

&lt;p&gt;You can play around with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML#Parameters"&gt;position&lt;/a&gt; (first parameter, &lt;code&gt;beforeEnd&lt;/code&gt;) the way you see fit.&lt;/p&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/KELLEPICS-4893063/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2925179"&gt;Stefan Keller&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2925179"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tampermonkey</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to create a custom Material UI theme for Gatsby</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Fri, 26 Jun 2020 14:53:34 +0000</pubDate>
      <link>https://forem.com/dance2die/how-to-create-a-custom-material-ui-theme-for-gatsby-1h6n</link>
      <guid>https://forem.com/dance2die/how-to-create-a-custom-material-ui-theme-for-gatsby-1h6n</guid>
      <description>&lt;p&gt;*** Note on 2020-06-26 ***&lt;/p&gt;

&lt;p&gt;There is a very nice customization video, React Material-UI Themes: &lt;a href="https://www.youtube.com/watch?v=bDkB3LoQKxs"&gt;Customize Material Components for your Project&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Been searching for easy way to customize Material UI (MUI hereafter) theme and found few online tools to help me get it done quick.&lt;/p&gt;

&lt;p&gt;Most of steps here are for configuring Gatsby for Material UI theme but a custom MUI theme set up is easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Bootstrap a new Gatsby site
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npx gatsby new site-name-here
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Install libraries
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://material-ui.com/"&gt;Material UI&lt;/a&gt; (MUI)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm &lt;span class="nb"&gt;install&lt;/span&gt; @material-ui/core
  &lt;span class="c"&gt;# or&lt;/span&gt;
  yarn add @material-ui/core
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.gatsbyjs.org/packages/gatsby-plugin-material-ui/?=gatsby-plugin-material-ui"&gt;gatsby-plugin-material-ui&lt;/a&gt; - Gatsby plugin for SSR support
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; gatsby-plugin-material-ui
  &lt;span class="c"&gt;# or&lt;/span&gt;
  yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; gatsby-plugin-material-ui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Create a custom MUI theme
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://material.io/resources/color"&gt;Google's Material Design Color Tool site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select primary &amp;amp; secondary colors and copy the current URL (, which updates on color selection)
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ka6kP2-C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/bad736d2163940130efa7c04ec54c75c/17fa4/color-tool-select-colors.png" alt="color tool" title="color tool"&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;a href="https://react-theming.github.io/create-mui-theme/"&gt;https://react-theming.github.io/create-mui-theme/&lt;/a&gt; and paste the URL in &lt;code&gt;Paste URL here&lt;/code&gt; input box&lt;/li&gt;
&lt;li&gt;Now custom Theme JSON should be generated on the bottom right
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VY1VWP2H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/a54b2c9610f5ae1622570b82cab0f148/17fa4/custom-json.png" alt="custom JSON" title="custom JSON"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. Configure MUI theme
&lt;/h2&gt;

&lt;p&gt;I will create a local plugin to keep the code organized.&lt;br&gt;&lt;br&gt;
Refer to &lt;a href="https://www.gatsbyjs.org/docs/creating-a-local-plugin/"&gt;Creating a Local Plugin&lt;/a&gt; for more info  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new local Gatsby plugins folder, &lt;code&gt;./plugins/custom-mui-theme&lt;/code&gt; in the project root&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure Gatsby plugin&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wrapRootElement.js&lt;/code&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A helper module to add MUI theme context provider&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gatsbyjs.org/docs/browser-apis/#wrapRootElement"&gt;wrapRootElement&lt;/a&gt; is a way to wrap the root Gatsby element. We will wrap the root element with MUI theme provider
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ThemeProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-ui/core/styles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrapRootElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;element&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`theme`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ThemeProvider&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&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;element&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ThemeProvider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gatsby-browser.js&lt;/code&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To wrap the top-level element with MUI theme provider for the browser&lt;/li&gt;
&lt;li&gt;We can simply export &lt;code&gt;wrapRootElement&lt;/code&gt; in one line
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;wrapRootElement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./wrapRootElement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gatsby-ssr.js&lt;/code&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To wrap the top-level element with MUI theme provider on the server side&lt;/li&gt;
&lt;li&gt;The implementation is the same as the browser version
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;wrapRootElement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./wrapRootElement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt; - Required for the local plugin&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the plugin name in the file
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom-mui-theme"&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;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new folder &lt;code&gt;./plugins/custom-mui-theme/theme&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create two files under the theme folder&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;theme.json&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Copy &amp;amp; paste the theme JSON file in the previous step, &lt;code&gt;Createa  custom MUI theme&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;index.js&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is to provide the custom theme generated in &lt;code&gt;Createa  custom MUI theme&lt;/code&gt; section&lt;/li&gt;
&lt;li&gt;It needs a bit of change as we need to import the JSON theme
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createMuiTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@material-ui/core/styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;themeData&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./theme.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;themeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My custom theme name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;createMuiTheme&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;themeData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;themeName&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure &lt;code&gt;gatsby-plugin-material-ui&lt;/code&gt; and add the &lt;code&gt;custom-mui-theme&lt;/code&gt; (the latter should be below) in the project root's &lt;code&gt;gatsby-config.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;// other plugins ...&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`gatsby-plugin-material-ui`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;stylesProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;injectFirst&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="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;`custom-mui-theme`&lt;/span&gt;&lt;span class="p"&gt;,&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;
&lt;a href="https://www.gatsbyjs.org/packages/gatsby-plugin-material-ui/?=gatsby-plugin-material-ui#usage-with-styled-components-or-else"&gt;injectFirst&lt;/a&gt; lets us override the MUI styles with Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  5. Checking if the custom theme is applied
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;./src/pages/index.js&lt;/code&gt;, add the primary button to see if the color matches that of your custom style&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@material-ui/core/Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;IndexPage&lt;/span&gt; &lt;span class="o"&gt;=&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="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contained&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secondary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contained&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;IndexPage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You will see that the &lt;code&gt;primary&lt;/code&gt; and &lt;code&gt;secondary&lt;/code&gt; colors are applied according to the custom theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QzXbGrkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/4f4b24b0c6635d9d4504ef599276abc4/17fa4/result.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QzXbGrkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sung.codes/static/4f4b24b0c6635d9d4504ef599276abc4/17fa4/result.png" alt="result" title="result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here on, simply updating &lt;code&gt;./plugins/custom-mui-theme/theme/theme.json&lt;/code&gt; should update the MUI theme&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Gatsby site source created by following the steps above - &lt;a href="https://github.com/dance2die/blog.custom-material-ui-gatsby-theme"&gt;https://github.com/dance2die/blog.custom-material-ui-gatsby-theme&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google's Material Design Color Tool: &lt;a href="https://material.io/resources/color/"&gt;https://material.io/resources/color/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create MUI Theme site

&lt;ul&gt;
&lt;li&gt;Home - &lt;a href="https://react-theming.github.io/create-mui-theme/"&gt;https://react-theming.github.io/create-mui-theme/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source - &lt;a href="https://github.com/react-theming/create-mui-theme"&gt;https://github.com/react-theming/create-mui-theme&lt;/a&gt; (MIT licenced)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Gatsby

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gatsby-plugin-material-ui&lt;/code&gt; 

&lt;ul&gt;
&lt;li&gt;Source - &lt;a href="https://github.com/hupe1980/gatsby-plugin-material-ui"&gt;https://github.com/hupe1980/gatsby-plugin-material-ui&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation - &lt;a href="https://www.gatsbyjs.org/packages/gatsby-plugin-material-ui/?=gatsby-plugin-material-ui"&gt;https://www.gatsbyjs.org/packages/gatsby-plugin-material-ui/?=gatsby-plugin-material-ui&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wrapRootElement&lt;/code&gt; - &lt;a href="https://www.gatsbyjs.org/docs/browser-apis/#wrapRootElement"&gt;&lt;/a&gt;&lt;a href="https://www.gatsbyjs.org/docs/browser-apis/#wrapRootElement"&gt;https://www.gatsbyjs.org/docs/browser-apis/#wrapRootElement&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Creating a Local Plugin" - &lt;a href="https://www.gatsbyjs.org/docs/creating-a-local-plugin/"&gt;&lt;/a&gt;&lt;a href="https://www.gatsbyjs.org/docs/creating-a-local-plugin/"&gt;https://www.gatsbyjs.org/docs/creating-a-local-plugin/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Plugins documentation - &lt;a href="https://www.gatsbyjs.org/docs/plugins/"&gt;&lt;/a&gt;&lt;a href="https://www.gatsbyjs.org/docs/plugins/"&gt;https://www.gatsbyjs.org/docs/plugins/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Material UI

&lt;ul&gt;
&lt;li&gt;Home - &lt;a href="https://material-ui.com/"&gt;https://material-ui.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Official MUI + Gatsby sample - &lt;a href="https://github.com/mui-org/material-ui/tree/master/examples/gatsby"&gt;https://github.com/mui-org/material-ui/tree/master/examples/gatsby&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Theming - &lt;a href="https://material-ui.com/customization/theming/"&gt;https://material-ui.com/customization/theming/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Default Theme (Theme JSON overrides this) - &lt;a href="https://material-ui.com/customization/default-theme/"&gt;https://material-ui.com/customization/default-theme/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/annca-1564471/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2168521"&gt;annca&lt;/a&gt; from &lt;a href="https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2168521"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>gatsby</category>
      <category>materialui</category>
    </item>
    <item>
      <title>Svelte tutorial note</title>
      <dc:creator>Sung M. Kim</dc:creator>
      <pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate>
      <link>https://forem.com/dance2die/svelte-tutorial-note-cap</link>
      <guid>https://forem.com/dance2die/svelte-tutorial-note-cap</guid>
      <description>&lt;p&gt;This is a note as I wrote down as I was going through &lt;a href="https://svelte.dev/tutorial/basics"&gt;Svelte tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Might be of helpful for some but foremost, this is a note for myself :)&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating a new Svelte project
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/blog/svelte-for-new-developers"&gt;https://svelte.dev/blog/svelte-for-new-developers&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npx degit sveltejs/template new-project-name
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  VS Code
&lt;/h3&gt;

&lt;p&gt;Install following extensions&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/sveltejs/language-tools"&gt;Svelte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ArdenIvanov/svelte-intellisense"&gt;Svelte Intellisense&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Reactivity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Assignments
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/reactive-assignments"&gt;https://svelte.dev/tutorial/reactive-assignments&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;on:click&lt;/code&gt; &lt;code&gt;on&lt;/code&gt; looks like a directive and &lt;code&gt;click&lt;/code&gt; is the event name.&lt;br&gt;&lt;br&gt;
States are reactive, closure under &lt;code&gt;script&lt;/code&gt; tag re-renders whenever the state value changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{handleClick}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Clicked {count} {count === 1 ? 'time' : 'times'}
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Declarations
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/reactive-declarations"&gt;https://svelte.dev/tutorial/reactive-declarations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Computed/derived states need to be declared using a special syntax, &lt;code&gt;$:&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Useful when it needs to be access multiple times.&lt;br&gt;&lt;br&gt;
Instead of &lt;code&gt;{count * 2}&lt;/code&gt; everywhere, you can use &lt;code&gt;{doubled}&lt;/code&gt; instead.&lt;/p&gt;
&lt;h3&gt;
  
  
  c. Statements
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/reactive-statements"&gt;https://svelte.dev/tutorial/reactive-statements&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$:&lt;/code&gt; isn't limited to expressions (&lt;em&gt;reactive values&lt;/em&gt;) but also to statements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`the count is {count}`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nl"&gt;$&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="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`count is too high!`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{handleClick}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Clicked {count} {count === 1 ? 'time' : 'times'}
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  d. Updating arrays and objects
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/updating-arrays-and-objects"&gt;https://svelte.dev/tutorial/updating-arrays-and-objects&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A simple rule of thumb: the name of the updated variable must appear on the left hand side of the assignment.&lt;br&gt;&lt;br&gt;
Or assign a new reference like you do in React.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Instead of this&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;addNumber&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Do this&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;addNumber&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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;h2&gt;
  
  
  3. Props
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Declaring props
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/declaring-props"&gt;https://svelte.dev/tutorial/declaring-props&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For passing data to another component(s). Same concept as it does in React.&lt;/p&gt;

&lt;p&gt;In React, components receive &lt;code&gt;props&lt;/code&gt; but in Svelte, you export a variable.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Nested.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;The answer is {answer}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;App.svelte&lt;/code&gt; imports &lt;code&gt;Nested&lt;/code&gt; component and passes the answer like following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Nested&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Nested.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Nested&lt;/span&gt; &lt;span class="na"&gt;answer=&lt;/span&gt;&lt;span class="s"&gt;{42}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Default values
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/default-values"&gt;https://svelte.dev/tutorial/default-values&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can set the default prop value during declaration&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Nested.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is unknown!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;The answer is {answer}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If no props passed to &lt;code&gt;Nested&lt;/code&gt; like &lt;code&gt;&amp;lt;Nested&amp;gt;&lt;/code&gt;, then the default value is used.&lt;/p&gt;

&lt;h3&gt;
  
  
  c. Spread props
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/spread-props"&gt;https://svelte.dev/tutorial/spread-props&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can do in React, you can pass multiple props with object spread operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Info&lt;/span&gt; &lt;span class="err"&gt;{...&lt;/span&gt;&lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Logic
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. If blocks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/if-blocks"&gt;https://svelte.dev/tutorial/if-blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The markup is avaiable in Svelte only, not in HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#if user.loggedIn}
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{toggle}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Log Out&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
{/if}

{#if !user.loggedIn}
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{toggle}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Log In&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
{/if}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Else blocks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/else-blocks"&gt;https://svelte.dev/tutorial/else-blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mutually exclusive condition can use &lt;code&gt;{:else}&lt;/code&gt; block&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#if user.loggedIn}
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{toggle}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Log Out&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
{:else}
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{toggle}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Log In&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
{/if}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  c. Else-if blocks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/else-if-blocks"&gt;https://svelte.dev/tutorial/else-if-blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additional condition can be checked with &lt;code&gt;{:else if condition}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#if x &amp;gt; 10}
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{x} is greater than 10!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{:else if x &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;5&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{x} is less than 5
{:else}
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{x} is 'teween 5 and 10&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{/if}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  d. Each blocks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/each-blocks"&gt;https://svelte.dev/tutorial/each-blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can iterate an iterable object with &lt;code&gt;{#each iterable as alias, index}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
{#each cats as cat, index}
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;{index + 1}th cat is {cat.name}&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
{/each}
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The alias can be destructured like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#each cats as {name, id, age}, index}
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;{index + 1}th cat is {name} and is {age} years old&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
{/each}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  e. Keyed each blocks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/keyed-each-blocks"&gt;https://svelte.dev/tutorial/keyed-each-blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In React, creating an iterable element requires &lt;code&gt;key&lt;/code&gt; per each element.&lt;/p&gt;

&lt;p&gt;e.g.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;things&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thing&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;thing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;thing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In Svelte, you specify the key in the markup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#each things as thing (thing.id)}
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;{thing.color}&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
{/each}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or you can destructure &lt;code&gt;thing&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#each things as {id, color} (id)}
    &lt;span class="nt"&gt;&amp;lt;Thing&lt;/span&gt; &lt;span class="na"&gt;current=&lt;/span&gt;&lt;span class="s"&gt;{color}/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
{/each}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  f. Await blocks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/await-blocks"&gt;https://svelte.dev/tutorial/await-blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelte markup has a way to &lt;code&gt;await&lt;/code&gt; promises.&lt;br&gt;&lt;br&gt;
Race condition is handled automatically because Svelte only grabs the latest/most recent promise only.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#await promise}
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Loading...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{:then number}
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;The value is {number}&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
{:catch error}
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"error"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{error.message}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{/await}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can decide not to show the intermediate "loading" message and wait 'til the promise resolves.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;{#await promise then number}
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;The value is {number}&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
{/await}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is much cleaner abstraction than in React, in which one needs to use &lt;code&gt;useEffect&lt;/code&gt; to resolve promise in an async method and set the state.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Events
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. DOM events
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/dom-events"&gt;https://svelte.dev/tutorial/dom-events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;on:&lt;/code&gt; directive, followed by DOM event name.&lt;/p&gt;

&lt;p&gt;e.g.) &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/mousemove_event"&gt;mousemove&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleMousemove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;on:mousemove=&lt;/span&gt;&lt;span class="s"&gt;{handleMousemove}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    The mouse position is {m.x} x {m.y}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Inline handlers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/inline-handlers"&gt;https://svelte.dev/tutorial/inline-handlers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠ Inline event handlers does not cause any performance issues unlike in React, as Svelte knows how to optimize.&lt;/p&gt;

&lt;p&gt;Instead of,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;on:mousemove=&lt;/span&gt;&lt;span class="s"&gt;{handleMousemove}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    The mouse position is {m.x} x {m.y}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can inline &lt;code&gt;handleMousemove&lt;/code&gt; as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;on:mousemove=&lt;/span&gt;&lt;span class="s"&gt;{e&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; m = {x: e.clientX, y: e.clientY}}&amp;gt;
    The mouse position is {m.x} x {m.y}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or, wrap the inline method in quotes for syntax highlighting in some editors&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;on:mousemove=&lt;/span&gt;&lt;span class="s"&gt;"{e =&amp;gt; m = {x: e.clientX, y: e.clientY}}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    The mouse position is {m.x} x {m.y}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  c. Event modifiers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/event-modifiers"&gt;https://svelte.dev/tutorial/event-modifiers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can "decorate" (my intepretaion) event with modifiers such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;once&lt;/code&gt;: run the handler once&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prevetnDefault&lt;/code&gt;: &lt;code&gt;event.preventDefault()&lt;/code&gt; before calling the handler&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stopPropagation&lt;/code&gt;: &lt;code&gt;event.stopPropagation()&lt;/code&gt; to stop the event bubble/capture&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;passive&lt;/code&gt;: for touch/wheel scrolling performance (&lt;a href="https://developers.google.com/web/updates/2016/06/passive-event-listeners"&gt;Google added it&lt;/a&gt; as a non-standard but it's supported widely)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capture&lt;/code&gt;: DOM events "bubble-up" by default. This reverses it as &lt;code&gt;capture&lt;/code&gt; (Refer to MDN &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Event/eventPhase"&gt;Event.eventPhase&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;self&lt;/code&gt;: &lt;code&gt;event.target === current element&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;e.g.) using &lt;code&gt;once&lt;/code&gt; to run an event handler only once on a button&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;once=&lt;/span&gt;&lt;span class="s"&gt;{handleClick}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Modifiers are chainable. &lt;code&gt;on:click|once|capture|preventDefault&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;handleClick&lt;/code&gt; will be called once once no matter how many times you press the button.&lt;/p&gt;

&lt;p&gt;⚠ Space is significant! The code below is not valid as there are spaces between &lt;code&gt;|&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="na"&gt;once=&lt;/span&gt;&lt;span class="s"&gt;{handleClick}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  d. Component events
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/component-events"&gt;https://svelte.dev/tutorial/component-events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unlike custom event dispatch in vanilla JS, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail#Example"&gt;where you pass custom data as &lt;code&gt;detail&lt;/code&gt; property&lt;/a&gt;,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// add an appropriate event listener&lt;/span&gt;
&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// create and dispatch the event&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;CustomEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat&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="err"&gt;👇&lt;/span&gt;
  &lt;span class="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;hazcheeseburger&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="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;you dispatch an event with data and it will be available as part of &lt;code&gt;event.detail&lt;/code&gt; automatically.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Inner.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;createEventDispatcher&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createEventDispatcher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// NOT THIS!&lt;/span&gt;
    &lt;span class="c1"&gt;// dispatch('message', {detail: {text: 'hi!'}})&lt;/span&gt;
    &lt;span class="c1"&gt;// But pass the data as it is&lt;/span&gt;
        &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello!&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{sayHello}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Click to say hello
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can then use the component and subscribe to the event, &lt;code&gt;message&lt;/code&gt; like following.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;App.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Inner&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Inner.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Access "text" via 👇 event.detail &lt;/span&gt;
        &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Inner&lt;/span&gt; &lt;span class="na"&gt;on:message=&lt;/span&gt;&lt;span class="s"&gt;{handleMessage}/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This pattern is different from React where an inner component receives an "event handler" as a function and calls it, not declare an event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Inner&lt;/span&gt; &lt;span class="nx"&gt;onMessage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleMessage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Click&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So it seems that in Svelte, event handlers are declared using vanilla JavaScript's &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent"&gt;CustomEvent&lt;/a&gt; interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  e. Event forwarding
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/event-forwarding"&gt;https://svelte.dev/tutorial/event-forwarding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DOM events are bubbled up while Svelte events aren't. Explicit event forwarding can be done by creating event dispatcher in each level.  &lt;/p&gt;

&lt;p&gt;Svelte can forward events with a shortcut where you specify the &lt;code&gt;on:eventname&lt;/code&gt; directive without a value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Inner&lt;/span&gt; &lt;span class="na"&gt;on:message&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then all &lt;code&gt;on:message&lt;/code&gt; event handlers will be forwarded up and made available to the calling component.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this is tough to grasp. Need to come back later.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  f. DOM event forwarding
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/dom-event-forwarding"&gt;https://svelte.dev/tutorial/dom-event-forwarding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelte requires you explicitly decide whether to expose an event or not. &lt;/p&gt;

&lt;p&gt;When there is more than one element in inner component exposing the same event, say two buttons with &lt;code&gt;on:click&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CustomButton.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"b1"&lt;/span&gt; &lt;span class="na"&gt;on:click&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Click me
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"b2"&lt;/span&gt; &lt;span class="na"&gt;on:click&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Click me2
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then you can tell which one was fired by examining &lt;code&gt;event.target&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;App.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CustomButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./CustomButton.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`e =&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;CustomButton&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{handleClick}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;CustomButton click on &lt;code&gt;#b1&lt;/code&gt; and &lt;code&gt;#b2&lt;/code&gt; results in,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;​
&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;me2&lt;/span&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;​
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Bindings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Text inputs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/text-inputs"&gt;https://svelte.dev/tutorial/text-inputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sorta like a two-way binding, where changes in an element updates the state and the current state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;world!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;bind:value=&lt;/span&gt;&lt;span class="s"&gt;{name}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello {name}!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Updating values in &lt;code&gt;input&lt;/code&gt; will update &lt;code&gt;name&lt;/code&gt; state as well as the input's value.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Numeric inputs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/numeric-inputs"&gt;https://svelte.dev/tutorial/numeric-inputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;batteries included&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Svelte auto converts input of type &lt;code&gt;number&lt;/code&gt; &amp;amp; &lt;code&gt;range&lt;/code&gt; to numeric values.&lt;br&gt;&lt;br&gt;
React requires explicit conversion as it's metal.&lt;/p&gt;
&lt;h3&gt;
  
  
  c. Checkbox inputs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/checkbox-inputs"&gt;https://svelte.dev/tutorial/checkbox-inputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checkbox input type value is bound to &lt;code&gt;bind:checked&lt;/code&gt; instead of &lt;code&gt;bind:value&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isChecked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;bind:checked=&lt;/span&gt;&lt;span class="s"&gt;{isChecked}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  d. Group inputs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/group-inputs"&gt;https://svelte.dev/tutorial/group-inputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In vanilla JS, you use &lt;code&gt;name&lt;/code&gt; to group related checkboxes and radio.&lt;br&gt;&lt;br&gt;
MDN Reference: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio"&gt;&lt;code&gt;&amp;lt;input type="radio"&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
                                            👇
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"scoops"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"scoops"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"scoops"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;but in Svelte, you bind a group using &lt;code&gt;bind:group&lt;/code&gt; directive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
                                            👇
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;"scoops"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;"scoops"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;"scoops"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When bound to a radio group, then the bound value is one value, but on checkboxes, the bound value is an array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;scoops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&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;flavours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Radio `scopes` bound to a single value --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;radio&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;{scoops}&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;{1}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    One scoop
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;radio&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;{scoops}&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;{2}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Two scoops
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;radio&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;{scoops}&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;{3}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Three scoops
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Checkbox group value, `favlours` is an array --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;checkbox&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;{flavours}&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Cookies and cream"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Cookies and cream
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;checkbox&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;{flavours}&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Mint choc chip"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Mint choc chip
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;checkbox&lt;/span&gt; &lt;span class="na"&gt;bind:group=&lt;/span&gt;&lt;span class="s"&gt;{flavours}&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Raspberry ripple"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Raspberry ripple
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  e. Textarea inputs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/textarea-inputs"&gt;https://svelte.dev/tutorial/textarea-inputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same as &lt;code&gt;&amp;lt;input type="text"&amp;gt;&lt;/code&gt;. You bind value using &lt;code&gt;bind:value={value}&lt;/code&gt;. If the value variable name matches &lt;code&gt;value&lt;/code&gt;, then you can leave out the assignment, like,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;bind:value&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  f. Select bindings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/select-bindings"&gt;https://svelte.dev/tutorial/select-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like Textarea, you can use &lt;code&gt;bind:value={value}&lt;/code&gt; and leave out the assignment, &lt;code&gt;bind:value&lt;/code&gt; if the variable name is &lt;code&gt;value&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;value&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;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;questions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;question #1&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;question #2&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;question #3&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- this works too 👇 --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- &amp;lt;select bind:value={value} on:change="{() =&amp;gt; answer = ""}"&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;bind:value&lt;/span&gt; &lt;span class="na"&gt;on:change=&lt;/span&gt;&lt;span class="s"&gt;"{() =&amp;gt; answer = "&lt;/span&gt;&lt;span class="err"&gt;"}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    {#each questions as question}
        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;{question}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{question.text}&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    {/each}
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;bind:value=&lt;/span&gt;&lt;span class="s"&gt;{answer}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  g. Select multiple
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/multiple-select-bindings"&gt;https://svelte.dev/tutorial/multiple-select-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've already mentioned this in &lt;code&gt;d. Group inputs&lt;/code&gt; - &lt;a href="https://svelte.dev/tutorial/group-inputs"&gt;https://svelte.dev/tutorial/group-inputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Binding to a select with &lt;code&gt;multiple&lt;/code&gt; directive sets the value to an array.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;flavours&lt;/code&gt; is an array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;multiple&lt;/span&gt; &lt;span class="na"&gt;bind:value=&lt;/span&gt;&lt;span class="s"&gt;{flavours}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    {#each menu as flavour}
        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;{flavour}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            {flavour}
        &lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    {/each}
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  h. Contenteditable bindings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/contenteditable-bindings"&gt;https://svelte.dev/tutorial/contenteditable-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can bind to either &lt;code&gt;textContent&lt;/code&gt; or &lt;code&gt;innerHTML&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
    &lt;span class="na"&gt;contenteditable=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
    &lt;span class="na"&gt;bind:innerHTML=&lt;/span&gt;&lt;span class="s"&gt;{html}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- or --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
    &lt;span class="na"&gt;contenteditable=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
    &lt;span class="na"&gt;bind:textContent=&lt;/span&gt;&lt;span class="s"&gt;{html}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Check out the &lt;a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Node/textContent#Differences_from_innerHTML"&gt;difference between &lt;code&gt;textContent&lt;/code&gt; &amp;amp; &lt;code&gt;innerHTML&lt;/code&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&amp;amp; why one should &lt;a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML#Security_considerations"&gt;consider using &lt;code&gt;textContent&lt;/code&gt; over &lt;code&gt;innerHTML&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  i. Each block bindings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/each-block-bindings"&gt;https://svelte.dev/tutorial/each-block-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't use this if you plan to go with immutable data (React style).&lt;br&gt;&lt;br&gt;
Familiar with imperative style? go with this.&lt;/p&gt;
&lt;h3&gt;
  
  
  j. Medial elements
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/media-elements"&gt;https://svelte.dev/tutorial/media-elements&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Media elements' (&lt;code&gt;video/audio&lt;/code&gt;) are updated more frequently using &lt;code&gt;requestAnimationFrame&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  k. Dimensions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/dimensions"&gt;https://svelte.dev/tutorial/dimensions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements"&gt;block-level elements&lt;/a&gt;, such as &lt;code&gt;div&lt;/code&gt;, &lt;code&gt;section&lt;/code&gt;, &lt;code&gt;article&lt;/code&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements#Elements"&gt;etc&lt;/a&gt; have bindings to following props.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth"&gt;clientWidth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight"&gt;clientHeight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth"&gt;offsetWidth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight"&gt;offsetHeight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  l. This
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/bind-this"&gt;https://svelte.dev/tutorial/bind-this&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bind:this={variable}&lt;/code&gt; returns a reference to rendered elements.&lt;br&gt;&lt;br&gt;
&lt;code&gt;variable&lt;/code&gt; will be &lt;code&gt;undefined&lt;/code&gt; until the component has mounted.&lt;br&gt;&lt;br&gt;
Use &lt;a href="https://svelte.dev/tutorial/onmount"&gt;onMount&lt;/a&gt; lifecycle to refer to the variable.&lt;/p&gt;

&lt;p&gt;Note: This looks like &lt;code&gt;ref&lt;/code&gt; in React.&lt;/p&gt;
&lt;h3&gt;
  
  
  m. Component bindings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/component-bindings"&gt;https://svelte.dev/tutorial/component-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As mentioned previously, you can &lt;code&gt;bind:value&lt;/code&gt; for custom components to provide a two-way binding.&lt;/p&gt;

&lt;p&gt;Changes in child component will be available in the parent element.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Keypad.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Suppose that in &lt;code&gt;App.svelte&lt;/code&gt;,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Keypad&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Keypad.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`pin =&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;bind:value=&lt;/span&gt;&lt;span class="s"&gt;{pin}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Keypad&lt;/span&gt; &lt;span class="na"&gt;bind:value=&lt;/span&gt;&lt;span class="s"&gt;{pin}&lt;/span&gt; &lt;span class="na"&gt;on:submit=&lt;/span&gt;&lt;span class="s"&gt;{handleSubmit}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can bind to &lt;code&gt;Keypad&lt;/code&gt; with &lt;code&gt;bind:value={pin}&lt;/code&gt;. It works as both an input and output to &lt;code&gt;Keypad&lt;/code&gt; component.&lt;br&gt;&lt;br&gt;
It can be demo'ed by changing values in &lt;code&gt;&amp;lt;input bind:value={pin} /&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Awesome! Very convinient. But you have to be careful as you can lose track of the state flow.&lt;/p&gt;

&lt;p&gt;In React, one would have to pass a callback function to call it whenever child value changes and the parent would update the state via the callback.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;App.jsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;function App() {
    const [pin, setPin] = React.useState(null)

    return &lt;span class="nt"&gt;&amp;lt;Keypad&lt;/span&gt; &lt;span class="na"&gt;onChange=&lt;/span&gt;&lt;span class="s"&gt;{setPin}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Lifecycle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. onMount
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/onmount"&gt;https://svelte.dev/tutorial/onmount&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's comparable to the mix of &lt;a href="https://reactjs.org/docs/react-component.html#componentdidmount"&gt;componentDidMount&lt;/a&gt; and &lt;a href="https://reactjs.org/docs/hooks-reference.html#useeffect"&gt;useEffect&lt;/a&gt; because it's called when a component is mounted, and cleans up with a callback function returned from it (that's &lt;a href="https://reactjs.org/docs/hooks-reference.html#cleaning-up-an-effect"&gt;how useEffect does a clean up&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;And also, &lt;code&gt;componentDidMount&lt;/code&gt; can be &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;useEffect&lt;/code&gt; cannot call an async method.&lt;/p&gt;

&lt;p&gt;As it's the recommended way to call &lt;code&gt;fetch&lt;/code&gt; in React, &lt;code&gt;onMount&lt;/code&gt; is normally where one should make a network request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onMount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;onMount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;photos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&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="c1"&gt;// clean up resources here&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. onDestroy
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/ondestroy"&gt;https://svelte.dev/tutorial/ondestroy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;onDestroy&lt;/code&gt; is like React's &lt;a href="https://reactjs.org/docs/react-component.html#componentwillunmount"&gt;componentWillUnmount&lt;/a&gt;. Use it clean up resources on component's unmount phase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onDestroy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nx"&gt;onDestroy&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  c. beforeUpdate and afterUpdate
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/update"&gt;https://svelte.dev/tutorial/update&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flows like,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;beforeUpdate&lt;/code&gt; -&amp;gt; &lt;code&gt;onMount&lt;/code&gt; -&amp;gt; &lt;code&gt;beforeUpdate&lt;/code&gt; -&amp;gt; state changes -&amp;gt; &lt;code&gt;afterUpdate&lt;/code&gt; -&amp;gt; &lt;code&gt;onDestroy&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;As &lt;code&gt;beforeUpdate&lt;/code&gt; runs BEFORE &lt;code&gt;onMount&lt;/code&gt;, one needs to check for existence of elements&lt;/p&gt;

&lt;h3&gt;
  
  
  d. tick
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/tick"&gt;https://svelte.dev/tutorial/tick&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get around batch processing (state updates, DOM updates, etc)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tick&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Stores
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Writable stores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/writable-stores"&gt;https://svelte.dev/tutorial/writable-stores&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelte has batteries included. It comes with a global state management library.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;svelte/store&lt;/code&gt; has &lt;code&gt;writable&lt;/code&gt; method to create a global state.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;store.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;writable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte/store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then one can import &lt;code&gt;count&lt;/code&gt; in &lt;code&gt;store.js&lt;/code&gt;, either to read, update, or set the value.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reading via subscription
    - &lt;code&gt;writable&lt;/code&gt; returns a state, which you can &lt;code&gt;subscribe()&lt;/code&gt; for the value change
    - It is a HoF (higher-order function), which returns a function to unsubscribe
    - It's the same as &lt;a href="https://redux.js.org/basics/store#dispatching-actions"&gt;how Redux store's subscribe returns unsubscribe method&lt;/a&gt;
    - My guess is that you need to call &lt;code&gt;unsubscribe&lt;/code&gt; in &lt;code&gt;onDestroy&lt;/code&gt; normally to clean up
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onDestroy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;countValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unsubscribe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&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;countValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="c1"&gt;// Clean up after your business!&lt;/span&gt;
    &lt;span class="nx"&gt;onDestroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unsubscribe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Updating the state
    - &lt;code&gt;writable&lt;/code&gt; returns a state, which you can &lt;code&gt;update&lt;/code&gt; values for
    - It requires a callback, which is given the current value to update with
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;incrementCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{incrementCount}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Increment Count by One/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Setting the state (convinience method for update)
    - &lt;code&gt;set&lt;/code&gt; method looks like a convinience method to &lt;code&gt;update&lt;/code&gt;
    - as you can simply set a value without a callback function
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{reset}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reset Count&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Auto-subscriptions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/auto-subscriptions"&gt;https://svelte.dev/tutorial/auto-subscriptions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelte has yet another convinient way to subscribe to the global state change.&lt;br&gt;&lt;br&gt;
With &lt;code&gt;$&lt;/code&gt; prefixed to a variable, Svelte takes care of both un/subscription out of the box.&lt;/p&gt;

&lt;p&gt;Instead of this verbose un/subscribe for &lt;code&gt;count&lt;/code&gt;,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onDestroy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;countValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unsubscribe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&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;countValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="c1"&gt;// Clean up after your business!&lt;/span&gt;
    &lt;span class="nx"&gt;onDestroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unsubscribe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Count value is {countValue}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can simply prefix &lt;code&gt;count&lt;/code&gt; with &lt;code&gt;$&lt;/code&gt; like &lt;code&gt;$count&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onDestroy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Count value is {$count}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Make sure to read notes in the linked page.&lt;/p&gt;

&lt;h3&gt;
  
  
  c. Readable stores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/readable-stores"&gt;https://svelte.dev/tutorial/readable-stores&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Readable store provides, duh, read-only store, for which one can initialize but can't update.&lt;br&gt;&lt;br&gt;
It looks similar to &lt;code&gt;useEffect&lt;/code&gt; that the returned function is called when "the last subscriber unsubscribes".&lt;/p&gt;

&lt;p&gt;&lt;code&gt;store.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valueUpdator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// called when the last subscriber unsubscribes.&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;readable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valueUpdator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And the same as &lt;code&gt;wriable&lt;/code&gt; store, you can refer to it with &lt;code&gt;$&lt;/code&gt; prefix, like &lt;code&gt;$time&lt;/code&gt; in another file.&lt;/p&gt;

&lt;h3&gt;
  
  
  d. Derived stores
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tutorial: &lt;a href="https://svelte.dev/tutorial/derived-stores"&gt;https://svelte.dev/tutorial/derived-stores&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API: &lt;a href="https://svelte.dev/docs#derived"&gt;https://svelte.dev/docs#derived&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tutorial prefixes &lt;code&gt;time&lt;/code&gt; with &lt;code&gt;$&lt;/code&gt; like &lt;code&gt;$time&lt;/code&gt; in the callback.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/auto-subscriptions"&gt;Auto-subscriptions&lt;/a&gt; tutorial states that&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any name beginning with $ is assumed to refer to a store value. It's effectively a reserved character — Svelte will prevent you from declaring your own variables with a $ prefix.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But I tried it without &lt;code&gt;$&lt;/code&gt; prefix as shown below but still works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;derived&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&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;Not sure if &lt;code&gt;$&lt;/code&gt; is required. Left a question on Reddit.&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.reddit.com/r/sveltejs/comments/hblmxa/question_derived_callback_in_tutorial_uses_a/"&gt;https://www.reddit.com/r/sveltejs/comments/hblmxa/question_derived_callback_in_tutorial_uses_a/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  e. Custom stores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/custom-stores"&gt;https://svelte.dev/tutorial/custom-stores&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One can create a custom store by implementing &lt;code&gt;subscribe&lt;/code&gt; method.&lt;br&gt;&lt;br&gt;
Tutorial uses &lt;code&gt;wriable&lt;/code&gt;'s &lt;code&gt;subscribe&lt;/code&gt; to expose the interface and doesn't show how to implement one yourself.&lt;/p&gt;
&lt;h3&gt;
  
  
  f. Store bindings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/store-bindings"&gt;https://svelte.dev/tutorial/store-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Store value referred to with &lt;code&gt;$&lt;/code&gt; prefix can be bound as if it's a local state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;bind:value=&lt;/span&gt;&lt;span class="s"&gt;{$name}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Typing in the input will update &lt;code&gt;$name&lt;/code&gt; and will trigger update itself and all dependents.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Motion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Tweened
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/tweened"&gt;https://svelte.dev/tutorial/tweened&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelte has a built-in motion library without having to install a 3rd party library.&lt;br&gt;&lt;br&gt;
In React, you'd use &lt;code&gt;react-spring&lt;/code&gt;, or &lt;code&gt;react-motion&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h3&gt;
  
  
  b. Spring
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/spring"&gt;https://svelte.dev/tutorial/spring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use this instead of &lt;code&gt;tweened&lt;/code&gt; for frequently changing values&lt;/p&gt;
&lt;h2&gt;
  
  
  10. Transitions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  a. The transition directive
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/transition"&gt;https://svelte.dev/tutorial/transition&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another batteries-included way to provide transition in JavaScript.&lt;br&gt;&lt;br&gt;
According to Chrome Devtools, &lt;code&gt;&amp;lt;p transition:fade&amp;gt;&lt;/code&gt; injects an inline style to fade in/out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fade&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte/transition&lt;/span&gt;&lt;span class="dl"&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;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

{#if visible}
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;transition:fade&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Fade in and out&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{/if}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Adding parameters
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/adding-parameters-to-transitions"&gt;https://svelte.dev/tutorial/adding-parameters-to-transitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also pass in-line parameters to transition functions in the markup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fly&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte/transition&lt;/span&gt;&lt;span class="dl"&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;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;checkbox&lt;/span&gt; &lt;span class="na"&gt;bind:checked=&lt;/span&gt;&lt;span class="s"&gt;{visible}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

{#if visible}
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;transition:fly=&lt;/span&gt;&lt;span class="s"&gt;"{{ y: 200, duration: 2000 }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Flies in and out&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{/if}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Transitions are "reversible".&lt;br&gt;
Toggling visibility doesn't abruptly starts transition from beinging or the end.&lt;br&gt;&lt;br&gt;
It reverses where it left off.&lt;br&gt;&lt;br&gt;
Refer to the linked tutorial page to see it in action! Cool stuff.&lt;/p&gt;
&lt;h3&gt;
  
  
  c. In and out
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/in-and-out"&gt;https://svelte.dev/tutorial/in-and-out&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can granularly contorl transition with &lt;code&gt;in&lt;/code&gt; &amp;amp; &lt;code&gt;out&lt;/code&gt; directives instead of &lt;code&gt;transition&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  d. Custom CSS transitions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/custom-css-transitions"&gt;https://svelte.dev/tutorial/custom-css-transitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks simple so long as you undersand CSS transition and motions etc.&lt;br&gt;&lt;br&gt;
I know neither well so it's tough.&lt;/p&gt;

&lt;p&gt;To learn first: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions"&gt;Using CSS transitions&lt;/a&gt; on MDN.&lt;/p&gt;
&lt;h3&gt;
  
  
  e. Custom JS transitions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/custom-js-transitions"&gt;https://svelte.dev/tutorial/custom-js-transitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;tick&lt;/code&gt; callback to implement JS transitions for effects not possible by CSS transitions.&lt;/p&gt;
&lt;h3&gt;
  
  
  f. Transition events
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/transition-events"&gt;https://svelte.dev/tutorial/transition-events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monitor &lt;code&gt;transition&lt;/code&gt; directive events with following directives&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;on:introstart&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;on:outrostart&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;on:introend&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;on:outroend&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  g. Local transitions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/local-transitions"&gt;https://svelte.dev/tutorial/local-transitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;local&lt;/code&gt; transition makes transitions to occur on individual elements, not for a group of items.&lt;/p&gt;

&lt;p&gt;Honestly, I really haven't found a use for this.&lt;/p&gt;
&lt;h3&gt;
  
  
  h. Deferred transitions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/deferred-transitions"&gt;https://svelte.dev/tutorial/deferred-transitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More advanced transition concept I'd have to learn later.&lt;/p&gt;
&lt;h2&gt;
  
  
  11. Animations
&lt;/h2&gt;
&lt;h3&gt;
  
  
  a. The animate directive
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/animate"&gt;https://svelte.dev/tutorial/animate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh boy. come back later...&lt;/p&gt;
&lt;h2&gt;
  
  
  12. Actions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  a. The use directive
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/actions"&gt;https://svelte.dev/tutorial/actions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;use:&lt;/code&gt; directive to specify the action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pannable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pannable.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;use:pannable&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pannable&lt;/code&gt; is a function, which accepts a DOM node.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fires following custom events&lt;/span&gt;
&lt;span class="c1"&gt;// 1. panstart&lt;/span&gt;
&lt;span class="c1"&gt;// 2. panmove&lt;/span&gt;
&lt;span class="c1"&gt;// 3. panend&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;pannable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&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;When the &lt;code&gt;pannable&lt;/code&gt; dispatches a custom event, the parent component can subscribe to it in the markup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pannable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pannable.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// These functions have access to `event` dispatched from `pannable`&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlePanStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlePanMove&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlePanEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; 
    &lt;span class="na"&gt;use:pannable&lt;/span&gt;
    &lt;span class="na"&gt;on:panstart=&lt;/span&gt;&lt;span class="s"&gt;{handlePanStart}&lt;/span&gt;
    &lt;span class="na"&gt;on:panmove=&lt;/span&gt;&lt;span class="s"&gt;{handlePanMove}&lt;/span&gt;
    &lt;span class="na"&gt;on:panend=&lt;/span&gt;&lt;span class="s"&gt;{handlePanEnd}&lt;/span&gt;
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"transform:
        translate({$coords.x}px,{$coords.y}px)
        rotate({$coords.x * 0.2}deg)"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Clean up of the action can be done by exposing &lt;code&gt;onDestroy&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;pannable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&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="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;onDesotry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// clean up the mess&lt;/span&gt;
        &lt;span class="p"&gt;}&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;
  
  
  b. Adding parameters
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/adding-parameters-to-actions"&gt;https://svelte.dev/tutorial/adding-parameters-to-actions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like transitions, actions can accept arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;longpress&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./longpress.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;use:longpress=&lt;/span&gt;&lt;span class="s"&gt;{duration}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When the duration is changed, &lt;code&gt;longpress.js&lt;/code&gt; won't know that the &lt;code&gt;duration&lt;/code&gt; has changed.&lt;br&gt;&lt;br&gt;
To subscribe to the &lt;code&gt;duration&lt;/code&gt; change, implement &lt;code&gt;update&lt;/code&gt; function in the action&lt;/p&gt;

&lt;p&gt;&lt;code&gt;longpress.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;longpress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;duration&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="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newDuration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newDuration&lt;/span&gt;
        &lt;span class="p"&gt;}&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;Multiple arguments can be passed to the action as an object&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;longpress&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./longpress.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;use:longpress=&lt;/span&gt;&lt;span class="s"&gt;{{duration,&lt;/span&gt; &lt;span class="na"&gt;spiciness&lt;/span&gt;&lt;span class="err"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and accept the object in the action.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;longpress.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;longpress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;spiciness&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;h2&gt;
  
  
  13. Classes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. The class directive
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/classes"&gt;https://svelte.dev/tutorial/classes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelt provides a shortcut for class toggle.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's just &lt;code&gt;class&lt;/code&gt; in Svelte not &lt;code&gt;className&lt;/code&gt; as it is in React.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;.someActiveClass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&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="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
    &lt;span class="na"&gt;class:someActiveClass=&lt;/span&gt;&lt;span class="s"&gt;"{current='foo'}"&lt;/span&gt; 
    &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;"{() =&amp;gt; current = 'foo'}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&amp;gt;foo&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
    &lt;span class="na"&gt;class:someActiveClass=&lt;/span&gt;&lt;span class="s"&gt;"{current='bar'}"&lt;/span&gt; 
    &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;"{() =&amp;gt; current = 'bar'}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&amp;gt;bar&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
    &lt;span class="na"&gt;class:someActiveClass=&lt;/span&gt;&lt;span class="s"&gt;"{current='baz'}"&lt;/span&gt; 
    &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;"{() =&amp;gt; current = 'baz'}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&amp;gt;baz&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Whenever the condition matches, the custom class append after &lt;code&gt;class:&lt;/code&gt; is added.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Shorthand class directive
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/class-shorthand"&gt;https://svelte.dev/tutorial/class-shorthand&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The shorthand for the shortcut (whew, what a mouthful) is that you can leave out the directive assignment if the class to toggle matches the variable name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class:big=&lt;/span&gt;&lt;span class="s"&gt;{big}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;can be shortened to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class:big&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  14. Component composition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Slots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/slots"&gt;https://svelte.dev/tutorial/slots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is just like React's &lt;code&gt;children&lt;/code&gt; to specify where to put child components in the current one.&lt;/p&gt;

&lt;p&gt;Svelte component is not a function, but more like a markup w/ scripts and styles.&lt;br&gt;&lt;br&gt;
So to access children, you need to specify &lt;code&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;slot /&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can specify multiple &lt;code&gt;&amp;lt;slot /&amp;gt;&lt;/code&gt;, which will show the children multiple times.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;box.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;.box&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- or --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And pass the children to the box component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Box&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./box.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Box&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Here is the child header&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt; this is the content &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Box&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Personal note: This is more to how React should have been as React's supposed to be declarative.&lt;br&gt;&lt;br&gt;
Svelte correctly uses the markup declration for the child, while React is imperative with &lt;code&gt;children&lt;/code&gt;. (Not to mention &lt;code&gt;children&lt;/code&gt; can be anything like a function to implement &lt;a href="https://reactjs.org/docs/render-props.html"&gt;render props&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;
  
  
  b. Slot fallbacks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/slot-fallbacks"&gt;https://svelte.dev/tutorial/slot-fallbacks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you weren't specifying any fallback, you could use &lt;code&gt;&amp;lt;slot /&amp;gt;&lt;/code&gt; but to provide a fallback (when a user didn't specify a child), then you can use a longer &lt;code&gt;&amp;lt;slot&amp;gt;fallback content&amp;lt;/slot&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;box.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;.box&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&lt;/span&gt;Fallback content!!!&lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The example of none-child passed to &lt;code&gt;Box&lt;/code&gt; is as shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Box&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Box.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Box&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Hello!&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is a box. It can contain anything.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Box&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Box&amp;gt;&amp;lt;/Box&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Box&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  c. Named slot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/named-slots"&gt;https://svelte.dev/tutorial/named-slots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In React, one would expose seprate components or static child components like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactCard&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactCard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Sung&lt;/span&gt; &lt;span class="nx"&gt;Kim&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactCard.Name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactCard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactCard&lt;/span&gt;&lt;span class="err"&gt;&amp;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;// or&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactCard&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactCardName&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Sung&lt;/span&gt; &lt;span class="nx"&gt;Kim&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactCardName&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactCardAddress&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactCard&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;It requires to create seprate component for &lt;code&gt;ContactCardName&lt;/code&gt; or &lt;code&gt;ContactCardAddress&lt;/code&gt;, each of which accepts its own &lt;code&gt;children&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;This is where things get interesting.&lt;br&gt;&lt;br&gt;
You can specify which "slot" you want to insert the child content into!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ContactCard.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;.missing&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;article&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"contact-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"missing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Unknown name&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"address"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"address"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"missing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Unknown address&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"missing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Unknown email&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As shown in the previous section, each named slots contain fallbacks.&lt;/p&gt;

&lt;p&gt;The calling component specifies the slot in the child component&lt;/p&gt;

&lt;p&gt;&lt;code&gt;App.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ContactCard&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./ContactCard.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ContactCard&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sung&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sung@sung.com&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContactCard&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  c. Slot props
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/slot-props"&gt;https://svelte.dev/tutorial/slot-props&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Passing data from &lt;code&gt;slot&lt;/code&gt; to the parent component, one needs to declare the exposed state (via slot) while declaring the component&lt;/p&gt;

&lt;p&gt;You don't declare a variable in the parent component but just sorta like "bind" using &lt;code&gt;let&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hovering.svelte&lt;/code&gt;: a component containg a slot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;hovering&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;hovering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;leave&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;hovering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;on:mouseenter=&lt;/span&gt;&lt;span class="s"&gt;{enter}&lt;/span&gt; &lt;span class="na"&gt;on:mouseleave=&lt;/span&gt;&lt;span class="s"&gt;{leave}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;hovering=&lt;/span&gt;&lt;span class="s"&gt;{hovering}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- or use the hsort hand --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;slot hovering&amp;gt;&amp;lt;/slot&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To access &lt;code&gt;hovering&lt;/code&gt; in the parent component, use &lt;code&gt;let&lt;/code&gt; as mentioend before.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Parent.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Hoverable&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Hoverable.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Hoverable&lt;/span&gt; &lt;span class="na"&gt;let:hovering=&lt;/span&gt;&lt;span class="s"&gt;{hovering}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class:active=&lt;/span&gt;&lt;span class="s"&gt;{hovering}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        {#if hovering}
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;I am being hovered upon.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        {:else}
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hover over me!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        {/if}
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Hoverable&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Note that &lt;code&gt;hovering&lt;/code&gt; variable is not declared in the &lt;code&gt;script&lt;/code&gt; but could be used inside &lt;code&gt;Hovering&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Context API
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. setContext and getContext
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/context-api"&gt;https://svelte.dev/tutorial/context-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svelte's Context API is similar to that of React;&lt;br&gt;&lt;br&gt;
Only decendant child components can access context data using &lt;code&gt;getContext&lt;/code&gt; expoed via &lt;code&gt;setContext&lt;/code&gt; in the parent.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;store&lt;/code&gt; is more like &lt;a href="https://github.com/react-spring/zustand"&gt;Zustand&lt;/a&gt; where state is avaiable anywhere in the component hierachy.&lt;/p&gt;

&lt;p&gt;Difference between React &amp;amp; Svelte Context API is that, React's API is declarative using a markup, Svelte imperative, using &lt;code&gt;setContext&lt;/code&gt; during component initialization.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;React&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&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;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="nx"&gt;can&lt;/span&gt; &lt;span class="nx"&gt;access&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="nx"&gt;here&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Context.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;h2&gt;
  
  
  16. Special elements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. &lt;a&gt;svelte:self&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-self"&gt;https://svelte.dev/tutorial/svelte-self&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To recursively refer the current component.&lt;/p&gt;

&lt;p&gt;There is a typo in the documentation so filed an issue: &lt;a href="https://github.com/sveltejs/svelte/issues/5044"&gt;https://github.com/sveltejs/svelte/issues/5044&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="https://github.com/sveltejs/svelte/issues/5044#issuecomment-647046475"&gt;"a file" refers to the current file, not the &lt;code&gt;File&lt;/code&gt; component&lt;/a&gt;. So the documentation is correct. Clsoed the issue.&lt;/p&gt;
&lt;h3&gt;
  
  
  b. &lt;a&gt;svelte:component&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-component"&gt;https://svelte.dev/tutorial/svelte-component&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;&amp;lt;svelte:component this={component}&amp;gt;&lt;/code&gt; to load a component dynamically.&lt;/p&gt;

&lt;p&gt;To pass props, pass it to &lt;code&gt;&amp;lt;svelte:component&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svelte:component&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"custom text"&lt;/span&gt; &lt;span class="na"&gt;this=&lt;/span&gt;&lt;span class="s"&gt;{selected.component}/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;text&lt;/code&gt; is then passed to &lt;code&gt;selected.component&lt;/code&gt; (not documented in the tutorial just found out by mistake).&lt;/p&gt;

&lt;p&gt;Make sure that the dynamic component accepts the prop.&lt;/p&gt;

&lt;p&gt;e.g.) &lt;code&gt;RedThing.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;strong&lt;/span&gt; &lt;span class="p"&gt;{&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;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red thing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;{text}&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  c. &lt;a&gt;svelte:window&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-window"&gt;https://svelte.dev/tutorial/svelte-window&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a declarative way to add events to &lt;code&gt;window&lt;/code&gt; object.&lt;/p&gt;

&lt;h3&gt;
  
  
  d. &lt;a&gt;svelte:window&lt;/a&gt; bindings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-window-bindings"&gt;https://svelte.dev/tutorial/svelte-window-bindings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Turns out, you can also bind to some of &lt;code&gt;window&lt;/code&gt;'s properties, not just events.&lt;/p&gt;

&lt;h3&gt;
  
  
  e. &lt;a&gt;svelte:body&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-body"&gt;https://svelte.dev/tutorial/svelte-body&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This lets you bind events declaratively in the &lt;code&gt;document.body&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  f. &lt;a&gt;svelte:head&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-head"&gt;https://svelte.dev/tutorial/svelte-head&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Injecting content inside &lt;code&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
No need for &lt;code&gt;react-helmet&lt;/code&gt; like 3rd party library.&lt;/p&gt;

&lt;h3&gt;
  
  
  g. &lt;a&gt;svelte:options&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/svelte-options"&gt;https://svelte.dev/tutorial/svelte-options&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;advanced Svelte compiler options.&lt;br&gt;&lt;br&gt;
Most notably, you can specify immutibility to optimize component render in a list.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. Module context
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Sharing code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/sharing-code"&gt;https://svelte.dev/tutorial/sharing-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This looks like a "static" variable avaiable throughout the all the instances of a component.&lt;br&gt;&lt;br&gt;
Possibly a prototype value.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Exports
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/module-exports"&gt;https://svelte.dev/tutorial/module-exports&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exporting within module level script can be imported from another Svelte component.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Debugging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. The @debug tag
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/tutorial/debug"&gt;https://svelte.dev/tutorial/debug&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The better "console.log" :p&lt;/p&gt;




&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@williamk?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;William Krause&lt;/a&gt; on &lt;a href="/s/photos/elegant?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>javascript</category>
      <category>selfnote</category>
    </item>
  </channel>
</rss>
