<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kalimah Apps</title>
    <description>The latest articles on DEV Community by Kalimah Apps (@kalimahapps).</description>
    <link>https://dev.to/kalimahapps</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%2F379823%2F1d73f142-7915-4d97-93a9-8dfdb2134ee6.png</url>
      <title>DEV Community: Kalimah Apps</title>
      <link>https://dev.to/kalimahapps</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kalimahapps"/>
    <language>en</language>
    <item>
      <title>3 VSCode extensions I use for PHP development</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Mon, 17 Jul 2023 18:28:45 +0000</pubDate>
      <link>https://dev.to/kalimahapps/3-vscode-extension-i-use-for-php-development-25f1</link>
      <guid>https://dev.to/kalimahapps/3-vscode-extension-i-use-for-php-development-25f1</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
All the mentioned extensions are part of &lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.phpkit"&gt;PHPKit extension&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client"&gt;1- PHP Intelephense:&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0j5qBHuh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzzr6oxw0ejqf7929lad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0j5qBHuh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzzr6oxw0ejqf7929lad.png" alt="Intelephense logo" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension provides PHP code intelligence for VSCode. I have used it for a long time now and it is consistent and reliable. While it has a premium version, the free one is sufficient for most of my work. The autocompletion and the details on hover are the two most features I utilize. &lt;/p&gt;

&lt;p&gt;You can stubs &lt;code&gt;intelephense.stubs&lt;/code&gt; settings to make it aware of your code. This is a great feature if you develop, for example, with WordPress because there is a built-in stub for it.&lt;/p&gt;

&lt;p&gt;However, for other projects you might struggle a little bit to find and add the stubs. For example, WooCommerce does not have a stub (I could not find any). With Laravel you need to use &lt;a href="https://github.com/barryvdh/laravel-ide-helper"&gt;IDE Helper Generator for Laravel&lt;/a&gt; to assist the extension resolving Laravel specific functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker"&gt;2- PHP DocBlocker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z8YXiimc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ce4rjxeqzyfsj17y8ac7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z8YXiimc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ce4rjxeqzyfsj17y8ac7.png" alt="PHP DocBlocker logo" width="320" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the lacking areas for most developers is documentation. In many projects it is either missing or not complete. I won't go into the reasons for this, but one way to keep the code clear to others (and your future self) is to use &lt;a href="https://docs.phpdoc.org/guide/guides/docblocks.html"&gt;docblocks&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;This extensions makes the process very easy. If you place the cursor above a function, type &lt;code&gt;/**&lt;/code&gt; and then press tab, it will generate a docblock with all related tags.&lt;/p&gt;

&lt;p&gt;It is highly configurable but I never found myself needing to change the default values. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.taqwim"&gt;&lt;strong&gt;3- PHPTaqwim&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s26aq4u1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kou3ifwhhmzba5atcpqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s26aq4u1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kou3ifwhhmzba5atcpqt.png" alt="PHPTaqwim logo" width="256" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is one my latest extensions. It is a linter/formatter extension for PHP. I was motivated to create for &lt;a href="https://dev.to/kalimahapps/phptaqwim-lint-and-format-php-using-typescript-1olb"&gt;a few reasons&lt;/a&gt;, but the main ones is lack of maintenance and documentation.&lt;/p&gt;

&lt;p&gt;The extension provides an extensive set of rules and is &lt;a href="https://taqwim.kalimah-apps.com/docs/"&gt;thoroughly documented&lt;/a&gt; and is highly configurable.&lt;/p&gt;

&lt;p&gt;One of the best features is that there is no need for PHP runtime. You don't need to configure PHP executable path at all! Just install and it should work on PHP files.&lt;/p&gt;

&lt;p&gt;It also comes as a NPM package, which might be a better option for continuous integration tools. &lt;/p&gt;

</description>
      <category>php</category>
      <category>wordpress</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Extend VSCode workspace settings from another file</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Sun, 16 Jul 2023 13:12:06 +0000</pubDate>
      <link>https://dev.to/kalimahapps/extend-vscode-workspace-settings-from-another-file-54b2</link>
      <guid>https://dev.to/kalimahapps/extend-vscode-workspace-settings-from-another-file-54b2</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I created a VSCode extension, &lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.tabaqa" rel="noopener noreferrer"&gt;Tabaqa&lt;/a&gt;, to enable extending workspace settings from another source.&lt;/p&gt;




&lt;p&gt;One of the great features of the VSCode is that you can customize the settings of the workspace. This is usually done by adding a &lt;code&gt;setting.json&lt;/code&gt; file inside &lt;code&gt;.vscode&lt;/code&gt; folder.  &lt;/p&gt;

&lt;p&gt;However, this causes few problems. For example if you push your project to a git repository and commit &lt;code&gt;settings.json&lt;/code&gt; file, others who pull the code will have to use the same settings as you do. &lt;/p&gt;

&lt;p&gt;Obviously they can customize the settings to their preferred way, but this means that they have to push the new changes to the repo (and change it for everyone else) or make sure they don't push it every time they add a new commit. &lt;/p&gt;

&lt;p&gt;Another issue is when you have a monorepo. Typically you would have different projects adjacent to each other. Even though you might have a slight different settings for each project, you still need to duplicate all the settings across all projects.&lt;/p&gt;

&lt;p&gt;These approaches well add extra time for maintenance and become a distraction from working on the project itself. &lt;/p&gt;

&lt;p&gt;This is why I developed this extension, Tabaqa. It means layer in Arabic. The extension helps extending settings either from a parent folder, a file in the workspace or from a URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;The quickset way to add settings to your workspace is to create a file named &lt;code&gt;tabaqa.json&lt;/code&gt; and place it inside the root &lt;code&gt;.vscode&lt;/code&gt;. Create it with this content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://raw.githubusercontent.com/kalimahapps/configs/main/.vscode/settings.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Sidenote: I create a repo with settings that I use regularly. You can find it here: &lt;a href="https://github.com/kalimahapps/configs/tree/main/.vscode" rel="noopener noreferrer"&gt;https://github.com/kalimahapps/configs/tree/main/.vscode&lt;/a&gt;. The URL above is referencing that repo. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you save &lt;code&gt;tabaqa.json&lt;/code&gt; file and restart VSCode, you will see that &lt;code&gt;settings.json&lt;/code&gt; is created with the settings pulled from that URL. The settings will be applied to the currently opened workspace. &lt;/p&gt;

&lt;p&gt;But what if you wanted to change some of these settings? You can add the changes to &lt;code&gt;settings&lt;/code&gt; property inside &lt;code&gt;tabaqa.json&lt;/code&gt;. For example,&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://raw.githubusercontent.com/kalimahapps/configs/main/.vscode/settings.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnPaste"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The extension will pull the settings from the remote repo, apply &lt;code&gt;editor.formatOnPast&lt;/code&gt; and update the workspace settings.&lt;/p&gt;

&lt;p&gt;You can also extend from a file inside your project:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../path/to/file.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnPaste"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Nested folders
&lt;/h4&gt;

&lt;p&gt;Another way to extend settings is to inherit them from another &lt;code&gt;tabaqa.json&lt;/code&gt; file up the folders tree. This is the default behavior. If you wanted to opt-out you can add &lt;code&gt;root: true&lt;/code&gt; to &lt;code&gt;tabaqa.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../path/to/file.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnPaste"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This will signal to the extension to stop searching up the tree and populate the settings at this level.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.tabaqa" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Tabaqa on VSCode&lt;/a&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kalimahapps" rel="noopener noreferrer"&gt;
        kalimahapps
      &lt;/a&gt; / &lt;a href="https://github.com/kalimahapps/tabaqa" rel="noopener noreferrer"&gt;
        tabaqa
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Extendable and nested settings for VSCode
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Tabaqa&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
Extendable and nested settings for VSCode
&lt;/p&gt;



&lt;p&gt;
&lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-config" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/db612f1a5d464b914d58b841c53ddc035e1b621b92a6567c4674c27374e7fb45/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f45534c696e74253230436f6e6669672d6b616c696d6168617070732d626c75653f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.tabaqa" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/8ddf94a22735600d8f9291a21430c2494aeda1944ecfd8255d4077e7b545a514/68747470733a2f2f696d672e736869656c64732e696f2f76697375616c2d73747564696f2d6d61726b6574706c6163652f762f4b616c696d6168417070732e7461626171613f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.tabaqa" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/31e1587708308363f2e6efb0688f945ad70127261ed53fbaccd17b1207e21f9d/68747470733a2f2f696d672e736869656c64732e696f2f76697375616c2d73747564696f2d6d61726b6574706c6163652f642f4b616c696d6168417070732e7461626171613f7374796c653d666c61742d737175617265266c6f676f3d76697375616c73747564696f636f6465266c6f676f436f6c6f723d253233666666266c6162656c3d646f776e6c6f616473266c6162656c436f6c6f723d253233323538386366"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://twitter.com/KalimahApps" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/762a40c8731e7340375fdfba03a08c21682e4da23b39f5d63f046d05d388c2cb/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f4b616c696d6168417070733f7374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE:&lt;/em&gt;&lt;/strong&gt;  Please be aware that this extension updates settings.json file. If you have any custom settings, please make sure to backup your settings.json file before installing this extension.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;Extend VSCode settings from a parent folder, another file or a url. You can also nest settings by adding a &lt;code&gt;tabaqa.json&lt;/code&gt; file inside a folder. The extension will look for the file and apply the settings to the current workspace.&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;How does it work?&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;The extension looks for a file names &lt;code&gt;tabaqa.json&lt;/code&gt; inside the top level &lt;code&gt;.vscode&lt;/code&gt; folder. If the file is found, it will read the file and apply the settings to the current workspace. The extension will inherit the settings from all &lt;code&gt;tabaqa.json&lt;/code&gt; files up the folder tree until it reaches the root folder (or if &lt;code&gt;root: true&lt;/code&gt; has been set).&lt;/p&gt;

