<?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: Mahmoud shahin</title>
    <description>The latest articles on DEV Community by Mahmoud shahin (@mahmoudshahin1111).</description>
    <link>https://dev.to/mahmoudshahin1111</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%2F619626%2F2ddf88c1-e162-4581-84e0-2f4b78a6b960.png</url>
      <title>DEV Community: Mahmoud shahin</title>
      <link>https://dev.to/mahmoudshahin1111</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahmoudshahin1111"/>
    <language>en</language>
    <item>
      <title>I Built a Tiny State Management Library in TypeScript atostate</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Sun, 04 Jan 2026 02:07:57 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/i-built-a-tiny-state-management-library-in-typescript-atostate-hip</link>
      <guid>https://dev.to/mahmoudshahin1111/i-built-a-tiny-state-management-library-in-typescript-atostate-hip</guid>
      <description>&lt;p&gt;State management is one of those topics every frontend developer eventually bumps into.&lt;/p&gt;

&lt;p&gt;At first, everything is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local state&lt;/li&gt;
&lt;li&gt;props&lt;/li&gt;
&lt;li&gt;maybe a few shared variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the app grows…&lt;br&gt;
and suddenly state is everywhere, duplicated, out of sync, and hard to reason about.&lt;/p&gt;

&lt;p&gt;Big libraries solve this but often with &lt;strong&gt;boilerplate, mental overhead, or framework lock-in&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I decided to build my own minimal solution.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;atostate&lt;/strong&gt; 👋&lt;/p&gt;


&lt;h2&gt;
  
  
  What is atostate?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;atostate&lt;/strong&gt; is a &lt;strong&gt;tiny tool state management library&lt;/strong&gt; for JavaScript and TypeScript.&lt;/p&gt;

&lt;p&gt;Its goal is very simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Provide a predictable global store with subscriptions and strong typing without complexity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No framework assumptions.&lt;br&gt;
No magic.&lt;br&gt;
Just state + rules.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I wanted a library that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is &lt;strong&gt;small and readable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Works in &lt;strong&gt;vanilla JS or TS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Doesn’t force Redux-style architecture&lt;/li&gt;
&lt;li&gt;Is easy to debug and reason about&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Creating a store
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createStore&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;atostate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That’s it.&lt;br&gt;
You now have a global store.&lt;/p&gt;


&lt;h2&gt;
  
  
  Updating state
&lt;/h2&gt;

&lt;p&gt;State updates are explicit and predictable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&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="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No direct mutation.&lt;br&gt;
No hidden side effects.&lt;/p&gt;


&lt;h2&gt;
  
  
  Subscribing to changes
&lt;/h2&gt;

&lt;p&gt;Subscribe to &lt;strong&gt;all state changes&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;State changed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getState&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;Or subscribe to &lt;strong&gt;only what you care about&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;Count changed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;→&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes updates efficient and intentional.&lt;/p&gt;




&lt;h2&gt;
  
  
  Selectors + equality checks
&lt;/h2&gt;

&lt;p&gt;Subscriptions only re-run when their selected slice actually changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;shallowEqual&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;atostate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;User changed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;shallowEqual&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No unnecessary re-runs.&lt;br&gt;
No wasted work.&lt;/p&gt;


&lt;h2&gt;
  
  
  Actions: organizing logic cleanly
&lt;/h2&gt;

&lt;p&gt;To keep logic out of UI code, atostate provides a lightweight &lt;strong&gt;actions API&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;setState&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="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&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="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, explicit, and easy to test.&lt;/p&gt;




&lt;h2&gt;
  
  
  Optional Redux-style reducers
&lt;/h2&gt;

&lt;p&gt;If you like reducers and &lt;code&gt;dispatch&lt;/code&gt;, atostate supports that too &lt;strong&gt;optionally&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;set&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;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;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inc&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;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;set&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;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;action&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="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="o"&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="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;reducer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it only if you want it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Middleware support
&lt;/h2&gt;

&lt;p&gt;Cross-cutting concerns are handled via middleware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logger
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;loggerMiddleware&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;atostate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;loggerMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Persistence
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;persistMiddleware&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;atostate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;persistMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  TypeScript-first
&lt;/h2&gt;

