<?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: Joseph Horace</title>
    <description>The latest articles on DEV Community by Joseph Horace (@josephhorace).</description>
    <link>https://dev.to/josephhorace</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%2F1779272%2F253fc3c0-e635-4af9-ac03-9a31a1c09c42.png</url>
      <title>DEV Community: Joseph Horace</title>
      <link>https://dev.to/josephhorace</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josephhorace"/>
    <language>en</language>
    <item>
      <title>Compare npm Downloads and GitHub Stars with NPMStars by BasicUtils</title>
      <dc:creator>Joseph Horace</dc:creator>
      <pubDate>Thu, 15 May 2025 15:33:11 +0000</pubDate>
      <link>https://dev.to/josephhorace/instantly-compare-npm-downloads-and-github-stars-with-npmstars-c5p</link>
      <guid>https://dev.to/josephhorace/instantly-compare-npm-downloads-and-github-stars-with-npmstars-c5p</guid>
      <description>&lt;p&gt;As developers, we’ve all asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Is this package actually popular?"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;"How does it compare to similar libraries?"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;"Is this project actively gaining traction on GitHub?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem is — our signals are scattered.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;npm&lt;/strong&gt; shows downloads.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; shows stars and contributions.&lt;br&gt;&lt;br&gt;
But there's no easy way to view both &lt;strong&gt;side-by-side&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s exactly why I built &lt;strong&gt;&lt;a href="https://basicutils.com/npmstars" rel="noopener noreferrer"&gt;NpmStars&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What Is NpmStars?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NpmStars&lt;/strong&gt; is a fast, no-login tool that connects the dots between a package’s &lt;strong&gt;npm downloads&lt;/strong&gt; and its &lt;strong&gt;GitHub popularity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It gives you a single dashboard to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 Track &lt;strong&gt;npm downloads&lt;/strong&gt; — daily, weekly, monthly, and total
&lt;/li&gt;
&lt;li&gt;⭐ Visualize &lt;strong&gt;GitHub star growth&lt;/strong&gt; over time
&lt;/li&gt;
&lt;li&gt;📊 View &lt;strong&gt;side-by-side comparison graphs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Share or embed&lt;/strong&gt; trend snapshots anywhere
&lt;/li&gt;
&lt;li&gt;🧠 No API key, no setup — just search and go&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 npmtrends vs star-history vs NpmStars
&lt;/h2&gt;

&lt;p&gt;You may have used tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.npmtrends.com/" rel="noopener noreferrer"&gt;npmtrends.com&lt;/a&gt;&lt;/strong&gt; — great for comparing download counts
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://star-history.com/" rel="noopener noreferrer"&gt;star-history.com&lt;/a&gt;&lt;/strong&gt; — great for visualizing GitHub stars over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But these tools only show &lt;strong&gt;half the story&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
You need to bounce between tabs, retype package names, and mentally combine the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  That’s where &lt;strong&gt;NpmStars&lt;/strong&gt; stands out:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;npmtrends&lt;/th&gt;
&lt;th&gt;star-history&lt;/th&gt;
&lt;th&gt;NpmStars ✅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;npm downloads comparison&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub star growth&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Combined dashboard view&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No login / fast search&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With &lt;strong&gt;NpmStars&lt;/strong&gt;, you get both perspectives — together — in seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why This Matters
&lt;/h2&gt;

&lt;p&gt;A package might have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📈 High downloads but stagnant stars (legacy usage)
&lt;/li&gt;
&lt;li&gt;🌱 Low downloads but fast-rising stars (emerging trend)
&lt;/li&gt;
&lt;li&gt;🛑 Or it may be downloaded often but poorly maintained&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When you can see both npm and GitHub data in one view&lt;/strong&gt;, you get the full picture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Spot rising libraries early
&lt;/li&gt;
&lt;li&gt;✅ Pick tools with momentum
&lt;/li&gt;
&lt;li&gt;✅ Back up decisions with real-world signals&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Real-World Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔍 Compare libraries like &lt;code&gt;zustand&lt;/code&gt; vs &lt;code&gt;jotai&lt;/code&gt; or &lt;code&gt;vite&lt;/code&gt; vs &lt;code&gt;webpack&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📈 Track the health of your favorite open-source tools
&lt;/li&gt;
&lt;li&gt;📚 Use embedded graphs in blog posts or documentation
&lt;/li&gt;
&lt;li&gt;🧠 Make smarter picks for client or team projects&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Try It Now
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://basicutils.com/npmstars" rel="noopener noreferrer"&gt;Visit NpmStars&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Start with any package — &lt;code&gt;tailwindcss&lt;/code&gt;, &lt;code&gt;express&lt;/code&gt;, &lt;code&gt;shadcn/ui&lt;/code&gt;, or your own.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 I’d Love Your Feedback!
&lt;/h2&gt;