&lt;p&gt;See this folder structure as an example:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;├── .vscode
│   └─ tabaqa.json&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kalimahapps/tabaqa" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;👥 &lt;strong&gt;Connect&lt;/strong&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/kalimahapps" rel="noopener noreferrer"&gt;@kalimahapps&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>VScode extension to format PHP using Typescript!</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Fri, 30 Jun 2023 17:29:01 +0000</pubDate>
      <link>https://dev.to/kalimahapps/phptaqwim-lint-and-format-php-using-typescript-1olb</link>
      <guid>https://dev.to/kalimahapps/phptaqwim-lint-and-format-php-using-typescript-1olb</guid>
      <description>&lt;p&gt;It is true. I created a &lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.taqwim"&gt;VSCode plugin&lt;/a&gt; using Typescript to lint and format PHP files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current status of PHP Linter tools
&lt;/h3&gt;

&lt;p&gt;While PHP has been around for a long time, linting and formatting PHP files are not as supported or maitained as other languages (say Javascript or python).&lt;/p&gt;

&lt;p&gt;PHP has built in linting switch &lt;code&gt;php -l&lt;/code&gt;, but its only for syntax errors. It does not check for code style or formatting. This functionality can be easily added using many of the VSCode extensions.&lt;/p&gt;

&lt;p&gt;In addition to that, there two popular libraries to lint/format PHP files:&lt;/p&gt;

&lt;p&gt;1- &lt;strong&gt;&lt;a href="https://github.com/squizlabs/PHP_CodeSniffer"&gt;PHP Code Sniffer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has &lt;a href="https://packagist.org/packages/squizlabs/php_codesniffer/stats"&gt;the most installs&lt;/a&gt; on packagist.&lt;/li&gt;
&lt;li&gt;Not regularly maintained. Commits are few and far between.&lt;/li&gt;
&lt;li&gt;Has an outdated &lt;a href="https://github.com/squizlabs/PHP_CodeSniffer/wiki"&gt;documentation&lt;/a&gt; (last updated in 2016).&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;xml&lt;/code&gt; for configuration which is an outdated format for configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2- &lt;strong&gt;&lt;a href="https://github.com/PHP-CS-Fixer/PHP-CS-Fixer"&gt;PHP CS Fixer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highly maintined and regularly updated.&lt;/li&gt;
&lt;li&gt;It has &lt;a href="https://packagist.org/packages/friendsofphp/php-cs-fixer/stats"&gt;fewer installs&lt;/a&gt; than PHP Code Sniffer, but the margin is not that big.&lt;/li&gt;
&lt;li&gt;Has a &lt;a href="https://mlocati.github.io/php-cs-fixer-configurator/#version:3.20"&gt;detailed documentation&lt;/a&gt; but it is still hard to navigate.&lt;/li&gt;
&lt;li&gt;Uses PHP for configuration which is a better format than &lt;code&gt;xml&lt;/code&gt; but still not ideal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unfortunately, both libraries are not easy to configure and setup. Also, both libraries have a number of VSCode extensions, but they require the path to PHP executable to be set in the configuration, which is not as easy as it sounds, at least in my experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  This extension
&lt;/h3&gt;

&lt;p&gt;PHPTaqwim (Arabic for correction) aims to be a simple and easy to use extension to lint and format PHP files. It requires no configuration and it works out of the box. It is also configurable if you want to customize it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zmAU9w_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wkstwo7go29rlqlnd6kw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zmAU9w_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wkstwo7go29rlqlnd6kw.png" alt="PHPTaqwim warnings" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Interestingly, it is written in Typescript, not PHP. This is the reason that it does not require PHP runtime to be installed on your machine. It uses &lt;a href="https://github.com/glayzzle/php-parser"&gt;PHP Parser&lt;/a&gt; under the hood to get PHP AST and apply the rules.&lt;/p&gt;

&lt;p&gt;It also comes as a &lt;a href="https://taqwim.kalimah-apps.com/docs/cli.html"&gt;NPM CLI package&lt;/a&gt;, so you can use it in your CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.taqwim" class="ltag_cta ltag_cta--branded"&gt;PHPTaqwim on VSCode&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>php</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Vue Options to Composition API Online Converter</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Wed, 24 May 2023 12:05:38 +0000</pubDate>
      <link>https://dev.to/kalimahapps/vue-options-to-composition-api-online-converter-15of</link>
      <guid>https://dev.to/kalimahapps/vue-options-to-composition-api-online-converter-15of</guid>
      <description>&lt;p&gt;If you are reading this, chances are you have old projects using Vue2 options API and you want to migrate it to Vue3.&lt;/p&gt;

&lt;p&gt;One of the main features that were introduced in vue3 is &lt;a href="https://vuejs.org/guide/extras/composition-api-faq.html#what-is-composition-api"&gt;composition API&lt;/a&gt;. It helps writing a code that resembles "regular" JavaScript functions. &lt;/p&gt;

&lt;p&gt;While Vue team has provided backward compatibility for options API, it is still a good idea to migrate the code to get the benefit of the new features in Vue3 and have a more maintainable code. &lt;/p&gt;

&lt;p&gt;However, many developers choose not to migrate for a multitude of reasons. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migration might introduce new bugs to a rather working code (if the code is not broke don't fix it).&lt;/li&gt;
&lt;li&gt;There is a learning curve required when rewrite the code with the new features. &lt;/li&gt;
&lt;li&gt;Busy schedule. Most developers work on few projects simultaneously and do not have enough time for improving old code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why I developed this online tool. It converts options API to composition API without much effort from the developers.&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Click to see example&lt;/strong&gt;
  &lt;br&gt;
The tool can convert this code:&lt;br&gt;

&lt;pre&gt;&lt;code&gt;&lt;span&gt;// https://github.com/gitlabhq/gitlabhq/blob/e6d048d769240760008f0dbb6b811e1ebc675292/app/assets/javascripts/ide/components/repo_tab.vue#L3&lt;/span&gt;

&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;GlIcon&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;GlTab&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;@gitlab/ui&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;mapActions&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;mapGetters&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;vuex&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;__&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;sprintf&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;~/locale&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

&lt;span&gt;import&lt;/span&gt; &lt;span&gt;ChangedFileIcon&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;~/vue_shared/components/changed_file_icon.vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;FileIcon&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;~/vue_shared/components/file_icon.vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;FileStatusIcon&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;./repo_file_status_icon.vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

&lt;span&gt;export&lt;/span&gt; &lt;span&gt;default&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
  &lt;span&gt;components&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;FileStatusIcon&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;FileIcon&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;GlIcon&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;ChangedFileIcon&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;GlTab&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  &lt;span&gt;},&lt;/span&gt;
  &lt;span&gt;props&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;tab&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;Object&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
      &lt;span&gt;required&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
  &lt;span&gt;},&lt;/span&gt;
  &lt;span&gt;data&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;tabMouseOver&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;};&lt;/span&gt;
  &lt;span&gt;},&lt;/span&gt;
  &lt;span&gt;computed&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;...&lt;/span&gt;&lt;span&gt;mapGetters&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;getUrlForPath&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;]),&lt;/span&gt;
    &lt;span&gt;closeLabel&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt; &lt;span&gt;sprintf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;%{tabname} changed&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;tabname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt; &lt;span&gt;});&lt;/span&gt;
      &lt;span&gt;}&lt;/span&gt;
      &lt;span&gt;return&lt;/span&gt; &lt;span&gt;sprintf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;Close %{tabname}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;tabname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt; &lt;span&gt;});&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
    &lt;span&gt;showChangedIcon&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pending&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

      &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;!&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tabMouseOver&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
    &lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;changed&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tempFile&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;staged&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleted&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
  &lt;span&gt;},&lt;/span&gt;

  &lt;span&gt;methods&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;...&lt;/span&gt;&lt;span&gt;mapActions&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;closeFile&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;updateDelayViewerUpdated&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;openPendingTab&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;]),&lt;/span&gt;
    &lt;span&gt;clickFile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;active&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

      &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;updateDelayViewerUpdated&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;

      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pending&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;openPendingTab&lt;/span&gt;&lt;span&gt;({&lt;/span&gt; &lt;span&gt;file&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;tab&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;keyPrefix&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;staged&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;staged&lt;/span&gt;&lt;span&gt;'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;unstaged&lt;/span&gt;&lt;span&gt;'&lt;/span&gt; &lt;span&gt;});&lt;/span&gt;
      &lt;span&gt;}&lt;/span&gt; &lt;span&gt;else&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;$router&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getUrlForPath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;
      &lt;span&gt;}&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
    &lt;span&gt;mouseOverTab&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tabMouseOver&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
      &lt;span&gt;}&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
    &lt;span&gt;mouseOutTab&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tabMouseOver&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
      &lt;span&gt;}&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
  &lt;span&gt;},&lt;/span&gt;