&lt;p&gt;atostate is written &lt;strong&gt;entirely in TypeScript&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typed state&lt;/li&gt;
&lt;li&gt;Typed actions&lt;/li&gt;
&lt;li&gt;Typed selectors&lt;/li&gt;
&lt;li&gt;Great autocomplete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No &lt;code&gt;any&lt;/code&gt;. No guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What atostate is &lt;em&gt;not&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;atostate intentionally avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework-specific APIs&lt;/li&gt;
&lt;li&gt;Heavy abstractions&lt;/li&gt;
&lt;li&gt;Hidden reactivity&lt;/li&gt;
&lt;li&gt;Large surface area&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a &lt;strong&gt;core state engine&lt;/strong&gt;, not a full framework.&lt;/p&gt;




&lt;h2&gt;
  
  
  When should you use it?
&lt;/h2&gt;

&lt;p&gt;atostate is a good fit if you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A small global store&lt;/li&gt;
&lt;li&gt;Shared state across components&lt;/li&gt;
&lt;li&gt;Strong typing&lt;/li&gt;
&lt;li&gt;Minimal learning curve&lt;/li&gt;
&lt;li&gt;Full control over architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you enjoy understanding how your tools work and don’t want unnecessary complexity you might enjoy using it.&lt;/p&gt;

&lt;p&gt;Feedback, ideas, and PRs are very welcome 🙌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>Tonada - A new UI library</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Sun, 02 Oct 2022 19:15:31 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/tonada-a-new-ui-library-53ck</link>
      <guid>https://dev.to/mahmoudshahin1111/tonada-a-new-ui-library-53ck</guid>
      <description>&lt;p&gt;All the new libraries focus on building a UI component for the most popular frameworks but what about the native javascript is it dead what if I am a developer who doesn't like to use react or angular or whatever of those amazing front-end frameworks? Then the best solution is to use something like jQuery or bootstrap or Tonada but why I need to use Tonada because it's a lightweight library that gives you a great performance and this will reflect on your website's visitors and SEO tools, and its easy to use as well.&lt;br&gt;
Support us by sharing, and contributing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br&gt;
We going to import the style files for the components we will use and let's assume we will use all the components and then import the index style file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;!-- Import all the styles --&amp;gt;
    &amp;lt;link rel="stylesheet" href="https://unpkg.com/tonada/dist/css/index.css" /&amp;gt;
    &amp;lt;!-- Or what you going to use only and i will use input style --&amp;gt;
    &amp;lt;link rel="stylesheet" href="https://unpkg.com/tonada/dist/css/input.css" /&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id="element" class="floating-label"&amp;gt;
      &amp;lt;input class="tonada-input" type="text" name="name" placeholder="Name" /&amp;gt;
      &amp;lt;label for=""&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;!-- (Required) ⛔ --&amp;gt;
    &amp;lt;script src="https://unpkg.com/tonada/dist/js/runtime.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="https://unpkg.com/tonada/dist/js/shared.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="https://unpkg.com/tonada/dist/js/index.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;!-- I Going to import the Input only--&amp;gt;
    &amp;lt;script src="https://unpkg.com/tonada/dist/js/input.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
      const input = Tonada.create("input", document.querySelector("#element"));
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more &lt;a href="https://mahmoudshahin1111.github.io/tonada/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>npm</category>
    </item>
    <item>
      <title>What is the Disposable email ?</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Sun, 17 Apr 2022 15:04:26 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/what-is-the-disposable-email--38ol</link>
      <guid>https://dev.to/mahmoudshahin1111/what-is-the-disposable-email--38ol</guid>
      <description>&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%2Feoo4ihjggojrhpf11zxc.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%2Feoo4ihjggojrhpf11zxc.png" alt="logo" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you tired from the spam and searching about an email to register to got an offer either then you need a Disposable Email Or in another name a temporary email and goodbye for the spam and email hacking&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%2Fh5e6q5h3xy0ictxtwtf3.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%2Fh5e6q5h3xy0ictxtwtf3.png" alt="spam" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait,What Is Temporary Email and Why Would I Need It?&lt;/p&gt;

&lt;p&gt;Disposable email is a service provided to a registered user for a given period of time, using a temporary address. It should be distinguished from a disposable email address, which simply forwards messages to a primary email account and is often called an alias.Disposable email is also known as temporary email and throw-away email.&lt;/p&gt;

&lt;p&gt;This sounds awesome! So how does it work?&lt;br&gt;
Temporary email addresses have the same flow that any normal email addresses would have, with a few key differences. To help understand these key differences, let's look at the basics of regular, and temporary email.&lt;/p&gt;