&lt;p&gt;If you find NpmStars helpful — share it, write about it, or let me know what could make it better.&lt;br&gt;&lt;br&gt;
Let’s make evaluating packages faster and smarter 💡&lt;/p&gt;

&lt;p&gt;More tools at &lt;a href="https://basicutils.com" rel="noopener noreferrer"&gt;basicutils.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>github</category>
      <category>npmtrends</category>
      <category>starhistory</category>
    </item>
    <item>
      <title>Adding and Customizing Tables in React Quill</title>
      <dc:creator>Joseph Horace</dc:creator>
      <pubDate>Sat, 11 Jan 2025 19:22:48 +0000</pubDate>
      <link>https://dev.to/josephhorace/adding-and-customizing-tables-in-react-quill-25lp</link>
      <guid>https://dev.to/josephhorace/adding-and-customizing-tables-in-react-quill-25lp</guid>
      <description>&lt;p&gt;Tables are essential for structuring information in content editors. While React Quill, a React wrapper for QuillJS, is robust and extensible, it lacks built-in table support. This guide will show you how to integrate and customize table functionality in React Quill using third-party modules and configurations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Use Tables in a Rich Text Editor?
&lt;/h2&gt;

&lt;p&gt;Tables allow users to present data clearly and visually within content. They are particularly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizing and comparing information.&lt;/li&gt;
&lt;li&gt;Structuring layouts for reports, blogs, or technical documentation.&lt;/li&gt;
&lt;li&gt;Enhancing overall content readability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Integrating table support into React Quill extends its utility for users managing structured data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up React Quill
&lt;/h2&gt;

&lt;p&gt;Begin by installing React Quill into your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-quill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import and configure React Quill in your component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactQuill&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-quill&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-quill/dist/quill.snow.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactQuill&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"snow"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Editor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adding Table Support with &lt;code&gt;quill-table&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;To add table functionality, use the &lt;code&gt;quill-table&lt;/code&gt; module.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install the Module
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;quill-table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure the Table Module
&lt;/h3&gt;

&lt;p&gt;Import and register the table module with Quill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactQuill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Quill&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-quill&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-quill/dist/quill.snow.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quill-table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quill-table/dist/quill.table.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Quill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;modules/table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EditorWithTable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;italic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;underline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ordered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bullet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactQuill&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"snow"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;modules&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;EditorWithTable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Toolbar Buttons
&lt;/h3&gt;

&lt;p&gt;The toolbar configuration includes a &lt;code&gt;table&lt;/code&gt; button, enabling users to insert and edit tables directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing Table Styles
&lt;/h2&gt;

&lt;p&gt;Use CSS to style tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.ql-table&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ddd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.ql-table&lt;/span&gt; &lt;span class="nt"&gt;th&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f4f4f4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&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;
  
  
  Extracting and Managing Table Data
&lt;/h2&gt;

&lt;p&gt;React Quill outputs HTML content. To extract and manage table data, parse the editor's value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extractTablesFromHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parser&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;DOMParser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerHTML&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSave&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tableData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extractTablesFromHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Extracted Tables:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tableData&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;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Adding table support to React Quill enhances its functionality, making it more versatile for users who need structured content. The &lt;code&gt;quill-table&lt;/code&gt; module provides tools for inserting and managing tables, while custom CSS and event handling enable further customization. With these steps, you can create a rich text editor tailored to your application's needs.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/zenoamaro/react-quill" rel="noopener noreferrer"&gt;React Quill Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://quilljs.com" rel="noopener noreferrer"&gt;QuillJS Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/surmon-china/quill-table" rel="noopener noreferrer"&gt;Quill Table Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://basicutils.com/learn/quilljs/react-quill-tutorial" rel="noopener noreferrer"&gt;React Quill&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>react</category>
      <category>quill</category>
      <category>reactquill</category>
      <category>editor</category>
    </item>
    <item>
      <title>Exploring GitHub Workflow Dispatch: Take Full Control of Your CI/CD Pipelines</title>
      <dc:creator>Joseph Horace</dc:creator>
      <pubDate>Sat, 14 Dec 2024 06:07:12 +0000</pubDate>
      <link>https://dev.to/josephhorace/exploring-github-workflow-dispatch-take-full-control-of-your-cicd-pipelines-3hck</link>
      <guid>https://dev.to/josephhorace/exploring-github-workflow-dispatch-take-full-control-of-your-cicd-pipelines-3hck</guid>
      <description>&lt;p&gt;GitHub Actions has revolutionized Continuous Integration/Continuous Deployment (CI/CD) by enabling developers to automate their workflows. Among its many powerful features, Workflow Dispatch stands out as a flexible trigger that allows you to manually execute workflows with customized parameters. This article dives into what Workflow Dispatch is and how you can leverage it to enhance your automation process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GitHub Workflow Dispatch?