&lt;span&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;To this&lt;br&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;GlIcon&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;GlTab&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;@gitlab/ui&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;mapActions&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;mapGetters&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;vuex&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;__&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;sprintf&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;~/locale&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;ChangedFileIcon&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;~/vue_shared/components/changed_file_icon.vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;FileIcon&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;~/vue_shared/components/file_icon.vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;FileStatusIcon&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;./repo_file_status_icon.vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;ref&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;computed&lt;/span&gt; &lt;span&gt;}&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;vue&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;


&lt;span&gt;// Data&lt;/span&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;tabMouseOver&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;ref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;

&lt;span&gt;// Props&lt;/span&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;props&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;defineProps&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;
    &lt;span&gt;tab&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;Object&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
        &lt;span&gt;required&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
    &lt;span&gt;},&lt;/span&gt;
&lt;span&gt;});&lt;/span&gt;

&lt;span&gt;// Computed&lt;/span&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;closeLabel&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;computed&lt;/span&gt;&lt;span&gt;(()&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt; &lt;span&gt;sprintf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;%{tabname} changed&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;tabname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt; &lt;span&gt;});&lt;/span&gt;
    &lt;span&gt;}&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;sprintf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;Close %{tabname}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;tabname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt; &lt;span&gt;});&lt;/span&gt;
&lt;span&gt;})&lt;/span&gt;

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;showChangedIcon&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;computed&lt;/span&gt;&lt;span&gt;(()&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pending&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;!&lt;/span&gt;&lt;span&gt;tabMouseOver&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;})&lt;/span&gt;

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;fileHasChanged&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;computed&lt;/span&gt;&lt;span&gt;(()&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;changed&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tempFile&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;staged&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleted&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;})&lt;/span&gt;


&lt;span&gt;// Methods&lt;/span&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;clickFile&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;active&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

    &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;updateDelayViewerUpdated&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;

    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pending&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;openPendingTab&lt;/span&gt;&lt;span&gt;({&lt;/span&gt; &lt;span&gt;file&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;tab&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
            &lt;span&gt;keyPrefix&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; &lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;staged&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;staged&lt;/span&gt;&lt;span&gt;'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;unstaged&lt;/span&gt;&lt;span&gt;'&lt;/span&gt; &lt;span&gt;});&lt;/span&gt;
    &lt;span&gt;}&lt;/span&gt; &lt;span&gt;else&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;$router&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getUrlForPath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;
    &lt;span&gt;}&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;mouseOverTab&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;tabMouseOver&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;}&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;mouseOutTab&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fileHasChanged&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;
        &lt;span&gt;tabMouseOver&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;}&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;





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

&lt;p&gt;&lt;strong&gt;You can see the tool here: &lt;a href="https://kalimah-apps.com/vue-options-to-composition"&gt;https://kalimah-apps.com/vue-options-to-composition&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you use this tool please remember that it does not cover all cases. It is useful to get you a step head and remove one hurdle from the code migrating process.&lt;/p&gt;

&lt;p&gt;If you would like to contribute, report a bug or request a feature you can check the repo at GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kalimahapps"&gt;
        kalimahapps
      &lt;/a&gt; / &lt;a href="https://github.com/kalimahapps/vue-options-to-composition"&gt;
        vue-options-to-composition
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Online tool to convert vue2 options to vue3 composition API
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Vue Options to Composition API Converter&lt;/h1&gt;
&lt;h2&gt;
Introduction&lt;/h2&gt;
&lt;p&gt;This is an online tool to convert Vue 2 options API code to Vue 3 composition API code.&lt;/p&gt;
&lt;h2&gt;
Example&lt;/h2&gt;
&lt;p&gt;Input Vue 2 options API code:&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;export&lt;/span&gt; &lt;span class="pl-k"&gt;default&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-c1"&gt;data&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-c1"&gt;items&lt;/span&gt;: &lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
      &lt;span class="pl-c1"&gt;list&lt;/span&gt;: &lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-c1"&gt;props&lt;/span&gt;: &lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-s"&gt;'loading'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s"&gt;'lazy'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s"&gt;'disabled'&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-c1"&gt;methods&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-en"&gt;isLazy&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-smi"&gt;this&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;lazy&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-en"&gt;isLoading&lt;/span&gt;: &lt;span class="pl-k"&gt;function&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-smi"&gt;this&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;loading&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-en"&gt;isDisabled&lt;/span&gt;: &lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-smi"&gt;this&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;disabled&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;
  &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-c1"&gt;watch&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-en"&gt;loading&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;newValue&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-smi"&gt;console&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;log&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;"Value"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s1"&gt;newValue&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;disabled&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-c1"&gt;immediate&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-en"&gt;handler&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;value&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-smi"&gt;this&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;bar&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;value&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;

  &lt;span class="pl-kos"&gt;}&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Output Vue 3 composition API code:&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kalimahapps/vue-options-to-composition"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>vue</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>4 VSCode extensions I use when developing with Tailwind</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Thu, 06 Apr 2023 01:34:41 +0000</pubDate>
      <link>https://dev.to/kalimahapps/4-vscode-extensions-i-use-for-tailwind-2him</link>
      <guid>https://dev.to/kalimahapps/4-vscode-extensions-i-use-for-tailwind-2him</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;All these extensions are available in this VSCode extension pack &lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.tailwindcss-kit" rel="noopener noreferrer"&gt;TailwindCSS Kit&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss" rel="noopener noreferrer"&gt;Tailwind CSS IntelliSense&lt;/a&gt;
&lt;/h2&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%2Fuploads%2Farticles%2F4w36g7owmtrmljbesu24.png" 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%2Fuploads%2Farticles%2F4w36g7owmtrmljbesu24.png" alt="tailwind css intellisnse image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tailwind CSS IntelliSense is a powerful tool that can help developers to write code faster and more efficiently. The tool provides real-time suggestions for Tailwind CSS classes, reducing errors and improving code quality. By using IntelliSense, developers can increase productivity, reduce the learning curve, and improve the accessibility of their applications. If you are a developer working with Tailwind CSS, be sure to take advantage of this powerful feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://marketplace.visualstudio.com/items?itemName=stivo.tailwind-fold" rel="noopener noreferrer"&gt;Tailwind Fold&lt;/a&gt;
&lt;/h2&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%2Fuploads%2Farticles%2Femrb68kd1qnvb4cb2h45.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%2Fuploads%2Farticles%2Femrb68kd1qnvb4cb2h45.gif" alt="tailwind fold extension image" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension is extremely helpful when working with Tailwind. Long list of classes can clutter the html part and this extension provide a great way of hiding them away and show them only when needed. In addition to the default functionality, the options are well-thought and fit almost any preference. For example, I like the classes to be unfolded when I click on the line not the class itself, and there is an option for that.&lt;/p&gt;

&lt;p&gt;I gave the extension 5 stars rating but there is one issue I would like to see improved. I use eslint with &lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-plugin-tailwind" rel="noopener noreferrer"&gt;eslint tailwind plugin&lt;/a&gt; which breaks long classes into multiple lines. The extension does not seem to fold classes that spans over multiple lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;a href="https://marketplace.visualstudio.com/items?itemName=alfredbirk.tailwind-documentation" rel="noopener noreferrer"&gt;Tailwind Documentation&lt;/a&gt;
&lt;/h2&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%2Fuploads%2Farticles%2Fnj44m1g34aqrnyrmexyq.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%2Fuploads%2Farticles%2Fnj44m1g34aqrnyrmexyq.gif" alt="Tailwind Documentation image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Tailwind Documentation extension provides quick access to the official Tailwind CSS documentation. This extension enables developers to access the Tailwind CSS documentation directly from within the VSCode editor, without having to open a browser or leave the editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;a href="https://marketplace.visualstudio.com/items?itemName=KalimahApps.tailwind-config-viewer" rel="noopener noreferrer"&gt;Tailwind Config Viewer&lt;/a&gt;
&lt;/h2&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%2Fuploads%2Farticles%2Fzxwuaxi8v4o9olb4g06d.png" 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%2Fuploads%2Farticles%2Fzxwuaxi8v4o9olb4g06d.png" alt="Tailwind Config Viewer image" width="563" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tailwind config can be confusing. They might expand exponentially and make it harder for users to know the resolved config. This is why I created this extension. It enables users to view the &lt;strong&gt;resolved&lt;/strong&gt; Tailwind config and it will also show the color for any color-related classes (text-*, bg-*, accent-* ... etc)&lt;/p&gt;