&lt;p&gt;Standard, permanent email:&lt;/p&gt;

&lt;p&gt;Find an email service such as gmail, outlook, yahoo, etc.&lt;br&gt;
Register for an account by filling out all of your personal info&lt;br&gt;
Find a username that hasn't been taken, something like &lt;a href="mailto:test2111@gmail.com"&gt;test2111@gmail.com&lt;/a&gt;&lt;br&gt;
Use this email address everywhere&lt;br&gt;
Temporary email:&lt;/p&gt;

&lt;p&gt;Find a service offering disposable email address (hint, you can use &lt;a href="https://tempomail.top" rel="noopener noreferrer"&gt;https://tempomail.top&lt;/a&gt;)&lt;br&gt;
The service generates a (usually) random email address for you to use&lt;br&gt;
Copy the address and use it wherever you'd normally use an email address&lt;br&gt;
Go back to the service and wait for your incoming email the same way you'd normally check for an email&lt;br&gt;
Do your business and walk away, never looking back&lt;br&gt;
So, now we have a high level overview of the differences between temporary email and regular email&lt;/p&gt;

&lt;p&gt;let ‘s know how we can use Tempo mail&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%2F2c6jtln2l9lethqndh8y.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%2F2c6jtln2l9lethqndh8y.png" alt="tempomail.top" width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
1- open &lt;a href="https://tempomail.top" rel="noopener noreferrer"&gt;https://tempomail.top&lt;/a&gt;&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%2Fih4jqcvgi8a51cjkli46.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%2Fih4jqcvgi8a51cjkli46.png" alt="tempomail.top" width="800" height="204"&gt;&lt;/a&gt;&lt;br&gt;
2- you will got an free email you can use it immediately anywhere you want and any time&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%2Fze7zcdj4u9fxwx0qenut.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%2Fze7zcdj4u9fxwx0qenut.png" alt="tempomail.top" width="800" height="443"&gt;&lt;/a&gt;&lt;br&gt;
3- and when you get any messages you will find them here in this box .&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%2Fvqkybws2fgh6kdz4cmjv.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%2Fvqkybws2fgh6kdz4cmjv.png" alt="tempomail.top" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4- open up the message so you can see what is it exactly by click on the button looks like the eye on the right side&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%2Frixlp3rv53iyo4i6g3nq.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%2Frixlp3rv53iyo4i6g3nq.png" alt="tempomail.top" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5- you will find the message content here [1] and any attachments you will find them here [2] and to download it just click on the attachment button&lt;/p&gt;

&lt;p&gt;Also you can delete the message when you want by click here [3]&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%2Fdbo3s0kxgdr4k2oapqr1.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%2Fdbo3s0kxgdr4k2oapqr1.png" alt="tempomail.top" width="800" height="94"&gt;&lt;/a&gt;&lt;br&gt;
6- and to got a new email you can click here [1] then click ok in the popup you will got and your email will be ready after 2 seconds&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>tooling</category>
      <category>seo</category>
    </item>
    <item>
      <title>IBUSY</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Fri, 07 Jan 2022 18:16:04 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/ibusy-1cg3</link>
      <guid>https://dev.to/mahmoudshahin1111/ibusy-1cg3</guid>
      <description>&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%2Fdutfiq40znd5lte5a8r9.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%2Fdutfiq40znd5lte5a8r9.png" alt=" " width="150" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IBusy tool can help you to create and enhance your time management tools and make them better and easier to make them because IBusy has great features that can help you in that.&lt;/p&gt;

&lt;p&gt;1 - By IBusy you can get the free period between multiple periods Ex.. likes if you have a person and he is working in specifics times also he has holidays and absences and times he isn't available into so you can get only the times he available into between these periods.&lt;/p&gt;

&lt;p&gt;2 - By IBusy you can filter and sort the duplication between multiple periods Ex.. if you have many dates and periods into an array and you need to remove the duplications and nested array and get only the unique periods like that&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mahmoudshahin1111.github.io/ibusy/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;br&gt;
Install &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;npm i ibusy&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T10:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T15:00:00.000Z&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;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T14:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T16:00:00.000Z&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;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T16:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T20:00:00.000Z&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;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T19:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T23:00:00.000Z&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;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T21:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T23:00:00.000Z&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get the unique period only&lt;/p&gt;

&lt;p&gt;[{ start: "2021-12-29T10:00:00.000Z", end: "2021-12-29T23:00:00.000Z" }];&lt;br&gt;
Tecnology and Dependances:&lt;/p&gt;
&lt;h2&gt;
  
  
  let's know how we can do that
&lt;/h2&gt;

&lt;p&gt;Just simple to get the free periods.&lt;/p&gt;

&lt;p&gt;1 - enter the allowed periods. 2 - ender the disallowed periods. 3 - get the free or available periods by calling &lt;code&gt;getAllowedPeriodsBetween&lt;/code&gt; function just simple 😉.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ibusy&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;IBusy&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;periods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ibusy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAllowedPeriodsBetween&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T05:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T22:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T06:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T12:00:00.000Z&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;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T13:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021-12-29T21:00:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>npm</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Laravel Routes 🚀 - Visual Code Extension</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Wed, 01 Dec 2021 21:10:53 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/laravel-routes-visual-code-extension-5c80</link>
      <guid>https://dev.to/mahmoudshahin1111/laravel-routes-visual-code-extension-5c80</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;laravel routes is amazing Visual Code Extension to help you write your routes without try to remember it's expressions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=MahmoudShahin.laravel-routes&amp;amp;ssr=false#overview" rel="noopener noreferrer"&gt;Install Laravel Routes&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshot
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  How Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open the laravel project folder as a root folder otherwise you &lt;/li&gt;
&lt;li&gt;will need to edit the User Setting&lt;/li&gt;
&lt;li&gt;Press LEFT CTRL + SHIFT + P&lt;/li&gt;
&lt;li&gt;Choose LaravelRoutes: Start&lt;/li&gt;
&lt;li&gt;Press Enter.&lt;/li&gt;
&lt;li&gt;Try to write any route path inside double quotes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* Your route Here */
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you will see a list of suggested routes with the same name.&lt;/p&gt;

&lt;h2&gt;
  
  
  User Settings
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   "routes.RoutesFolderPath": "/routes",
   "routes.ProvidersFolderPath": "/app/Providers"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>laravel</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>php</category>
    </item>
    <item>
      <title>NGX-Nework Get Network Speed</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Fri, 15 Oct 2021 19:23:13 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/ngx-nework-get-network-speed-5cdk</link>
      <guid>https://dev.to/mahmoudshahin1111/ngx-nework-get-network-speed-5cdk</guid>
      <description>&lt;p&gt;How many times you want from client to upload or download something and you need to be sure his network is fast so with simplest package every and updated continuously with new features NgxNetwork you can do that. let's finish the work 👷‍♂️👷‍♀️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/ngx-network" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/ngx-network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;give a user great experiance by add this tool to your angular project with simple steps and make the client see his current network speed &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftslqf7s3gb3l9wk6yi9m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftslqf7s3gb3l9wk6yi9m.gif" alt="awesome clients" width="480" height="480"&gt;&lt;/a&gt;&lt;br&gt;
that can be awesome clients always likes more features.&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%2Fziv0chjtk07gg1tbe0jp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziv0chjtk07gg1tbe0jp.gif" alt="support" width="220" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;please support me by comment about any suggestions or anything need to add to this amazing tool&lt;/p&gt;

</description>
      <category>npm</category>
      <category>productivity</category>
      <category>angular</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Ngx Popover</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Mon, 27 Sep 2021 09:26:45 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/my-new-ngx-popover-5aaa</link>
      <guid>https://dev.to/mahmoudshahin1111/my-new-ngx-popover-5aaa</guid>
      <description>&lt;p&gt;I finished a new tool and i want your opionon about the tool and please support me by share with me any new ideas or features you want me add to the tool to be fit for your work more thanks.&lt;br&gt;
let's start.&lt;/p&gt;

&lt;p&gt;Installation&lt;br&gt;
You can use either the npm command-line tool to install packages.&lt;/p&gt;

&lt;p&gt;NPM&lt;br&gt;
npm i ngx-cxl-popover&lt;/p&gt;

&lt;p&gt;Usage ⁉&lt;br&gt;
import NgxCxlPopoverModule module&lt;br&gt;
@NgModule({&lt;br&gt;
  imports: [&lt;br&gt;
   /* .... &lt;em&gt;/&lt;br&gt;
   NgxCxlPopoverModule&lt;br&gt;
   /&lt;/em&gt; .... */&lt;br&gt;
  ],&lt;br&gt;
})&lt;/p&gt;

&lt;p&gt;1- add directive ngxCxlPopover on the element.&lt;br&gt;
2- write your awesome title popoverTitle.&lt;br&gt;
3- write your awesome content popoverContent.&lt;/p&gt;

&lt;h1&gt;Hello&lt;/h1&gt;

&lt;p&gt;if you want use customized templates for the title and content then let's go to the next level 👍&lt;/p&gt;

&lt;p&gt;Advanced&lt;br&gt;
Custom Templates&lt;br&gt;
&amp;lt;h1&lt;br&gt;
  ngxCxlPopover&lt;br&gt;
  popoverTitle="Hello"&lt;br&gt;
  popoverContent="👋"&lt;br&gt;
  [titleTemplate]="titleTemplate"&lt;br&gt;
  [contentTemplate]="contentTemplate"&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hello&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;Contribution&lt;br&gt;
I welcome you to fork and add more features into it. If you have any bugs or feature request, please create an issue at github repository.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>productivity</category>
      <category>npm</category>
    </item>
    <item>
      <title>Laravel Lardebug New Debugger Tool For Laravel With NodeJs</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Sat, 21 Aug 2021 18:59:13 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/laravel-lardebug-new-debugger-tool-for-laravel-with-nodejs-4c0d</link>
      <guid>https://dev.to/mahmoudshahin1111/laravel-lardebug-new-debugger-tool-for-laravel-with-nodejs-4c0d</guid>
      <description>&lt;p&gt;this is the link for the tool &lt;br&gt;
&lt;a href="https://github.com/mahmoudshahin1111/lardebug" rel="noopener noreferrer"&gt;https://github.com/mahmoudshahin1111/lardebug&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;please support me with a report about any issues or any suggestions to improve the tool.🙏&lt;br&gt;
you can report about issues or suggestions here &lt;a href="https://github.com/mahmoudshahin1111/lardebug/issues" rel="noopener noreferrer"&gt;https://github.com/mahmoudshahin1111/lardebug/issues&lt;/a&gt; or in comments i will be listen 👂&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Object Orianted Javascript In Arabic</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Thu, 05 Aug 2021 15:26:26 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/object-orianted-javascript-in-arabic-43na</link>
      <guid>https://dev.to/mahmoudshahin1111/object-orianted-javascript-in-arabic-43na</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/VqxawkMYUco"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Convert numbers to arabic words in javascript</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Sun, 11 Jul 2021 11:40:47 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/numbers-to-arabic-words-npm-tool-3o6a</link>
      <guid>https://dev.to/mahmoudshahin1111/numbers-to-arabic-words-npm-tool-3o6a</guid>
      <description>&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%2Fsjloplfy1uvggv307wjh.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%2Fsjloplfy1uvggv307wjh.png" alt="npm-tool-preview" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Npm tool will be useful when you need to use Arabic words in your website with only one function and please let me know about new features that can help you in your work  or any bugs to fix immediately &lt;br&gt;
The Tool 🔥⚒ : &lt;a href="https://www.npmjs.com/package/number-to-arabic-words" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/number-to-arabic-words&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;report about any issue : &lt;a href="https://github.com/mahmoudshahin1111/numbers-to-arabic-words/issues" rel="noopener noreferrer"&gt;https://github.com/mahmoudshahin1111/numbers-to-arabic-words/issues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks 🙏&lt;/p&gt;

</description>
      <category>npm</category>
      <category>webdev</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Pricing Component IN CSS &amp; JS &amp; HTML</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Fri, 14 May 2021 09:04:33 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/pricing-component-in-css-js-html-340e</link>
      <guid>https://dev.to/mahmoudshahin1111/pricing-component-in-css-js-html-340e</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/7UAhlao09AU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>3D Cards</title>
      <dc:creator>Mahmoud shahin</dc:creator>
      <pubDate>Fri, 23 Apr 2021 12:32:43 +0000</pubDate>
      <link>https://dev.to/mahmoudshahin1111/3d-cards-2j7k</link>
      <guid>https://dev.to/mahmoudshahin1111/3d-cards-2j7k</guid>
      <description>&lt;p&gt;I interesting to make complex 🤓 things with javascript, CSS, and HTML so I make a search on complex things in javascript and CSS and I choose 3d cards so I made it and would like to share that work 💖😍&lt;/p&gt;

&lt;p&gt;[Arabic Voice] How I Did That?&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/JEFUNZ8WyXs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

</description>
      <category>codepen</category>
      <category>css</category>
      <category>html</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
