<?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: ziqin</title>
    <description>The latest articles on Forem by ziqin (@ziqin).</description>
    <link>https://forem.com/ziqin</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%2F647750%2F54ceb12f-d653-4bd2-ad8a-82b6a3ff47b6.jpeg</url>
      <title>Forem: ziqin</title>
      <link>https://forem.com/ziqin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ziqin"/>
    <language>en</language>
    <item>
      <title>Step by step on how to setup fabric.js in the next.js app</title>
      <dc:creator>ziqin</dc:creator>
      <pubDate>Sat, 30 Sep 2023 03:12:44 +0000</pubDate>
      <link>https://forem.com/ziqin/step-by-step-on-how-to-setup-fabricjs-in-the-nextjs-app-3hi3</link>
      <guid>https://forem.com/ziqin/step-by-step-on-how-to-setup-fabricjs-in-the-nextjs-app-3hi3</guid>
      <description>&lt;h2&gt;
  
  
  🧐 What is &lt;code&gt;fabric.js&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://fabricjs.com/" rel="noopener noreferrer"&gt;Fabric.js&lt;/a&gt; is a powerful and simple&lt;br&gt;
Javascript HTML5 canvas library. It provides an interactive object model on top of the canvas element.&lt;br&gt;
Fabric also has SVG-to-canvas (and canvas-to-SVG) parser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7tkttpir9ziyga70w7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7tkttpir9ziyga70w7x.png" alt="Fabric.js" width="800" height="963"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What we build in this blog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jo2w123gcfzvjn7fqz5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jo2w123gcfzvjn7fqz5.gif" alt="End Product" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo above is taken from &lt;a href="https://aprilescobar.medium.com/part-2-fabric-js-on-react-fabric-rect-533c5d8bbe55" rel="noopener noreferrer"&gt;this medium blog&lt;/a&gt;, in which there's some slight modification or fix need to be done.&lt;/p&gt;


&lt;h2&gt;
  
  
  Install &lt;code&gt;fabric.js&lt;/code&gt;
&lt;/h2&gt;
&lt;h4&gt;
  
  
  npm
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i fabric
npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @types/fabric &lt;span class="c"&gt;# typescript&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  yarn
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add fabric
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; @types/fabric &lt;span class="c"&gt;# typescript&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  pnpm
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add fabric
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @types/fabric &lt;span class="c"&gt;# typescript&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setup for next.config.js
&lt;/h2&gt;

&lt;p&gt;Below is the code for next.config.js. The reason is to configure the webpack for canvas runtime error that will crash the application and utf-8-validate &amp;amp; bufferutil warning. View more at the relevant references.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {import('next').NextConfig} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// reactStrictMode: false,&lt;/span&gt;
  &lt;span class="na"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&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;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;externals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf-8-validate&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;commonjs utf-8-validate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;bufferutil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;commonjs bufferutil&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;commonjs canvas&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;// config.infrastructureLogging = { debug: /PackFileCache/ };&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;config&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="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="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  See also relevant references
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/nextjs/comments/13sbk05/what_is_the_appropriate_webpack_loader_for_the/" rel="noopener noreferrer"&gt;Appropriate webpack loader for canvas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vercel/next.js/issues/44273#issuecomment-1374989371" rel="noopener noreferrer"&gt;Common js - utf-8-validate &amp;amp; bufferutil&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Boilerplate for Next.js with Fabric.js
&lt;/h2&gt;