&lt;p&gt;In future, I am planning to make the classes clickable so when a user clicks on a class it will be inserted in html section.&lt;/p&gt;

&lt;p&gt;👥 &lt;strong&gt;Connect&lt;/strong&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/kalimahapps" rel="noopener noreferrer"&gt;@kalimahapps&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/kalimahapps" rel="noopener noreferrer"&gt;KalimahApps&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://kalimah-apps.com/" rel="noopener noreferrer"&gt;https://kalimah-apps.com/&lt;/a&gt;&lt;br&gt;
CodePen: &lt;a href="https://codepen.io/khr2003" rel="noopener noreferrer"&gt;https://codepen.io/khr2003&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Other Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/kalimahapps/phptaqwim-lint-and-format-php-using-typescript-1olb"&gt;PHPTaqwim: Lint and format PHP using Typescript!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kalimahapps/8-tools-to-improve-css-design-3lcg"&gt;8 tools to help with CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kalimahapps/ps4-controller-in-css-4g22"&gt;PS4 Controller in Pure CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kalimahapps/iphone-12-vs-galaxy-s21-glassmorphism-270f"&gt;iPhone 12 vs Galaxy S21. Glassmorphism design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vscode</category>
      <category>tailwindcss</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Increase tailwind classes readability with this eslint plugin</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Sun, 05 Mar 2023 15:58:56 +0000</pubDate>
      <link>https://dev.to/kalimahapps/increate-tailwind-readability-with-this-eslint-plugin-2cg2</link>
      <guid>https://dev.to/kalimahapps/increate-tailwind-readability-with-this-eslint-plugin-2cg2</guid>
      <description>&lt;p&gt;Tailwind is a popular utility-first CSS framework that has gained significant traction in recent years. It is a highly customizable and easy-to-use framework that can help developers streamline their workflow and create visually appealing websites with less code. &lt;/p&gt;

&lt;p&gt;One of the biggest advantages of using Tailwind is that it streamlines the development process. The framework provides a set of pre-defined classes that developers can use to style their HTML elements. This eliminates the need to write custom CSS for every single element on the website, saving a significant amount of time and effort.&lt;/p&gt;

&lt;p&gt;With such large amounts of pre-defined classes, sometimes it can be difficult to read and understand at first glance how a particular element is styled. &lt;/p&gt;

&lt;p&gt;Let's look at this example (taken from flowbite):&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;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-flex items-center cursor-pointer"&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;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sr-only peer"&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=&lt;/span&gt;&lt;span class="s"&gt;"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&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;"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Toggle me&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This is a checkbox that has been styled using Tailwind. It is a single line of code that contains a lot of information. It is not immediately clear how the checkbox is styled.&lt;/p&gt;

&lt;p&gt;This is why I developed an eslint plugin that helps developers to better understand how Tailwind classes are being used in their code. The plugin is called &lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-plugin-tailwind" rel="noopener noreferrer"&gt;@kalimahapps/eslint-plugin-tailwind&lt;/a&gt; and it is available on npm. Currently, it has two rules.&lt;/p&gt;
&lt;h2&gt;
  
  
  tailwind-multiline
&lt;/h2&gt;

&lt;p&gt;With this rule, you can enforce that Tailwind classes are written on multiple lines once they exceed a certain number of characters. This makes it easier to read and understand how the element is styled.&lt;/p&gt;

&lt;p&gt;Let's see how the above example would look like with this rule enabled:&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;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-flex items-center cursor-pointer"&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;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sr-only peer"&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=&lt;/span&gt;&lt;span class="s"&gt;"w-11
            h-6
            bg-gray-200
            peer-focus:outline-none
            peer-focus:ring-4
            peer-focus:ring-blue-300
            dark:peer-focus:ring-blue-800
            rounded-full
            peer
            dark:bg-gray-700
            peer-checked:after:translate-x-full
            peer-checked:after:border-white
            after:content-['']
            after:absolute
            after:top-[2px]
            after:left-[2px]
            after:bg-white
            after:border-gray-300
            after:border
            after:rounded-full
            after:h-5
            after:w-5
            after:transition-all
            dark:border-gray-600
            peer-checked:bg-blue-600"&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;"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Toggle me&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;As you can see, the classes are now written on multiple lines and from first glance you can identify which classes are being used to style the element.&lt;/p&gt;
&lt;h2&gt;
  
  
  tailwind-sort
&lt;/h2&gt;

&lt;p&gt;This is the other rule that is included in the plugin. It helps developers to sort the Tailwind classes in a consistent manner. While tailwind provides a &lt;a href="https://tailwindcss.com/blog/automatic-class-sorting-with-prettier" rel="noopener noreferrer"&gt;prettier plugin&lt;/a&gt; to sort the classes, I found it unintuitive and not very useful. The classes in the base layer will be sorted first, followed by the classes in the components layer, and finally the classes in the utilities layer.&lt;/p&gt;

&lt;p&gt;This rule, however, sorts classes alphabetically but in groups. For example, it makes sense that &lt;code&gt;bg-sky-500&lt;/code&gt; and &lt;code&gt;dark:bg-sky-100&lt;/code&gt; are grouped together. This is because they are both background colors. The same goes for &lt;code&gt;text-sky-500&lt;/code&gt; and &lt;code&gt;dark:text-sky-100&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's see how the above example would look like with this rule enabled:&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;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"cursor-pointer inline-flex items-center relative"&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;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"peer sr-only"&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=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200
            after:bg-white
            dark:bg-gray-700
            h-6
            after:h-5
            peer
            dark:peer-focus:ring-blue-800
            peer-checked:after:border-white
            peer-checked:after:translate-x-full
            peer-checked:bg-blue-600
            peer-focus:outline-none
            peer-focus:ring-4
            peer-focus:ring-blue-300
            rounded-full
            after:rounded-full
            w-11
            after:w-5
            after:absolute
            after:border
            after:border-gray-300
            after:content-['']
            after:left-[2px]
            after:top-[2px]
            after:transition-all
            dark:border-gray-600"&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;"font-medium ml-3 text-gray-900 dark:text-gray-300 text-sm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Toggle me&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;I think this is a much more readable and understandable way to write Tailwind classes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install and Usage
&lt;/h2&gt;

&lt;p&gt;Currently, the package only works for vue projects. To install and use this plugin in your project checkout readme file:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kalimahapps" rel="noopener noreferrer"&gt;
        kalimahapps
      &lt;/a&gt; / &lt;a href="https://github.com/kalimahapps/eslint-plugin-tailwind" rel="noopener noreferrer"&gt;
        eslint-plugin-tailwind
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ESLint plugin to sort tailwind classes
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;KalimahApps Eslint Tailwind Plugin&lt;/h1&gt;
&lt;/div&gt;



&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Provide eslint rules for tailwindcss&lt;/h3&gt;
&lt;/div&gt;



&lt;p&gt;
&lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-plugin-tailwind" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/30c5e0ed4199f8b04dd0bee231f1b62eb14489a59d3bbf02a3ce320fec45ad85/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406b616c696d6168617070732f65736c696e742d706c7567696e2d7461696c77696e642e737667"&gt;
&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-plugin-tailwind" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/b137bcd0a5216df746590a1d120d52378a4d39f908d20284b3ee149e5f7237ae/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f406b616c696d6168617070732f65736c696e742d706c7567696e2d7461696c77696e642e737667"&gt;
&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7324e8186b583c3b807198d8c324e0b2ef2feef97e4f4f6d1842b54075627776/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d6168617070732f65736c696e742d706c7567696e2d7461696c77696e64"&gt;&lt;img src="https://camo.githubusercontent.com/7324e8186b583c3b807198d8c324e0b2ef2feef97e4f4f6d1842b54075627776/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d6168617070732f65736c696e742d706c7567696e2d7461696c77696e64"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://twitter.com/KalimahApps" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/762a40c8731e7340375fdfba03a08c21682e4da23b39f5d63f046d05d388c2cb/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f4b616c696d6168417070733f7374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;/p&gt;



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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tailwind-sort&lt;/code&gt;: Sort tailwind classes in alphabetical order in groups&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tailwind-multiline&lt;/code&gt;: Break tailwind classes into multiple lines if they exceed the max line length (default: 80)&lt;/li&gt;
&lt;/ul&gt;



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

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;PNPM&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pnpm add eslint &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-plugin-tailwind -D&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;NPM&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install eslint &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-plugin-tailwind -D&lt;/pre&gt;

&lt;/div&gt;



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

&lt;/div&gt;