&lt;/h2&gt;

&lt;p&gt;Workflow Dispatch is a trigger in GitHub Actions that allows you to manually start a workflow. Unlike automatic triggers (e.g., push, pull_request), Workflow Dispatch is invoked on demand, making it ideal for situations where:&lt;/p&gt;

&lt;p&gt;You need human oversight before execution.&lt;/p&gt;

&lt;p&gt;The workflow requires specific input parameters.&lt;/p&gt;

&lt;p&gt;You want to test workflows in a controlled environment.&lt;/p&gt;

&lt;p&gt;This feature is especially useful for deployments, feature toggles, and ad hoc tasks that don’t fit into scheduled or event-based automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up a Workflow Dispatch
&lt;/h2&gt;

&lt;p&gt;Here’s how you can add Workflow Dispatch to your GitHub Actions workflow:&lt;/p&gt;

&lt;p&gt;Define the Workflow File: Add workflow_dispatch as an on event in your .github/workflows/.yml file.&lt;/p&gt;

&lt;p&gt;Add Input Parameters (Optional): Specify any inputs required for the workflow.&lt;/p&gt;

&lt;p&gt;Below is an example workflow file:&lt;br&gt;
`name: Manual Trigger Example&lt;/p&gt;

&lt;p&gt;on:&lt;br&gt;
  workflow_dispatch:&lt;br&gt;
    inputs:&lt;br&gt;
      environment:&lt;br&gt;
        description: 'Select the environment'&lt;br&gt;
        required: true&lt;br&gt;
        default: 'staging'&lt;br&gt;
      version:&lt;br&gt;
        description: 'Version to deploy'&lt;br&gt;
        required: true&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  deploy:&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - name: Checkout Code
    uses: actions/checkout@v3

  - name: Deploy to ${{ github.event.inputs.environment }}
    run: |
      echo "Deploying version ${{ github.event.inputs.version }} to ${{ github.event.inputs.environment }} environment."`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In this example:&lt;/p&gt;

&lt;p&gt;The environment and version inputs are required for the workflow.&lt;/p&gt;

&lt;p&gt;The workflow uses these inputs to control the deployment logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running a Workflow Dispatch
&lt;/h2&gt;

&lt;p&gt;To manually trigger a workflow:&lt;/p&gt;

&lt;p&gt;Go to the Actions tab of your GitHub repository.&lt;/p&gt;

&lt;p&gt;Select the workflow you want to run.&lt;/p&gt;

&lt;p&gt;Click Run workflow in the top-right corner.&lt;/p&gt;

&lt;p&gt;Fill in any input parameters if required, and confirm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;Ad Hoc Deployments: Trigger deployments manually to specific environments, like staging or production.&lt;/p&gt;

&lt;p&gt;Feature Flags: Enable or disable features by running a workflow that updates configuration files or toggles flags.&lt;/p&gt;

&lt;p&gt;Custom Scripts: Execute maintenance scripts, data migrations, or one-time tasks with input parameters.&lt;/p&gt;

&lt;p&gt;Debugging: Test workflows in a controlled manner without relying on automated triggers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Workflow Dispatch?
&lt;/h2&gt;

&lt;p&gt;Flexibility: Gives you the power to decide when and how a workflow runs.&lt;/p&gt;

&lt;p&gt;Customization: Input parameters let you tailor workflows to specific tasks or environments.&lt;/p&gt;

&lt;p&gt;Control: Adds a layer of human oversight, reducing the risk of errors in automated workflows.&lt;br&gt;
Best Practices&lt;br&gt;
Validation: Validate input parameters within the workflow to avoid runtime errors.&lt;/p&gt;

&lt;p&gt;Security: Limit access to workflows by setting appropriate repository permissions.&lt;/p&gt;

&lt;p&gt;Documentation: Clearly document the purpose and usage of each workflow in your repository’s README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn More
&lt;/h2&gt;