&lt;p&gt;Below is the &lt;code&gt;next.js&lt;/code&gt; &lt;code&gt;.tsx&lt;/code&gt; code. If you are using Next.js 13.4 and above and opt-in to the app router, add &lt;code&gt;"use client"&lt;/code&gt; on top of the file to use the Next.js client component, or else ignore the line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// next.js app router&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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;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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fabric&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;fabric&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;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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCanvas&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Canvas&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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;c&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;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&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;// ...&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// settings for all canvas in the app&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="nf"&gt;setCanvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&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;// ...&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvi&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Canvas&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;// ...&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;div&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;addRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&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;Rectangle&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;canvas&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&lt;/span&gt;&lt;span class="dl"&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="sr"&gt;/div&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure that &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; tag has an ID the same as &lt;code&gt;new fabric.Canvas(id, {...})&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  useEffect &amp;amp; addRect function
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="nf"&gt;useEffect&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;c&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;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&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;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;black&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;// settings for all canvas in the app&lt;/span&gt;
    &lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transparentCorners&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="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cornerColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#2BEBC8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cornerStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cornerStrokeColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#2BEBC8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cornerSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;setCanvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&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="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Canvas&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;rect&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;fabric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Rect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#2BEBC8&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;canvas&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;requestRenderAll&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;
  
  
  Note
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;c.dispose()&lt;/code&gt; is required to clean up the instantiated canvas element. See why you should clean up so that your rectangle can move and resize properly -&amp;gt; &lt;a href="https://stackoverflow.com/questions/76885346/re-rendering-with-react-strict-mode-and-fabrics-canvas-instantiation" rel="noopener noreferrer"&gt;StackOverflow Question&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you refuse to add the &lt;code&gt;return () =&amp;gt; {c.dispose();};&lt;/code&gt; statement, you can disable the &lt;code&gt;reactStrictMode&lt;/code&gt; in &lt;code&gt;next.config.js&lt;/code&gt;. See the concept of reactStrictMode in this &lt;a href="https://stackoverflow.com/questions/72238175/why-useeffect-running-twice-and-how-to-handle-it-well-in-react" rel="noopener noreferrer"&gt;StackOverflow Question&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;❤️ Leave a like if you like this post&lt;br&gt;
❤️ It will be a massive motivation for me&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Modern Recipe URL to 🍬 Sugar Level Estimation Web App From Scratch</title>
      <dc:creator>ziqin</dc:creator>
      <pubDate>Sat, 10 Jun 2023 03:06:37 +0000</pubDate>
      <link>https://forem.com/ziqin/modern-recipe-url-to-sugar-level-estimation-web-app-from-scratch-4jed</link>
      <guid>https://forem.com/ziqin/modern-recipe-url-to-sugar-level-estimation-web-app-from-scratch-4jed</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;When users input the recipe url into the text prompt, the web app will extract the ingredients out of the recipe url using &lt;code&gt;cheerio&lt;/code&gt; and forward to a deep learning model exported in &lt;code&gt;onnx&lt;/code&gt; format and was trained using &lt;code&gt;HuggingFace Trainer&lt;/code&gt;, lastly, sugar level will get returned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYzk2NjU0OGE2MWJhNzRiODc3OGUzYmJjNzk1ZTQ4MzY4MWZmYmZjNSZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc%2FwAhWreHzEyiMBQp04Q%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYzk2NjU0OGE2MWJhNzRiODc3OGUzYmJjNzk1ZTQ4MzY4MWZmYmZjNSZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc%2FwAhWreHzEyiMBQp04Q%2Fgiphy.gif" alt="ingbetic.vercel.app" width="480" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AI model is deployed at the edge, which means the AI model will get loaded at the client side using &lt;code&gt;onnxruntime&lt;/code&gt; with &lt;code&gt;wasm&lt;/code&gt; backend, no custom Python backend is required which drastically reduce the deployment costs.&lt;/p&gt;

&lt;p&gt;Try it here: &lt;a href="https://ingbetic.vercel.app/" rel="noopener noreferrer"&gt;https://ingbetic.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology used
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Frontend
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/a&gt; - Full Stack React Framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Typescript&lt;/strong&gt;&lt;/a&gt; - Superset Form of JS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;TailwindCSS&lt;/strong&gt;&lt;/a&gt; - Utility CSS Class&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reactflow.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Reactflow&lt;/strong&gt;&lt;/a&gt; - Node-based Interactive Editor&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Model
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/a&gt; - Prog Lang&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/" rel="noopener noreferrer"&gt;&lt;strong&gt;HuggingFace&lt;/strong&gt;&lt;/a&gt; - Hub for Model &amp;amp; Dataset&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://onnx.ai/" rel="noopener noreferrer"&gt;&lt;strong&gt;ONNX&lt;/strong&gt;&lt;/a&gt; - Quantization &amp;amp; Inference&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  See the open source code below
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ziqinyeow/ingbetic" rel="noopener noreferrer"&gt;https://github.com/ziqinyeow/ingbetic&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>ai</category>
    </item>
    <item>
      <title>Beautiful NPM Icon packages for your next web project</title>
      <dc:creator>ziqin</dc:creator>
      <pubDate>Fri, 09 Jul 2021 10:45:52 +0000</pubDate>
      <link>https://forem.com/ziqin/beautiful-npm-icon-packages-for-your-next-web-project-5266</link>
      <guid>https://forem.com/ziqin/beautiful-npm-icon-packages-for-your-next-web-project-5266</guid>
      <description>&lt;h2&gt;
  
  
  My Favourite
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;These are my favourite npm icon packages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Icon pack&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://lucide.dev/" rel="noopener noreferrer"&gt;Lucide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm i lucide&lt;/code&gt; or &lt;code&gt;npm i lucide-react&lt;/code&gt; (React)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://lucide.dev/guide/installation" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://tabler-icons.io/" rel="noopener noreferrer"&gt;Tabler&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm i @tabler/core&lt;/code&gt; or &lt;code&gt;npm i @tabler/icons-react&lt;/code&gt; (React)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tabler.io/docs/getting-started/download" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://boxicons.com/" rel="noopener noreferrer"&gt;Boxicons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i boxicons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://boxicons.com/usage/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://remixicon.com/" rel="noopener noreferrer"&gt;Remix Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i remixicon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Remix-Design/RemixIcon" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://icons.modulz.app/" rel="noopener noreferrer"&gt;Radix Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i @modulz/radix-icons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/radix-ui/icons" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Recommended
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;These are my personal recommendations of npm icon packages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Icon pack&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://icons.coreui.io/icons/" rel="noopener noreferrer"&gt;CoreUI Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i @coreui/icons@next&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://icons.coreui.io/docs/getting-started/introduction/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://teenyicons.com/" rel="noopener noreferrer"&gt;Teenyicons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i teenyicons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/teenyicons/teenyicons" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://icons.getbootstrap.com/" rel="noopener noreferrer"&gt;Bootstrap Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i bootstrap-icons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://icons.getbootstrap.com/#install" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://feathericons.com/" rel="noopener noreferrer"&gt;Feather Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i feather-icons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/feathericons/feather" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://primer.style/octicons/" rel="noopener noreferrer"&gt;Octicons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i @primer/octicons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://primer.style/octicons/guidelines/usage" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ikonate.com/" rel="noopener noreferrer"&gt;Ikonate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i ikonate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mikolajdobrucki/ikonate" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://css.gg/app" rel="noopener noreferrer"&gt;CSS.gg Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i css.gg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/astrit/css.gg" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://phosphoricons.com/" rel="noopener noreferrer"&gt;Phosphor Icon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i phosphor-icons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/phosphor-icons/phosphor-icons" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://react-icons.github.io/react-icons" rel="noopener noreferrer"&gt;React-icons&lt;/a&gt; (for React)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i react-icons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/react-icons/react-icons" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://material-ui.com/components/material-icons/" rel="noopener noreferrer"&gt;Material-UI Icon&lt;/a&gt; (for React)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i @material-ui/icons&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://material-ui.com/getting-started/installation/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Hope you are getting excited!😎&lt;/p&gt;