&lt;p&gt;Create eslint.config.js file (or eslint.config.mjs for esm, or eslint.config.cjs for commonjs) in the root of your project and add this&lt;/p&gt;

&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;kalimahAppsTailwind&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'&lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-plugin-tailwind'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-k"&gt;export&lt;/span&gt; &lt;span class="pl-k"&gt;default&lt;/span&gt; &lt;span class="pl-kos"&gt;[&lt;/span&gt;
    &lt;span class="pl-kos"&gt;{&lt;/span&gt;
        &lt;span class="pl-c1"&gt;plugins&lt;/span&gt;: &lt;span class="pl-kos"&gt;{&lt;/span&gt;
            kalimahAppsTailwind&lt;span class="pl-kos"&gt;,&lt;/span&gt;
        &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
        &lt;span class="pl-c1"&gt;rules&lt;/span&gt;: &lt;span class="pl-kos"&gt;{&lt;/span&gt;
            &lt;span class="pl-s"&gt;'kalimahAppsTailwind/sort'&lt;/span&gt;: &lt;span class="pl-s"&gt;'warn'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
            &lt;span class="pl-s"&gt;'kalimahAppsTailwind/multiline'&lt;/span&gt;: &lt;span class="pl-s"&gt;'warn'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
        &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The following options can be set to the mutiline rule:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;maxLen&lt;/code&gt;: break classes as soon as the line length is longer than this (and join if the line is smaller)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quotesOnNewLine&lt;/code&gt;: put the quotes on different lines to the first and last…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kalimahapps/eslint-plugin-tailwind" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;👥 &lt;strong&gt;Connect&lt;/strong&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/kalimahapps" rel="noopener noreferrer"&gt;@kalimahapps&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>eslint</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Toggle maintenance mode in Laravel using web routes</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Mon, 09 Jan 2023 14:19:55 +0000</pubDate>
      <link>https://dev.to/kalimahapps/toggle-maintenance-mode-in-laravel-using-web-routes-2n04</link>
      <guid>https://dev.to/kalimahapps/toggle-maintenance-mode-in-laravel-using-web-routes-2n04</guid>
      <description>&lt;p&gt;As a web developer, it’s important to keep your website up to date and running smoothly. However, sometimes you need to perform maintenance on your site and you don’t want your users to see any errors or downtime. That’s where Laravel’s maintenance mode comes in handy.&lt;/p&gt;

&lt;p&gt;Laravel’s maintenance mode allows you to put your website into a state where it is only accessible to authorized users, such as admins or developers. This allows you to perform updates or make changes to your site without disrupting your users’ experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling maintenance mode using CLI
&lt;/h2&gt;

&lt;p&gt;To enable maintenance mode, you simply need to run the following command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a maintenance mode “lock” file in your storage directory, which will prevent any users from accessing your site.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;strong&gt;Note&lt;/strong&gt;&lt;br&gt;
The lock file is named "down" and it will be created in the &lt;code&gt;storage/framework&lt;/code&gt; directory. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you need to access your website  while it’s in maintenance mode, you can use the &lt;code&gt;--secret&lt;/code&gt; option to specify a secret endpoint that will create a browser session allowing you to bypass the maintenance mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan down &lt;span class="nt"&gt;--secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secret-route-to-allow-certain-users-to-access-the-application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then access your site by appending the secret route to your site’s URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/secret-route-to-allow-certain-users-to-access-the-application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you’ve finished your maintenance tasks, you can simply run the following command to disable maintenance mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will remove the maintenance mode lock file and allow all users to access your site again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling maintenance mode using web endpoints
&lt;/h2&gt;

&lt;p&gt;The above method is fine and it works well. However, it is not convenient as you would need to SSH into your server to run the commands.&lt;/p&gt;

&lt;p&gt;To manage maintenance mode from your browser, you can add custom routes to your &lt;code&gt;routes/web.php&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;To enable maintenance mode, you can add the following route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'/enable-maintenance-mode'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Artisan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'--secret'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'allow-certain-users-to-access-the-application-using-this-secret'&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="nf"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nc"&gt;Artisan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;output&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;Notice that we are using the &lt;code&gt;Artisan::call()&lt;/code&gt; method to run the &lt;code&gt;down&lt;/code&gt; command. We are also passing the &lt;code&gt;--secret&lt;/code&gt; option to specify a secret route that will create a browser session allowing you to bypass the maintenance mode.&lt;/p&gt;

&lt;p&gt;To disable maintenance mode, you can add the following route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'/disable-maintenance-mode'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Artisan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'up'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Artisan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;output&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;h2&gt;
  
  
  Bounce: Custom maintenance mode page
&lt;/h2&gt;

&lt;p&gt;The default maintenance mode page is not that great. &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%2F8q0ppctu1eqntruzi03c.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%2F8q0ppctu1eqntruzi03c.png" alt="Image description" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It does the job but it does not provide any extra information to the user about why the website is down, when it will up again.&lt;/p&gt;

&lt;p&gt;If you want to display a custom maintenance mode page, you can use the &lt;code&gt;--render&lt;/code&gt; option to specify a view that will be displayed to your users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan down &lt;span class="nt"&gt;--render&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;custom-view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or using the &lt;code&gt;Artisan::call()&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'/enable-maintenance-mode'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Artisan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'--secret'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'allow-certain-users-to-access-the-application-using-this-secret'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'--render'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'custom-view'&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="nf"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nc"&gt;Artisan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;output&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;Now you can create a &lt;code&gt;custom-view.blade.php&lt;/code&gt; file in your &lt;code&gt;resources/views&lt;/code&gt; directory and add any content you want to display to your users.&lt;/p&gt;

</description>
      <category>help</category>
      <category>docker</category>
      <category>python</category>
      <category>django</category>
    </item>
    <item>
      <title>Goodbye prettier, welcome ESLint</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Mon, 09 Jan 2023 02:04:33 +0000</pubDate>
      <link>https://dev.to/kalimahapps/goodbye-prettier-welcome-eslint-42fe</link>
      <guid>https://dev.to/kalimahapps/goodbye-prettier-welcome-eslint-42fe</guid>
      <description>&lt;p&gt;Like many developers I have used &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;prettier&lt;/a&gt; for a long time for most of my projects. It has been the go-to formatting tool for front-end developers and for a good reason. It provides opinionated formatting with minimal options. This coupled with a wide IDE support makes it easy to setup and user.&lt;/p&gt;

&lt;p&gt;Unfortunately being opinionated has its downsides. It is not possible to configure prettier to your liking. For example, I prefer to have a trailing comma in my objects and arrays. This is not possible with prettier. I also prefer to have a space after the function keyword. This is also not possible with prettier. A quick search on prettier’s &lt;a href="https://github.com/prettier/prettier/issues?q=is%3Aissue+is%3Aopen+sort%3Acomments-desc" rel="noopener noreferrer"&gt;GitHub issues&lt;/a&gt; shows that there are many requests for these features. The maintainers have been very clear that they do not want to add these features. They want to keep prettier simple and opinionated.&lt;/p&gt;

&lt;p&gt;The other issue is that prettier does not work well with ESLint. While prettier website provides a guide on how to &lt;a href="https://prettier.io/docs/en/integrating-with-linters.html" rel="noopener noreferrer"&gt;integrate with linters&lt;/a&gt;, it is a still a combersome process. I can't remember how many times I tried to make them work together and failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter ESLint
&lt;/h2&gt;

&lt;p&gt;ESlint, like prettier, needs no introduction. It is a linting tool with great support. It is also highly configurable. By highly I mean it has &lt;a href="https://eslint.org/docs/latest/rules/" rel="noopener noreferrer"&gt;300+ rules&lt;/a&gt; (or options) listed on its website. In addition to that there are many plugins that provide more rules for various part of your project. Lastly, you can write your own rules if you want to.&lt;/p&gt;

&lt;p&gt;While being highly configurable is a good thing, it represents the other extreme to prettier. It is easy to get overwhelmed by the number of options and rules. This is why I prefer to use a preset that provides a good set of rules and plugins. There are many presets available, like airbnb, standard, xo, etc. I have used many of them and they seem to work well. However, I have found that they are not perfect for my projects. Especially that I work mostly with vue projects. &lt;/p&gt;

&lt;p&gt;That is why I created a sharable config for ESLint that I use in my projects. It comes with great defaults and include popular plugins like unicorn, promise, jsdoc, vue and other eslint plugins. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;You can install it using npm or yarn:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev @kalimahapps/eslint-config
yarn add --dev @kalimahapps/eslint-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then add the following to your &lt;code&gt;.eslintrc.js&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  extends: ["@kalimahapps"],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then add this to your .vscode/settings.json file to auto-fix on save:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "prettier.enable": false,
    "editor.formatOnSave": false,
    "eslint.codeAction.showDocumentation": {
        "enable": true
    },
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },
    "eslint.validate": [
        "javascript",
        "javascriptreact",
        "typescript",
        "typescriptreact"
    ],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Where to find it
&lt;/h2&gt;
&lt;h4&gt;
  
  
  GitHub
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kalimahapps" rel="noopener noreferrer"&gt;
        kalimahapps
      &lt;/a&gt; / &lt;a href="https://github.com/kalimahapps/eslint-config" rel="noopener noreferrer"&gt;
        eslint-config
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Comprehensive eslint rules for vue projects with typescript
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;KalimahApps Eslint Config&lt;/h1&gt;
&lt;/div&gt;



&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Comprehensive eslint rules for vue projects with typescript &lt;/h3&gt;
&lt;/div&gt;



&lt;p&gt;
&lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-config" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/78ef228c336abdff96d63ff93dd0ce1536de572ba92f34f93ae9860252d98394/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406b616c696d6168617070732f65736c696e742d636f6e6669672e737667"&gt;
&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-config" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/2d256b373491eee67215d825f759ca1ed47a15ac78e4bf0e6abe88d10448c338/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f406b616c696d6168617070732f65736c696e742d636f6e6669672e737667"&gt;
&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/52a7acd2cbf019b26abb302b5797d5b081df07d161340da65eeaee57aee2240a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7675652d332d253233343262383833"&gt;&lt;img src="https://camo.githubusercontent.com/52a7acd2cbf019b26abb302b5797d5b081df07d161340da65eeaee57aee2240a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7675652d332d253233343262383833"&gt;&lt;/a&gt;

&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cd45646c3bdfdc1b510b2ae3901b09691f09ca469344c0dfb77e29a592b82a91/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d6168617070732f65736c696e742d636f6e6669672e737667"&gt;&lt;img src="https://camo.githubusercontent.com/cd45646c3bdfdc1b510b2ae3901b09691f09ca469344c0dfb77e29a592b82a91/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d6168617070732f65736c696e742d636f6e6669672e737667"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://twitter.com/KalimahApps" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/762a40c8731e7340375fdfba03a08c21682e4da23b39f5d63f046d05d388c2cb/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f4b616c696d6168417070733f7374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;/p&gt;



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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Includes unicorn, jsdoc, vue and other eslint plugins&lt;/li&gt;
&lt;li&gt;No prettier.&lt;/li&gt;
&lt;li&gt;Tabs and semicolons.&lt;/li&gt;
&lt;li&gt;Configurable rules.&lt;/li&gt;
&lt;li&gt;Sort package.json and .vscode/settings.json files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While this config is tailored for vue projects, it can be used for any javascript/typescript project. You might see some duplication in the rules, but nothing major.&lt;/p&gt;



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

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;PNPM&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pnpm add eslint &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-config -D&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;NPM&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install eslint &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-config -D&lt;/pre&gt;

&lt;/div&gt;



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

&lt;/div&gt;

&lt;p&gt;Create &lt;code&gt;eslint.config.js&lt;/code&gt; file (or &lt;code&gt;eslint.config.mjs&lt;/code&gt; for esm, or &lt;code&gt;eslint.config.cjs&lt;/code&gt; for commonjs) in the root of your project and add this&lt;/p&gt;

&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;eslintConfig&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'&lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-config'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;export&lt;/span&gt; &lt;span class="pl-k"&gt;default&lt;/span&gt; &lt;span class="pl-kos"&gt;[&lt;/span&gt;...&lt;span class="pl-s1"&gt;eslintConfig&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;VSCode integration&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Install &lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" rel="nofollow noopener noreferrer"&gt;ESLint&lt;/a&gt; extension in VSCode and add this to your &lt;code&gt;.vscode/settings.json&lt;/code&gt; file&lt;/p&gt;

&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
    &lt;span class="pl-ent"&gt;"prettier.enable"&lt;/span&gt;: &lt;span class="pl-c1"&gt;false&lt;/span&gt;
    &lt;span class="pl-ent"&gt;"editor.formatOnSave"&lt;/span&gt;: &lt;span class="pl-c1"&gt;false&lt;/span&gt;,
    &lt;span class="pl-ent"&gt;"eslint.codeAction.showDocumentation"&lt;/span&gt;: {
        &lt;span class="pl-ent"&gt;"enable"&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;
    },
    &lt;span class="pl-ent"&gt;"editor.codeActionsOnSave"&lt;/span&gt;: {
        &lt;span class="pl-ent"&gt;"source.fixAll.eslint"&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;
    },
    &lt;span class="pl-ent"&gt;"eslint.validate"&lt;/span&gt;: [
        &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;javascript&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kalimahapps/eslint-config" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h4&gt;
  
  
  NPM
&lt;/h4&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-config" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic-production.npmjs.com%2F338e4905a2684ca96e08c7780fc68412.png" height="420" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.npmjs.com/package/@kalimahapps/eslint-config" rel="noopener noreferrer" class="c-link"&gt;
          @kalimahapps/eslint-config - npm
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Comprehensive and configurable ESLint config for Vue 3 projects with TypeScript support. Latest version: 1.2.91, last published: 9 months ago. Start using &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-config in your project by running `npm i &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-config`. There is 1 other project in the npm registry using &lt;a class="mentioned-user" href="https://dev.to/kalimahapps"&gt;@kalimahapps&lt;/a&gt;/eslint-config.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic-production.npmjs.com%2Fb0f1a8318363185cc2ea6a40ac23eeb2.png" width="32" height="32"&gt;
        npmjs.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>html</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Adding inheritAttr in vue3 using setup with vite</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Sat, 11 Jun 2022 05:30:13 +0000</pubDate>
      <link>https://dev.to/kalimahapps/adding-inheritattr-in-vue3-2dj1</link>
      <guid>https://dev.to/kalimahapps/adding-inheritattr-in-vue3-2dj1</guid>
      <description>&lt;p&gt;When using vue3 composition API you can utilize setup in script tag to write less boilerplate code which makes it easy to maintain in future.&lt;/p&gt;

&lt;p&gt;All top-level bindings can be used directly used in the template tag. See this example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// variable&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&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="c1"&gt;// functions&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;log&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&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;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&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="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"log"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&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;While this is great in making code more readable it comes with downfalls. Most notable inability to disable &lt;a href="https://vuejs.org/guide/components/attrs.html" rel="noopener noreferrer"&gt;attribute inheritance&lt;/a&gt; inside script tag with setup attribute.&lt;/p&gt;

&lt;p&gt;So in order to disable attribute inheritance using setup you need to add two script tags.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// use normal &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;inheritAttrs&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// ...setup logic&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&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 works fine but it defies the purpose of writing less boilerplate code. &lt;/p&gt;

&lt;p&gt;Using &lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;vite&lt;/a&gt;, the amazing build tool, I developed a plugin that will enable you to omit the extra &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; declaration.&lt;/p&gt;

&lt;p&gt;The new syntax will be like&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;inherit-attrs=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// ...setup logic&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&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;And that's it. The plugin will add the second &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag automatically with &lt;code&gt;inheritAttrs: false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can find the plugin, installation and configuration steps here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kalimahapps" rel="noopener noreferrer"&gt;
        kalimahapps
      &lt;/a&gt; / &lt;a href="https://github.com/kalimahapps/vite-plugin-vue-setup-inherit-attrs" rel="noopener noreferrer"&gt;
        vite-plugin-vue-setup-inherit-attrs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Add inherit-attrs support for vue3 using vite
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;vite-plugin-vue-setup-inherit-attrs&lt;/h1&gt;
&lt;/div&gt;



&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Add support for inheritAttrs in vue-setup using vite&lt;/h3&gt;
&lt;/div&gt;



&lt;p&gt;
&lt;a href="https://www.npmjs.com/package/vite-plugin-vue-setup-inherit-attrs" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/f6d48440d01005e00c3b2ab3f700177f386415f58a57d28af01e400791c089e3/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f766974652d706c7567696e2d7675652d73657475702d696e68657269742d61747472732e737667"&gt;
&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/vite-plugin-vue-setup-inherit-attrs" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/b6df433b59d0f1babe1ee1ef79f2e34fd0d5b16b8f84379e287d64fc084be542/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f766974652d706c7567696e2d7675652d73657475702d696e68657269742d61747472732e737667"&gt;
&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/52a7acd2cbf019b26abb302b5797d5b081df07d161340da65eeaee57aee2240a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7675652d332d253233343262383833"&gt;&lt;img src="https://camo.githubusercontent.com/52a7acd2cbf019b26abb302b5797d5b081df07d161340da65eeaee57aee2240a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7675652d332d253233343262383833"&gt;&lt;/a&gt;

&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8a3aeee6cb211bfc40466cb96d9c14bf706e3a0f04251603cb128b651ca21e40/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d61682d617070732f766974652d706c7567696e2d7675652d73657475702d696e68657269742d61747472732e737667"&gt;&lt;img src="https://camo.githubusercontent.com/8a3aeee6cb211bfc40466cb96d9c14bf706e3a0f04251603cb128b651ca21e40/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d61682d617070732f766974652d706c7567696e2d7675652d73657475702d696e68657269742d61747472732e737667"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://twitter.com/KalimahApps" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/762a40c8731e7340375fdfba03a08c21682e4da23b39f5d63f046d05d388c2cb/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f4b616c696d6168417070733f7374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;[!WARNING] You don't need this plugin if you are using Vue 3.3+&lt;/p&gt;
&lt;p&gt;Use &lt;a href="https://vuejs.org/api/sfc-script-setup#defineoptions" rel="nofollow noopener noreferrer"&gt;defineOptions&lt;/a&gt; instead.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm install vite-plugin-vue-setup-inherit-attrs -D
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;In vite.config.ts import the plugin and add plugins array:&lt;/p&gt;

&lt;div class="highlight highlight-source-ts notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-s1"&gt;defineConfig&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-smi"&gt;Plugin&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'vite'&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;vue&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'@vitejs/plugin-vue'&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;inheritAttrs&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'vite-plugin-vue-setup-inherit-attrs'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-k"&gt;export&lt;/span&gt; &lt;span class="pl-k"&gt;default&lt;/span&gt; &lt;span class="pl-en"&gt;defineConfig&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-c1"&gt;plugins&lt;/span&gt;: &lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-en"&gt;vue&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-en"&gt;inheritAttrs&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;In vue template add &lt;code&gt;inherit-attrs="false"&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;template&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;class&lt;/span&gt;="&lt;span class="pl-s"&gt;root-element&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;class&lt;/span&gt;="&lt;span class="pl-s"&gt;nested-element&lt;/span&gt;" &lt;span class="pl-c1"&gt;v-bind&lt;/span&gt;="&lt;span class="pl-s"&gt;$attrs&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
          $attrs will be added to this element instead of the root element
      &lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;template&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;lang&lt;/span&gt;="&lt;span class="pl-s"&gt;ts&lt;/span&gt;" &lt;span class="pl-c1"&gt;setup&lt;/span&gt; &lt;span class="pl-c1"&gt;inherit-attrs&lt;/span&gt;="&lt;span class="pl-s"&gt;false&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-c"&gt;// code here&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

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

&lt;/div&gt;

&lt;p&gt;No config needed :)&lt;/p&gt;



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

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1.0.4&lt;/h3&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;Moved…&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kalimahapps/vite-plugin-vue-setup-inherit-attrs" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>vue</category>
      <category>vite</category>
      <category>vue3</category>
      <category>framework</category>
    </item>
    <item>
      <title>Trace activity in WordPress</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Sat, 26 Jun 2021 02:20:45 +0000</pubDate>
      <link>https://dev.to/kalimahapps/activity-logging-in-wordpress-3n02</link>
      <guid>https://dev.to/kalimahapps/activity-logging-in-wordpress-3n02</guid>
      <description>&lt;p&gt;One of the areas that WordPress lacks is logging user activity. In particular the activity of site admins and editors. This is a vital feature as it helps trace back any actions that have caused error or for general troubleshooting. &lt;/p&gt;

&lt;p&gt;An attempt has been made to fill this gap with a number of plugins. However, these plugins have some shortcomings make them not very useful (as I have experienced) when debugging errors. The plugins either provide full features for premium version, or generally do not display all the useful information when changes are logged.&lt;/p&gt;

&lt;p&gt;That is why I created Nashaat Activity Log plugin. This plugin will log information about most of the changes that occur in WordPress admin area. &lt;br&gt;
Here are some examples what the plugin logs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post changes (content, options, title, excerpt .. etc).&lt;/li&gt;
&lt;li&gt;Plugins and themes activation, deactivation, installation, removal and theme switch.&lt;/li&gt;
&lt;li&gt;Website updates (core, plugins and themes)&lt;/li&gt;
&lt;li&gt;Taxonomy changes&lt;/li&gt;
&lt;li&gt;Widget changes (order, adding or deleting)&lt;/li&gt;
&lt;li&gt;Users changes (profile changes, registration, removal)&lt;/li&gt;
&lt;li&gt;Login attempts. This is a very useful feature as the plugin records failed attempts with IP address. It will help detecting brute force attacks and possibly blocking the offending IP address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also many other areas where the plugin logs users activity.&lt;/p&gt;

&lt;p&gt;This is an example of how logs appear.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B61Ddgp1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jszyjwe3ehrn59lsptxe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B61Ddgp1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jszyjwe3ehrn59lsptxe.png" alt="Nashaat Activity Log display example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is an example of filtering:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1AuJCKbw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k24gu0gbjy1ljwg1rh75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1AuJCKbw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k24gu0gbjy1ljwg1rh75.png" alt="Nashaat Activity Log filtering example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;New features will be soon added. Currently I am working on adding support for WooCommerce changes (settings, products, tags .. etc). And later I am planning to add support for most popular plugins such as Yoast SEO, Gravity Forms, Advanced Custom Fields (ACF), WPForms, bbPress, Contact Form 7 and Easy Digital Downloads.&lt;/p&gt;

&lt;p&gt;To download the plugin you can search for Nashaat Activity Log from your WP plugins page and install it. Or you can download it from this link:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://wordpress.org/plugins/nashaat-activity-log/"&gt;https://wordpress.org/plugins/nashaat-activity-log/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If you face any issues please submit a question in the support forum: &lt;a href="https://wordpress.org/support/plugin/nashaat-activity-log/"&gt;https://wordpress.org/support/plugin/nashaat-activity-log/&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>log</category>
      <category>activity</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Enable Gutenberg editor in WooCommerce</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Fri, 12 Feb 2021 08:55:12 +0000</pubDate>
      <link>https://dev.to/kalimahapps/enable-gutenberg-editor-in-woocommerce-466m</link>
      <guid>https://dev.to/kalimahapps/enable-gutenberg-editor-in-woocommerce-466m</guid>
      <description>&lt;p&gt;WooCommerce 5.0 has recently been released with new features and improvements but sill no support for Gutenberg, WordPress block editor, while creating products. It is ironic since WooCommerce provides a number of good blocks that can be added to pages and posts but not in products.&lt;/p&gt;

&lt;p&gt;In this quick tutorial I will show you how to activate Gutenberg for products and resolve some of the issues that occur with this activation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE:&lt;/em&gt;&lt;/strong&gt; All code here can be added to functions.php file in your theme.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h1&gt;
  
  
  Enable block editor
&lt;/h1&gt;

&lt;p&gt;To enable Gutenberg you can use 'use_block_editor_for_post_type' filter by simply adding these lines:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;activate_gutenberg_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$can_edit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post_type&lt;/span&gt; &lt;span class="p"&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="nv"&gt;$post_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$can_edit&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="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$can_edit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'use_block_editor_for_post_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'activate_gutenberg_product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above code will enable the new editor for product post type but you will notice that categories and tags have disappeared.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Enable taxonomies
&lt;/h1&gt;

&lt;p&gt;WordPress custom post types have a argument 'show_in_rest' (available since 4.7.0) which enables the retrieval and modification of post type using REST API.&lt;/p&gt;

&lt;p&gt;Using 'woocommerce_taxonomy_args_product_cat' and 'woocommerce_taxonomy_args_product_tag' filters we can enable REST.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;enable_taxonomy_rest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'show_in_rest'&lt;/span&gt;&lt;span class="p"&gt;]&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="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce_taxonomy_args_product_cat'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enable_taxonomy_rest'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce_taxonomy_args_product_tag'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enable_taxonomy_rest'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;h1&gt;
  
  
  Catalog visibility
&lt;/h1&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%2Fsg0y1aadqwh96ydysn2d.png" 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%2Fsg0y1aadqwh96ydysn2d.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you enable Gutenberg editor, catalog visibility will not appear. This is because 'post_submitbox_misc_actions' action &lt;a href="https://github.com/WordPress/gutenberg/issues/12764" rel="noopener noreferrer"&gt;is not supported in Gutenberg editor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One way to resolve is to hook into Gutenberg slots like &lt;a href="https://developer.wordpress.org/block-editor/developers/slotfills/plugin-post-status-info/" rel="noopener noreferrer"&gt;PluginPostStatusInfo&lt;/a&gt; but that is a rocky road and which will require spending long hours and might not get you the required results.&lt;/p&gt;

&lt;p&gt;The easy way is to utilize WooCommerce built in functions to add this feature. And since WooCommerce JavaScript files are already loaded we don't have to do add any scripts, only the PHP part.&lt;/p&gt;

&lt;p&gt;First add a metabox:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register_catalog_meta_boxes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="nv"&gt;$current_screen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Make sure gutenberg is loaded before adding the metabox&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;method_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'is_block_editor'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$current_screen&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;is_block_editor&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="nf"&gt;add_meta_box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'catalog-visibility'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Catalog visibility'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'textdomain'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'product_data_visibility'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'side'&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="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'add_meta_boxes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'register_catalog_meta_boxes'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then we take add the function 'product_data_visibility' from &lt;a href="https://github.com/woocommerce/woocommerce/blob/master/includes/admin/class-wc-admin-post-types.php#L656" rel="noopener noreferrer"&gt;WooCommerce source&lt;/a&gt; with few changes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;product_data_visibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;$thepostid&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$product_object&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$thepostid&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;wc_get_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$thepostid&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WC_Product&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$product_object&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_catalog_visibility&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$current_featured&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wc_bool_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$product_object&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_featured&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$visibility_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wc_get_product_visibility_options&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="cp"&gt;?&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;"misc-pub-section"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"catalog-visibility"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Catalog visibility:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"catalog-visibility-display"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$visibility_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$visibility_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&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="s1"&gt;'yes'&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;$current_featured&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;', '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#catalog-visibility"&lt;/span&gt;
       &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"edit-catalog-visibility hide-if-no-js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Edit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"catalog-visibility-select"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hide-if-js"&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;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"current_visibility"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"current_visibility"&lt;/span&gt;
               &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="s"&gt;"&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;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"current_featured"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"current_featured"&lt;/span&gt;
               &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_featured&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;p&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'This setting determines which shop pages products will be listed on.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$visibility_options&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;input type="radio" name="_visibility" id="_visibility_'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" value="'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$name&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="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' data-label="'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" /&amp;gt; &amp;lt;label for="_visibility_'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" class="selectit"&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/label&amp;gt;&amp;lt;br /&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;br /&amp;gt;&amp;lt;input type="checkbox" name="_featured" id="_featured" '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_featured&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'yes'&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="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' /&amp;gt; &amp;lt;label for="_featured"&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'This is a featured product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/label&amp;gt;&amp;lt;br /&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#catalog-visibility"&lt;/span&gt;
               &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"save-post-visibility hide-if-no-js button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'OK'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#catalog-visibility"&lt;/span&gt;
               &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"cancel-post-visibility hide-if-no-js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Cancel'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/p&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&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;h1&gt;
  
  
  Reverting back to classic editor (temporarily)
&lt;/h1&gt;

&lt;p&gt;If you want to revert back to the classic editor, for any reason, here is a trick.&lt;/p&gt;

&lt;p&gt;Change 'activate_gutenberg_product' function to this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;activate_gutenberg_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$can_edit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post_type&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$disable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'classic-editor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;array_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$_GET&lt;/span&gt; &lt;span class="p"&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="nv"&gt;$post_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$disable&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="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$can_edit&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="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$can_edit&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;Now if you include &lt;code&gt;&amp;amp;classic-editor&lt;/code&gt; in WordPress admin url the classic editor will be loaded.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Full code
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;activate_gutenberg_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$can_edit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post_type&lt;/span&gt; &lt;span class="p"&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="nv"&gt;$post_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$can_edit&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="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$can_edit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'use_block_editor_for_post_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'activate_gutenberg_product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&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="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;enable_taxonomy_rest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'show_in_rest'&lt;/span&gt;&lt;span class="p"&gt;]&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="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce_taxonomy_args_product_cat'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enable_taxonomy_rest'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce_taxonomy_args_product_tag'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enable_taxonomy_rest'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register_catalog_meta_boxes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="nv"&gt;$current_screen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Make sure gutenberg is loaded before adding the metabox&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;method_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'is_block_editor'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$current_screen&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;is_block_editor&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="nf"&gt;add_meta_box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'catalog-visibility'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Catalog visibility'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'textdomain'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'product_data_visibility'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'side'&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="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'add_meta_boxes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'register_catalog_meta_boxes'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;product_data_visibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;$thepostid&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$product_object&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$thepostid&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;wc_get_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$thepostid&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WC_Product&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$product_object&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_catalog_visibility&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$current_featured&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wc_bool_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$product_object&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_featured&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$visibility_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wc_get_product_visibility_options&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="cp"&gt;?&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;"misc-pub-section"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"catalog-visibility"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Catalog visibility:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"catalog-visibility-display"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$visibility_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$visibility_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&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="s1"&gt;'yes'&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;$current_featured&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;', '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#catalog-visibility"&lt;/span&gt;
       &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"edit-catalog-visibility hide-if-no-js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Edit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"catalog-visibility-select"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hide-if-js"&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;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"current_visibility"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"current_visibility"&lt;/span&gt;
               &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="s"&gt;"&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;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"current_featured"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"current_featured"&lt;/span&gt;
               &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_featured&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;p&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'This setting determines which shop pages products will be listed on.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$visibility_options&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;input type="radio" name="_visibility" id="_visibility_'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" value="'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_visibility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$name&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="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' data-label="'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" /&amp;gt; &amp;lt;label for="_visibility_'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'" class="selectit"&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/label&amp;gt;&amp;lt;br /&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;br /&amp;gt;&amp;lt;input type="checkbox" name="_featured" id="_featured" '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$current_featured&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'yes'&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="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' /&amp;gt; &amp;lt;label for="_featured"&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;esc_html__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'This is a featured product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/label&amp;gt;&amp;lt;br /&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#catalog-visibility"&lt;/span&gt;
               &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"save-post-visibility hide-if-no-js button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'OK'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#catalog-visibility"&lt;/span&gt;
               &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"cancel-post-visibility hide-if-no-js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nf"&gt;esc_html_e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Cancel'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'woocommerce'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/p&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&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Hopefully this was an easy and useful tutorial. &lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>woocommerce</category>
      <category>gutenberg</category>
      <category>webdev</category>
    </item>
    <item>
      <title>8 tools to help with CSS</title>
      <dc:creator>Kalimah Apps</dc:creator>
      <pubDate>Sat, 06 Feb 2021 01:44:33 +0000</pubDate>
      <link>https://dev.to/kalimahapps/8-tools-to-improve-css-design-3lcg</link>
      <guid>https://dev.to/kalimahapps/8-tools-to-improve-css-design-3lcg</guid>
      <description>&lt;p&gt;While CSS is not a complicated language, some parts of it were a mystery to me when I started learning it. For example combining multiple box-shadow or background-image attributes. That's why I designed these playgrounds to make working with CSS easier and more productive.&lt;/p&gt;

&lt;p&gt;Here are the 8 playgrounds you can use to improve CSS productivity. &lt;/p&gt;

&lt;h1&gt;
  
  
  1- Cursor property
&lt;/h1&gt;

&lt;p&gt;Starting with an easy one. You can check out the different values for the cursor property. Hover on each box and see what the cursor would look like in your browser.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/GwLXGv?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  2- Filter property playground
&lt;/h1&gt;

&lt;p&gt;This playground helps visualizing what different filter values do. You can stack different filters, modify their values and get the CSS code ready to be used. &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/GwdaEG?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  3- Transform property playground
&lt;/h1&gt;

&lt;p&gt;Demystify another CSS property. Since each value affect the subsequent transforms values, this CSS property could be confusing to manage. With this playground you can add a stack of transforms, set transform-origin and get the CSS code.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/RqJddX?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  4- Box shadow generator
&lt;/h1&gt;

&lt;p&gt;Using shadows in your design is a great option, if done properly. This what the box shadow generator does. You can add a stack of box shadows then get the generated CSS.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/yQGaOL?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  5- :nth-selector
&lt;/h1&gt;

&lt;p&gt;CSS provide great selector options to target specific elements. This is the case with :nth-selectors (nth-child and nth-of-type). While they are extremely useful in many cases, their use is somewhat hard to figure out. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://nthmaster.com/"&gt;http://nthmaster.com/&lt;/a&gt; website provide great examples on how to use them, the visuals however are not that good. Use this pen to see how different selectors work live. &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/bGNGOmR?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  6 - Border radius generator
&lt;/h1&gt;

&lt;p&gt;border-radius property is not difficult to grasp at first. But once 8 values are used instead of 4 it might be confusing.&lt;br&gt;
Not sure what I am talking about?! Check out this pen and disable simple mode.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/EOOVvV?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  7- Gradient generator
&lt;/h1&gt;

&lt;p&gt;There are no shortages of gradient generators, but none a one stop gradient generator. Some lack a good user interface or don't provide enough options.&lt;/p&gt;

&lt;p&gt;This tool provides an intuitive and a "complete" generator. It has 500+ presets and you can control almost all gradient aspects such colors, size, shape, type and even stack multiple gradients. &lt;/p&gt;

&lt;p&gt;Make sure you click on info button to get more information about the tool and how to use it.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/RENwGK?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  8- Palette generator
&lt;/h1&gt;

&lt;p&gt;This tool does not generate values for a CSS property but rather a complementary tool to assets with color combination. &lt;/p&gt;

&lt;p&gt;This generator resolves the shortcomings of available palette generators. It has a nice user interface with live view of color combination. It also includes a color theory section to help designers understand how color matching works.&lt;/p&gt;

&lt;p&gt;It also provides a set of keyboard/mouse shortcuts to make the process as seamless and easy as passible. &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khr2003/embed/rNObwwB?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>css</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