&lt;p&gt;For a deeper dive into the mechanics of GitHub Actions and Workflow Dispatch, check out our detailed guide: &lt;a href="https://basicutils.com/blog/understanding_github_actions_workflow_dispatch2" rel="noopener noreferrer"&gt;Understanding GitHub Actions Workflow Dispatch&lt;/a&gt;&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>github</category>
      <category>devops</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Unveiling the Secrets of Your Photos: Discovering GPS Locations</title>
      <dc:creator>Joseph Horace</dc:creator>
      <pubDate>Sat, 14 Dec 2024 05:54:10 +0000</pubDate>
      <link>https://dev.to/josephhorace/unveiling-the-secrets-of-your-photos-discovering-gps-locations-27h1</link>
      <guid>https://dev.to/josephhorace/unveiling-the-secrets-of-your-photos-discovering-gps-locations-27h1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever wondered where exactly a photo was taken? Whether you're reminiscing about a vacation or analyzing old pictures, your photos could hold hidden clues about their origins. Thanks to modern technology, many images carry GPS metadata, allowing us to trace their geographic roots. In this article, we’ll explore how GPS photo locations work and how you can uncover these details easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GPS Metadata in Photos?
&lt;/h2&gt;

&lt;p&gt;When you take a photo using a smartphone or a GPS-enabled camera, it often embeds metadata known as EXIF data into the image file. EXIF (Exchangeable Image File Format) contains information such as:&lt;/p&gt;

&lt;p&gt;Camera settings (e.g., ISO, aperture, shutter speed)&lt;/p&gt;

&lt;p&gt;Date and time of the photo&lt;/p&gt;

&lt;p&gt;GPS coordinates (latitude, longitude, and sometimes altitude)&lt;/p&gt;

&lt;p&gt;These GPS coordinates can pinpoint the location where the photo was captured. This feature is especially useful for travelers, researchers, and anyone who wants to revisit the memories tied to a specific place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Extract GPS Data from Photos?
&lt;/h2&gt;

&lt;p&gt;Here are some practical uses for extracting GPS data from photos:&lt;/p&gt;

&lt;p&gt;Trip Memories: Relive your travel adventures by mapping out your photo locations.&lt;/p&gt;

&lt;p&gt;Forensics and Investigations: Useful for law enforcement or private investigations.&lt;/p&gt;

&lt;p&gt;Content Creation: Geotagged photos help bloggers and content creators add context to their stories.&lt;/p&gt;

&lt;p&gt;Data Organization: Organize your photo library by location for quick access.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Extract GPS Location from Photos
&lt;/h2&gt;

&lt;p&gt;xtracting GPS metadata might sound technical, but it’s straightforward with the right tools. There exists several such tools online.&lt;/p&gt;

&lt;p&gt;Steps to Extract GPS Data Using Pic2Map:&lt;/p&gt;

&lt;p&gt;Upload your photo (JPEG format with EXIF data).&lt;/p&gt;

&lt;p&gt;Let the tool analyze the image.&lt;/p&gt;

&lt;p&gt;View the GPS coordinates and location on an interactive map.&lt;/p&gt;

&lt;p&gt;Pic2Map streamlines the process, requiring no technical expertise to reveal the hidden geotags in your images.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Considerations
&lt;/h2&gt;

&lt;p&gt;While GPS metadata can be incredibly useful, there are some caveats:&lt;/p&gt;

&lt;p&gt;Privacy Concerns: GPS data may reveal sensitive information. Always check metadata before sharing photos online.&lt;/p&gt;

&lt;p&gt;Image Compression: Some platforms, like social media sites, strip metadata when photos are uploaded to save space and protect privacy.&lt;/p&gt;

&lt;p&gt;Not Always Enabled: Ensure your camera’s GPS feature is activated if you want to save location data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;GPS metadata in photos is a treasure trove of information, offering a window into the exact locations behind your memories. Tools like &lt;a href="https://basicutils.com/pic2map" rel="noopener noreferrer"&gt;BasicUtils Pic2Map&lt;/a&gt; make it easier than ever to uncover these details, providing value to travelers, investigators, and creatives alike.&lt;/p&gt;

&lt;p&gt;The next time you sift through your photo library, take a moment to unlock the hidden stories embedded in your images. You might just rediscover places you’ve forgotten about or learn something new about your favorite snapshots.&lt;/p&gt;

</description>
      <category>gps</category>
      <category>productivity</category>
      <category>api</category>
    </item>
  </channel>
</rss>