&lt;p&gt;Further Research:&lt;br&gt;
&lt;a href="https://shapedfonts.com/iconclub/" rel="noopener noreferrer"&gt;ShapeFonts&lt;/a&gt;&lt;br&gt;
&lt;a href="https://wweb.dev/resources/free-icon-sets/" rel="noopener noreferrer"&gt;WWEB.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading, see you in the next post.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to add custom font file to your React App?</title>
      <dc:creator>ziqin</dc:creator>
      <pubDate>Wed, 07 Jul 2021 14:24:20 +0000</pubDate>
      <link>https://forem.com/ziqin/how-to-add-custom-font-file-to-your-react-app-31kb</link>
      <guid>https://forem.com/ziqin/how-to-add-custom-font-file-to-your-react-app-31kb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Before everything gets started, go ahead and run the following code in your terminal.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npx create-react-app [app-name]
cd [app-name]
code .
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1: Create a font folder in src
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In this case, I will name it as fonts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfimpe41qjtv5sg9ted6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfimpe41qjtv5sg9ted6.png" alt="create a folder named 'fonts'" width="373" height="423"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 2: Download a font family file from the Internet
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;In this case, I will download Airbnb Cereal App font from this website: &lt;a href="https://www.cufonfonts.com/font/airbnb-cereal-app" rel="noopener noreferrer"&gt;Airbnb Cereal App Font&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 3: Extract the .zip folder
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Copy the .ttf file or .woff file from the folder and paste it to your fonts folder in the React project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99abpgiwaxeyyoiofp7s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99abpgiwaxeyyoiofp7s.jpg" alt="paste the .ttf file to your fonts folder" width="430" height="198"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Create &lt;code&gt;@font-face&lt;/code&gt; in your App.css/index.css
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In this case, I will create &lt;code&gt;@font-face&lt;/code&gt; in my App.css file. Open your App.css and write: &lt;/p&gt;
&lt;/blockquote&gt;



&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Light"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c"&gt;/*Can be any text*/&lt;/span&gt;
  &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;"AirbnbCerealLight"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sx"&gt;url("./font/AirbnbCerealLight.ttf")&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;"truetype"&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;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36z7sr9tsy5gydn9a79j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36z7sr9tsy5gydn9a79j.jpg" alt="@font-face in css" width="800" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Continue to write for the other font files in the same format.&lt;/p&gt;

&lt;p&gt;Notice that if your font file is .woff format, you should write the format if woff like this:&lt;/p&gt;
&lt;/blockquote&gt;



&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Medium"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c"&gt;/*Can be any text*/&lt;/span&gt;
  &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;"AirbnbCerealMedium"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sx"&gt;url("./font/AirbnbCerealMedium.woff")&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;"woff"&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;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 5: Import it into your project
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In this case, I will import it to my App.js file, which can then access by all the components.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5suqasx7at1bwyyfumu5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5suqasx7at1bwyyfumu5.jpg" alt="Import to App.js" width="677" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;then you can use the font in your CSS code like this:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;.css file&lt;/p&gt;



&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Light"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//"Medium"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;styled-components&lt;/p&gt;



&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  font-family: "Light"; //"Medium"
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/blockquote&gt;




&lt;p&gt;Thanks for reading; I hope you are getting excited and finding this helpful. &lt;/p&gt;

&lt;p&gt;Further research:&lt;br&gt;
&lt;a href="https://css-tricks.com/snippets/css/using-font-face/" rel="noopener noreferrer"&gt;CSS-Tricks-font-face&lt;/a&gt;&lt;br&gt;
&lt;a href="https://css-tricks.com/the-best-font-loading-strategies-and-how-to-execute-them/" rel="noopener noreferrer"&gt;CSS-Tricks-best-font-loading-strategies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See you in the next post.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>css</category>
    </item>
  </channel>
</rss>
