Skip to content
preloader-matrix

Build A Static RSS Reader To Fight Your Inner FOMO — TechRuum

In a fast-paced industry like tech, it can be hard to deal with the fear of missing out on important news. But, as many of us know, there’s an absolutely huge amount of information coming in daily, and finding the right time and balance to keep up can be difficult, if not stressful. A classic piece of technology like an RSS feed is a delightful way of taking back ownership of our own time. In this article, we will create a static Really Simple Syndication (RSS) reader that will bring you the latest curated news only once (yes: once) a day.

We’ll obviously work with RSS technology in the process, but we’re also going to combine it with some things that maybe you haven’t tried before, including Astro (the static site framework), TypeScript (for JavaScript goodies), a package called rss-parser (for connecting things together), as well as scheduled functions and build hooks provided by Netlify (although there are other services that do this).

I chose these technologies purely because I really, really enjoy them! There may be other solutions out there that are more performant, come with more features, or are simply more comfortable to you — and in those cases, I encourage you to swap in whatever you’d like. The most important thing is getting the end result!

The Plan

Here’s how this will go. Astro generates the website. I made the intentional decision to use a static site because I want the different RSS feeds to be fetched only once during build time, and that’s something we can control each time the site is “rebuilt” and redeployed with updates. That’s where Netlify’s scheduled functions come into play, as they let us trigger rebuilds automatically at specific times. There is no need to manually check for updates and deploy them! Cron jobs can just as readily do this if you prefer a server-side solution.

During the triggered rebuild, we’ll let the rss-parser package do exactly what it says it does: parse a list of RSS feeds that are contained in an array. The package also allows us to set a filter for the fetched results so that we only get ones from the past day, week, and so on. Personally, I only render the news from the last seven days to prevent content overload. We’ll get there!

But first…

RSS is a web feed technology that you can feed into a reader or news aggregator. Because RSS is standardized, you know what to expect when it comes to the feed’s format. That means we have a ton of fun possibilities when it comes to handling the data that the feed provides. Most news websites have their own RSS feed that you can subscribe to (this is TechRuum’s RSS feed: An RSS feed is capable of updating every time a site publishes new content, which means it can be a quick source of the latest news, but we can tailor that frequency as well.

RSS feeds are written in an Extensible Markup Language (XML) format and have specific elements that can be used within it. Instead of focusing too much on the technicalities here, I’ll give you a link to the RSS specification. Don’t worry; that page should be scannable enough for you to find the most pertinent information you need, like the kinds of elements that are supported and what they represent. For this tutorial, we’re only using the following elements: </code></strong>, <strong><code><link/></code></strong>, <strong><code><description/></code></strong>, <strong><code><item/></code></strong>, and <strong><code><pubdate/></code></strong>. We’ll also let our RSS parser package do some of the work for us.</p> <div data-audience="non-subscriber" data-remove="true" class="feature-panel-container"> <aside class="feature-panel"> <div class="feature-panel-right-col"> <div class="feature-panel-image"><picture><source type="image/avif" srcset="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/2732dfe9-e1ee-41c3-871a-6252aeda741c/typescript-panel.avif"><img loading="lazy" decoding="async" class="feature-panel-image-img" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png" alt="Feature Panel" width="481" height="698" title="Build A Static RSS Reader To Fight Your Inner FOMO — TechRuum 1"></source></picture></div> </div> </aside> </div> <h2 id="creating-the-state-site">Creating The State Site</h2> <p>We’ll start by creating our Astro site! In your terminal run <code>pnpm create astro@latest</code>. You can use any package manager you want — I’m simply trying out pnpm for myself.</p> <p>After running the command, Astro’s chat-based helper, Houston, walks through some setup questions to get things started.</p> <pre><code class="language-bash"> astro Launch sequence initiated. dir Where should we create your new project? ./rss-buddy tmpl How would you like to start your new project? Include sample files ts Do you plan to write TypeScript? Yes use How strict should TypeScript be? Strict deps Install dependencies? Yes git Initialize a new git repository? Yes </code></pre> <p>I like to use Astro’s sample files so I can get started quickly, but we’re going to clean them up a bit in the process. Let’s clean up the <code>src/pages/index.astro</code> file by removing everything inside of the <code><main/></code> tags. Then we’re good to go!</p> <p>From there, we can spin things by running <code>pnpm start</code>. Your terminal will tell you which localhost address you can find your site at.</p> <p>The <code>src/pages/index.astro</code> file is where we will make an array of RSS feeds we want to follow. We will be using Astro’s template syntax, so between the two code fences (—), create an array of <code>feedSources</code> and add some feeds. If you need inspiration, you can copy this:</p> <pre><code class="language-javascript">const feedSources = [ ' ' // etc. ] </code></pre> <p>Now we’ll install the rss-parser package in our project by running <code>pnpm install rss-parser</code>. This package is a small library that turns the XML that we get from fetching an RSS feed into JavaScript objects. This makes it easy for us to read our RSS feeds and manipulate the data any way we want.</p> <p>Once the package is installed, open the <code>src/pages/index.astro</code> file, and at the top, we’ll import the rss-parser and instantiate the <code>Partner</code> class.</p> <pre><code class="language-javascript">import Parser from 'rss-parser'; const parser = new Parser(); </code></pre> <p>We use this parser to read our RSS feeds and (surprise!) <em>parse</em> them to JavaScript. We’re going to be dealing with a list of promises here. Normally, I would probably use <code>Promise.all()</code>, but the thing is, this is supposed to be a complicated experience. If one of the feeds doesn’t work for some reason, I’d prefer to simply ignore it.</p> <p>Why? Well, because <code>Promise.all()</code> rejects everything even if only one of its promises is rejected. That might mean that if one feed doesn’t behave the way I’d expect it to, my entire page would be blank when I grab my hot beverage to read the news in the morning. I do not want to start my day confronted by an error.</p> <p>Instead, I’ll opt to use <code>Promise.allSettled()</code>. This method will actually let all promises complete even if one of them fails. In our case, this means any feed that errors will just be ignored, which is perfect.</p> <p>Let’s add this to the <code>src/pages/index.astro</code> file:</p> <div class="break-out"> <pre><code class="language-typescript">interface FeedItem { feed?: string; title?: string; link?: string; date?: Date; } const feedItems: FeedItem[] = []; await Promise.allSettled( feedSources.map(async (source) => { try { const feed = await parser.parseURL(source); feed.items.forEach((item) => { const date = item.pubDate ? new Date(item.pubDate) : undefined; feedItems.push({ feed: feed.title, title: item.title, link: item.link, date, }); }); } catch (error) { console.error(`Error fetching feed from ${source}:`, error); } }) ); </code></pre> </div> <p>This creates an array (or more) named <code>feedItems</code>. For each URL in the <code>feedSources</code> array we created earlier, the rss-parser retrieves the items and, yes, parses them into JavaScript. Then, we return whatever data we want! We’ll keep it simple for now and only return the following:</p> <ul> <li>The feed title,</li> <li>The title of the feed item,</li> <li>The link to the item,</li> <li>And the item’s published date.</li> </ul> <p>The next step is to ensure that all items are sorted by date so we’ll truly get the “latest” news. Add this small piece of code to our work:</p> <div class="break-out"> <pre><code class="language-typescript">const sortedFeedItems = feedItems.sort((a, b) => (b.date ?? new Date()).getTime() - (a.date ?? new Date()).getTime()); </code></pre> </div> <p>Oh, and&mldr; remember when I said I didn’t want this RSS reader to render anything older than seven days? Let’s tackle that right now since we’re already in this code.</p> <p>We’ll make a new variable called <code>sevenDaysAgo</code> and assign it a date. We’ll then set that date to seven days ago and use that logic before we add a new item to our <code>feedItems</code> array.</p> <p>This is what the <code>src/pages/index.astro</code> file should now look like at this point:</p> <div class="break-out"> <pre><code class="language-typescript">--- import Layout from '../layouts/Layout.astro'; import Parser from 'rss-parser'; const parser = new Parser(); const sevenDaysAgo = new Date(); sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); const feedSources = [ ' ' ] interface FeedItem { feed?: string; title?: string; link?: string; date?: Date; } const feedItems: FeedItem[] = []; await Promise.allSettled( feedSources.map(async (source) => { try { const feed = await parser.parseURL(source); feed.items.forEach((item) => { const date = item.pubDate ? new Date(item.pubDate) : undefined; if (date && date >= sevenDaysAgo) { feedItems.push({ feed: feed.title, title: item.title, link: item.link, date, }); } }); } catch (error) { console.error(`Error fetching feed from ${source}:`, error); } }) ); const sortedFeedItems = feedItems.sort((a, b) => (b.date ?? new Date()).getTime() - (a.date ?? new Date()).getTime()); --- <layout title="Welcome to Astro."> <main> </main> </layout> </code></pre> </div> <h2 id="rendering-xml-data">Rendering XML Data</h2> <p>It’s time to show our news articles on the Astro site! To keep this simple, we’ll format the items in an unordered list rather than some other fancy layout.</p> <p>All we need to do is update the <code><layout/></code> element in the file with the XML objects sprinkled in for a feed item’s title, URL, and publish date.</p> <pre><code class="language-html"><layout title="Welcome to Astro."> <main> {sortedFeedItems.map(item => ( ))} </main> </layout> </code></pre> <p>Go ahead and run <code>pnpm start</code> from the terminal. The page should display an unordered list of feed items. Of course, everything is styled at the moment, but luckily for you, you can make it look exactly like you want with CSS!</p> <p>And remember that there are even <strong>more fields available in the XML for each item</strong> if you want to display more information. If you run the following snippet in your DevTools console, you’ll see all of the fields you have at your disposal:</p> <pre><code class="language-javascript">feed.items.forEach(item => {} </code></pre> <h2 id="scheduling-daily-static-site-builds">Scheduling Daily Static Site Builds</h2> <p>We’re nearly done! The feeds are being fetched, and they are returning data back to us in JavaScript for use in our Astro page template. Since feeds are updated whenever new content is published, we need a way to fetch the latest items from it.</p> <p>We want to avoid doing any of this manually. So, let’s set this site on Netlify to gain access to their scheduled functions that trigger a rebuild and their build hooks that do the building. Again, other services do this, and you’re welcome to roll this work with another provider — I’m just partial to Netlify since I work there. In any case, you can follow Netlify’s documentation for setting up a new site.</p> <p>Once your site is hosted and live, you are ready to schedule your rebuilds. A build hook gives you a URL to use to trigger the new build, looking something like this:</p> <pre><code class="language-html"> </code></pre> <p>Let’s trigger builds every day at midnight. We’ll use Netlify’s scheduled functions. That’s really why I’m using Netlify to host this in the first place. Having them at the ready via the host greatly simplifies things since there’s no server work or complicated configurations to get this going. Set it and forget it!</p> <p>We’ll install <code>@netlify/functions</code> (instructions) to the project and then create the following file in the project’s root directory: <code>netlify/functions/deploy.ts</code>.</p> <p>This is what we want to add to that file:</p> <div class="break-out"> <pre><code class="language-typescript">// netlify/functions/deploy.ts import type { Config } from '@netlify/functions'; const BUILD_HOOK = ''; // replace me! export default async (req: Request) => { await fetch(BUILD_HOOK, { method: 'POST', }) }; export const config: Config = { schedule: '0 0 * * *', }; </code></pre> </div> <p>If you commit your code and push it, your site should re-deploy automatically. From that point on, it follows a schedule that rebuilds the site every day at midnight, ready for you to take your morning brew and catch up on everything that <em>you</em> think is important.</p> <div class="signature"><img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" title="Build A Static RSS Reader To Fight Your Inner FOMO — TechRuum 2"><br /> <span>(gg, yk)</span></div> </div> <p>#Build #Static #RSS #Reader #Fight #FOMO #Smashing #Magazine</p> </div> <div class="post-tags wpex-mb-40 wpex-last-mr-0"><a href="https://techruum.com/tag/build/" rel="tag">Build</a><a href="https://techruum.com/tag/fight/" rel="tag">Fight</a><a href="https://techruum.com/tag/fomo/" rel="tag">FOMO</a><a href="https://techruum.com/tag/reader/" rel="tag">Reader</a><a href="https://techruum.com/tag/rss/" rel="tag">RSS</a><a href="https://techruum.com/tag/static/" rel="tag">Static</a><a href="https://techruum.com/tag/techruum/" rel="tag">TechRuum</a></div> <div class="wpex-social-share style-flat position-horizontal wpex-mx-auto wpex-mb-40 wpex-print-hidden" data-target="_blank" data-source="https%3A%2F%2Ftechruum.com%2F" data-url="https%3A%2F%2Ftechruum.com%2Fbuild-a-static-rss-reader-to-fight-your-inner-fomo-techruum%2F" data-title="Build A Static RSS Reader To Fight Your Inner FOMO — TechRuum" data-image="https%3A%2F%2Ftechruum.com%2Fwp-content%2Fuploads%2F2024%2F10%2Fbuild-static-rss-reader-fight-fomo.jpg" data-summary="RSS%20is%20a%20classic%20technology%20that%20fetches%20content%20from%20websites%20and%20feeds%20it%20to%20anyone%20who%20subscribes%20to%20it%20with%20a%20URL.%20It%E2%80%99s%20based%20on%20XML%2C%20and%20we%20can%20use" data-email-subject="I wanted you to see this link" data-email-body="I wanted you to see this link https%3A%2F%2Ftechruum.com%2Fbuild-a-static-rss-reader-to-fight-your-inner-fomo-techruum%2F"> <h3 class="theme-heading border-bottom social-share-title"><span class="text">Share This</span></h3> <ul class="wpex-social-share__list wpex-flex wpex-flex-wrap"> <li class="wpex-social-share__item"> <a href="#" role="button" class="wpex-social-share__link wpex-social-share__link--twitter wpex-twitter wpex-social-bg"> <span class="wpex-social-share__icon"><span class="ticon ticon-twitter" aria-hidden="true"></span></span> <span class="wpex-social-share__label wpex-label">Twitter</span> </a> </li> <li class="wpex-social-share__item"> <a href="#" role="button" class="wpex-social-share__link wpex-social-share__link--facebook wpex-facebook wpex-social-bg"> <span class="wpex-social-share__icon"><span class="ticon ticon-facebook" aria-hidden="true"></span></span> <span class="wpex-social-share__label wpex-label">Facebook</span> </a> </li> <li class="wpex-social-share__item"> <a href="#" role="button" class="wpex-social-share__link wpex-social-share__link--linkedin wpex-linkedin wpex-social-bg"> <span class="wpex-social-share__icon"><span class="ticon ticon-linkedin" aria-hidden="true"></span></span> <span class="wpex-social-share__label wpex-label">LinkedIn</span> </a> </li> <li class="wpex-social-share__item"> <a href="#" role="button" class="wpex-social-share__link wpex-social-share__link--email wpex-email wpex-social-bg"> <span class="wpex-social-share__icon"><span class="ticon ticon-envelope" aria-hidden="true"></span></span> <span class="wpex-social-share__label wpex-label">Email</span> </a> </li> </ul> </div> <section class="author-bio wpex-boxed wpex-flex wpex-gap-20 wpex-flex-col wpex-sm-flex-row wpex-mb-40 wpex-text-center wpex-sm-text-left"> <div class="author-bio-avatar wpex-flex-shrink-0"> <a href="https://techruum.com/author/simeonmoses9/" title="Visit Author Page"><img alt='' src='https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-300x300.jpg' srcset='https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-300x300.jpg 300w, https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-1024x1024.jpg 1024w, https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-150x150.jpg 150w, https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-768x768.jpg 768w, https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-1536x1536.jpg 1536w, https://techruum.com/wp-content/uploads/2022/05/Techrumm-icon-01-2048x2048.jpg 2048w' class='avatar avatar-70 photo wpex-align-middle wpex-round' height='70' width='70' decoding='async'/></a> </div> <div class="author-bio-content wpex-flex-grow wpex-last-mb-0"> <h3 class="author-bio-title wpex-heading wpex-m-0 wpex-mb-10 wpex-text-lg"> <a href="https://techruum.com/author/simeonmoses9/" title="Visit Author Page" rel="author" class="wpex-no-underline">TechRuum</a> </h3> <div class="author-bio-description wpex-mb-15 wpex-last-mb-0"><p>TechRuum Inc is a world class information technology company committed to use the best business practices to help companies develop the capabilities needed to compete in the global market. TechRuum partners with its clients to achieve success in the global markets with its specialized expertise in providing Onsite, Offsite and Offshore IT services and solutions. TechRuum’ core competency lies in enabling its clients to reduce the cost and complexity of deploying information technology while ensuring reliability, scalability, and manageability.</p> </div> <div class="author-bio-social wpex-mb-15"><div class="author-bio-social__items wpex-inline-flex wpex-flex-wrap wpex-gap-5"><a href="https://twitter.com/TechRuum" class="author-bio-social__item wpex-social-btn wpex-social-btn-flat wpex-social-bg wpex-round wpex-twitter"><span class="ticon ticon-twitter" aria-hidden="true"></span><span class="screen-reader-text">Twitter</span></a><a href="https://www.facebook.com/TechRuum-114932764555254" class="author-bio-social__item wpex-social-btn wpex-social-btn-flat wpex-social-bg wpex-round wpex-facebook"><span class="ticon ticon-facebook" aria-hidden="true"></span><span class="screen-reader-text">Facebook</span></a><a href="https://www.linkedin.com/company/techruum" class="author-bio-social__item wpex-social-btn wpex-social-btn-flat wpex-social-bg wpex-round wpex-linkedin"><span class="ticon ticon-linkedin" aria-hidden="true"></span><span class="screen-reader-text">LinkedIn</span></a><a href="https://instagram.com/techruum" class="author-bio-social__item wpex-social-btn wpex-social-btn-flat wpex-social-bg wpex-round wpex-instagram"><span class="ticon ticon-instagram" aria-hidden="true"></span><span class="screen-reader-text">Instagram</span></a></div></div> </div> </section> <div class="related-posts wpex-overflow-hidden wpex-mb-40 wpex-clr"> <h3 class="theme-heading border-bottom related-posts-title"><span class="text">Related Posts</span></h3> <div class="wpex-row wpex-clr"> <article class="related-post col span_1_of_3 col-1 wpex-clr post-1575 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-design tag-meets tag-opensource tag-penpot tag-techruum tag-tooling entry has-media"> <div class="related-post-inner wpex-flex-grow"> <figure class="related-post-figure wpex-mb-15 wpex-relative"> <a href="https://techruum.com/open-source-meets-design-tooling-with-penpot-techruum/" title="Open-Source Meets Design Tooling With Penpot — TechRuum" class="related-post-thumb"> <img loading="lazy" class="wpex-align-middle" decoding="async" src="https://techruum.com/wp-content/uploads/2024/11/open-source-meets-design-tooling-penpot-700x350.jpg" alt="" width="700" height="350"> </a> </figure> <div class="related-post-content wpex-clr"> <div class="related-post-title entry-title wpex-mb-5"> <a href="https://techruum.com/open-source-meets-design-tooling-with-penpot-techruum/">Open-Source Meets Design Tooling With Penpot — TechRuum</a> </div> <div class="related-post-excerpt wpex-text-sm wpex-leading-normal wpex-last-mb-0 wpex-clr"><p>Penpot helps designers and developers work better together by offering a free, open-source design tool…</p></div> </div> </div> </article> <article class="related-post col span_1_of_3 col-2 wpex-clr post-1571 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-fast tag-lighthouse tag-optimizing tag-score tag-techruum tag-website entry has-media"> <div class="related-post-inner wpex-flex-grow"> <figure class="related-post-figure wpex-mb-15 wpex-relative"> <a href="https://techruum.com/why-optimizing-your-lighthouse-score-is-not-enough-for-a-fast-website-techruum/" title="Why Optimizing Your Lighthouse Score Is Not Enough For A Fast Website — TechRuum" class="related-post-thumb"> <img loading="lazy" class="wpex-align-middle" decoding="async" src="https://techruum.com/wp-content/uploads/2024/11/why-optimizing-lighthouse-score-not-enough-fast-website-700x350.jpg" alt="" width="700" height="350"> </a> </figure> <div class="related-post-content wpex-clr"> <div class="related-post-title entry-title wpex-mb-5"> <a href="https://techruum.com/why-optimizing-your-lighthouse-score-is-not-enough-for-a-fast-website-techruum/">Why Optimizing Your Lighthouse Score Is Not Enough For A Fast Website — TechRuum</a> </div> <div class="related-post-excerpt wpex-text-sm wpex-leading-normal wpex-last-mb-0 wpex-clr"><p>Feeling good with your Lighthouse score of 100%? You should! But you should also know…</p></div> </div> </div> </article> <article class="related-post col span_1_of_3 col-3 wpex-clr post-1565 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-design tag-friedman tag-impact tag-measure tag-techruum tag-vitaly entry has-media"> <div class="related-post-inner wpex-flex-grow"> <figure class="related-post-figure wpex-mb-15 wpex-relative"> <a href="https://techruum.com/its-here-how-to-measure-ux-design-impact-with-vitaly-friedman-techruum/" title="It’s Here! How To Measure UX & Design Impact, With Vitaly Friedman — TechRuum" class="related-post-thumb"> <img loading="lazy" class="wpex-align-middle" decoding="async" src="https://techruum.com/wp-content/uploads/2024/10/ux-metrics-video-course-opt-700x350.png" alt="" width="700" height="350"> </a> </figure> <div class="related-post-content wpex-clr"> <div class="related-post-title entry-title wpex-mb-5"> <a href="https://techruum.com/its-here-how-to-measure-ux-design-impact-with-vitaly-friedman-techruum/">It’s Here! How To Measure UX & Design Impact, With Vitaly Friedman — TechRuum</a> </div> <div class="related-post-excerpt wpex-text-sm wpex-leading-normal wpex-last-mb-0 wpex-clr"><p>Design decisions shouldn’t be a matter of personal preference. We can use reliable design KPIs…</p></div> </div> </div> </article></div> </div> </article> </div> </div> <aside id="sidebar" class="sidebar-primary sidebar-container wpex-print-hidden"> <div id="sidebar-inner" class="sidebar-container-inner wpex-mb-40"><div id="search-1" class="sidebar-box widget widget_search wpex-mb-30 wpex-clr"> <form role="search" method="get" class="searchform wpex-relative" action="https://techruum.com/"> <label class="searchform-label wpex-text-current wpex-block wpex-m-0 wpex-p-0"> <span class="screen-reader-text">Search</span> <input type="search" class="searchform-input field" name="s" placeholder="Search"> </label> <button type="submit" class="searchform-submit"><span class="ticon ticon-search" aria-hidden="true"></span><span class="screen-reader-text">Submit</span></button> </form> </div> <div id="recent-posts-1" class="wpex-bordered-list sidebar-box widget widget_recent_entries wpex-mb-30 wpex-clr"> <div class="widget-title wpex-heading wpex-text-md wpex-mb-20">Recent Posts</div> <ul> <li> <a href="https://techruum.com/ebay-unveils-the-evo-brand-system-playbook/">eBay Unveils the Evo Brand System Playbook</a> <span class="post-date">November 23, 2024</span> </li> <li> <a href="https://techruum.com/open-source-meets-design-tooling-with-penpot-techruum/">Open-Source Meets Design Tooling With Penpot — TechRuum</a> <span class="post-date">November 17, 2024</span> </li> <li> <a href="https://techruum.com/how-to-survive-a-client-meeting-when-they-say-make-it-pop/">How to Survive a Client Meeting When They Say ‘Make It Pop’!!!!</a> <span class="post-date">November 14, 2024</span> </li> <li> <a href="https://techruum.com/why-optimizing-your-lighthouse-score-is-not-enough-for-a-fast-website-techruum/">Why Optimizing Your Lighthouse Score Is Not Enough For A Fast Website — TechRuum</a> <span class="post-date">November 7, 2024</span> </li> <li> <a href="https://techruum.com/exciting-new-tools-for-designers-october-2024/">Exciting New Tools for Designers, October 2024</a> <span class="post-date">November 4, 2024</span> </li> </ul> </div><div id="archives-1" class="wpex-bordered-list sidebar-box widget widget_archive wpex-mb-30 wpex-clr"><div class="widget-title wpex-heading wpex-text-md wpex-mb-20">Archives</div> <label class="screen-reader-text" for="archives-dropdown-1">Archives</label> <select id="archives-dropdown-1" name="archive-dropdown"> <option value="">Select Month</option> <option value='https://techruum.com/2024/11/'> November 2024  (6)</span></option> <option value='https://techruum.com/2024/10/'> October 2024  (9)</span></option> <option value='https://techruum.com/2024/09/'> September 2024  (10)</span></option> <option value='https://techruum.com/2024/08/'> August 2024  (10)</span></option> <option value='https://techruum.com/2024/07/'> July 2024  (11)</span></option> <option value='https://techruum.com/2024/06/'> June 2024  (8)</span></option> <option value='https://techruum.com/2024/05/'> May 2024  (10)</span></option> <option value='https://techruum.com/2024/04/'> April 2024  (10)</span></option> <option value='https://techruum.com/2024/03/'> March 2024  (10)</span></option> <option value='https://techruum.com/2024/02/'> February 2024  (10)</span></option> <option value='https://techruum.com/2024/01/'> January 2024  (10)</span></option> <option value='https://techruum.com/2023/12/'> December 2023  (10)</span></option> <option value='https://techruum.com/2023/11/'> November 2023  (10)</span></option> <option value='https://techruum.com/2023/10/'> October 2023  (11)</span></option> <option value='https://techruum.com/2023/09/'> September 2023  (10)</span></option> <option value='https://techruum.com/2023/08/'> August 2023  (10)</span></option> <option value='https://techruum.com/2023/07/'> July 2023  (10)</span></option> <option value='https://techruum.com/2023/06/'> June 2023  (10)</span></option> <option value='https://techruum.com/2023/05/'> May 2023  (17)</span></option> <option value='https://techruum.com/2023/04/'> April 2023  (13)</span></option> <option value='https://techruum.com/2023/03/'> March 2023  (22)</span></option> <option value='https://techruum.com/2023/02/'> February 2023  (24)</span></option> <option value='https://techruum.com/2023/01/'> January 2023  (40)</span></option> <option value='https://techruum.com/2022/12/'> December 2022  (74)</span></option> <option value='https://techruum.com/2022/11/'> November 2022  (20)</span></option> <option value='https://techruum.com/2022/10/'> October 2022  (14)</span></option> <option value='https://techruum.com/2022/09/'> September 2022  (15)</span></option> <option value='https://techruum.com/2022/08/'> August 2022  (17)</span></option> <option value='https://techruum.com/2022/07/'> July 2022  (15)</span></option> <option value='https://techruum.com/2022/06/'> June 2022  (12)</span></option> <option value='https://techruum.com/2022/05/'> May 2022  (11)</span></option> <option value='https://techruum.com/2022/04/'> April 2022  (10)</span></option> <option value='https://techruum.com/2022/03/'> March 2022  (2)</span></option> </select> <script> (function() { var dropdown = document.getElementById( "archives-dropdown-1" ); function onSelectChange() { if ( dropdown.options[ dropdown.selectedIndex ].value !== '' ) { document.location.href = this.options[ this.selectedIndex ].value; } } dropdown.onchange = onSelectChange; })(); </script> </div><div id="categories-1" class="wpex-bordered-list sidebar-box widget widget_categories wpex-mb-30 wpex-clr"><div class="widget-title wpex-heading wpex-text-md wpex-mb-20">Categories</div><form action="https://techruum.com" method="get"><label class="screen-reader-text" for="cat">Categories</label><select name='cat' id='cat' class='postform'> <option value='-1'>Select Category</option> <option class="level-0" value="38">2022 vision awards  (1)</option> <option class="level-0" value="906">AI  (4)</option> <option class="level-0" value="24">and How-Tos  (52)</option> <option class="level-0" value="133">Apps  (2)</option> <option class="level-0" value="134">best video editing software  (1)</option> <option class="level-0" value="984">best web design resources  (1)</option> <option class="level-0" value="185">best web sites  (1)</option> <option class="level-0" value="43">Bullhorn News  (3)</option> <option class="level-0" value="1382">Business  (1)</option> <option class="level-0" value="34">Careers  (1)</option> <option class="level-0" value="225">Choosing a Font  (1)</option> <option class="level-0" value="1383">client  (1)</option> <option class="level-0" value="686">Compilations  (39)</option> <option class="level-0" value="31">Connected Services  (1)</option> <option class="level-0" value="16">cpq  (1)</option> <option class="level-0" value="74">CRM Saas  (1)</option> <option class="level-0" value="11">Customer Success  (6)</option> <option class="level-0" value="54">Customer Webinar  (1)</option> <option class="level-0" value="326">Design  (16)</option> <option class="level-0" value="186">design inspiration  (1)</option> <option class="level-0" value="1392">design style  (1)</option> <option class="level-0" value="187">design trends  (1)</option> <option class="level-0" value="912">Development  (4)</option> <option class="level-0" value="41">Digital Transformation  (2)</option> <option class="level-0" value="1393">ebay  (1)</option> <option class="level-0" value="143">Editors Pick  (6)</option> <option class="level-0" value="75">Email Saas  (1)</option> <option class="level-0" value="14">Enterprise Agile Planning  (4)</option> <option class="level-0" value="20">Events  (12)</option> <option class="level-0" value="144">Featured  (6)</option> <option class="level-0" value="49">flow metrics  (1)</option> <option class="level-0" value="226">font  (1)</option> <option class="level-0" value="68">Fonts  (17)</option> <option class="level-0" value="123">free Christmas patterns  (1)</option> <option class="level-0" value="124">free illustrations  (1)</option> <option class="level-0" value="125">Free patterns  (1)</option> <option class="level-0" value="122">Freebies  (1)</option> <option class="level-0" value="1384">freelance  (1)</option> <option class="level-0" value="1385">Funny  (1)</option> <option class="level-0" value="76">Hubspot  (1)</option> <option class="level-0" value="35">Human Resources  (1)</option> <option class="level-0" value="162">human-centered design  (1)</option> <option class="level-0" value="55">IBM  (1)</option> <option class="level-0" value="25">Industry Trends & Insights  (26)</option> <option class="level-0" value="10">Innovation Management  (9)</option> <option class="level-0" value="30">insidesales  (2)</option> <option class="level-0" value="60">Inspiration  (27)</option> <option class="level-0" value="58">Lean Portfolio Management  (1)</option> <option class="level-0" value="36">Life at Planview  (4)</option> <option class="level-0" value="77">mailchimp  (1)</option> <option class="level-0" value="98">multipurpose themes  (3)</option> <option class="level-0" value="530">multipurpose WordPress Themes  (1)</option> <option class="level-0" value="155">new apps  (1)</option> <option class="level-0" value="1394">New font  (1)</option> <option class="level-0" value="188">new sites  (1)</option> <option class="level-0" value="156">new tools. new downloads  (1)</option> <option class="level-0" value="396">News  (9)</option> <option class="level-0" value="78">newsletter saas  (1)</option> <option class="level-0" value="37">Open Jobs  (3)</option> <option class="level-0" value="15">People of Planview  (12)</option> <option class="level-0" value="44">Planview  (1)</option> <option class="level-0" value="57">planview accelerate  (1)</option> <option class="level-0" value="45">Planview Culture  (4)</option> <option class="level-0" value="39">planview customers  (1)</option> <option class="level-0" value="46">Planview Jobs  (4)</option> <option class="level-0" value="56">Planview PSA  (1)</option> <option class="level-0" value="40">planview solution success  (1)</option> <option class="level-0" value="1395">playbook  (1)</option> <option class="level-0" value="145">plugins  (3)</option> <option class="level-0" value="1386">pop  (1)</option> <option class="level-0" value="200">Portfolio  (1)</option> <option class="level-0" value="201">Portfolio Website  (1)</option> <option class="level-0" value="28">Product Lifecycle Management  (5)</option> <option class="level-0" value="27">Product Portfolio Management  (6)</option> <option class="level-0" value="50">product value stream  (1)</option> <option class="level-0" value="26">Products  (3)</option> <option class="level-0" value="17">Professional Services  (2)</option> <option class="level-0" value="8">Professional Services Automation  (5)</option> <option class="level-0" value="9">Project Portfolio Management  (7)</option> <option class="level-0" value="51">project to product  (1)</option> <option class="level-0" value="47">Project to Product Shift  (1)</option> <option class="level-0" value="18">quote to cash  (1)</option> <option class="level-0" value="19">quote to cash vs cpq  (1)</option> <option class="level-0" value="53">Resource Management  (2)</option> <option class="level-0" value="73">Resources  (32)</option> <option class="level-0" value="1208">retro  (1)</option> <option class="level-0" value="150">Reviews  (1)</option> <option class="level-0" value="32">Services Organizations  (1)</option> <option class="level-0" value="1216">Showcase  (1)</option> <option class="level-0" value="954">Social Media  (1)</option> <option class="level-0" value="338">Sponsored  (7)</option> <option class="level-0" value="21">Staffing Technology  (27)</option> <option class="level-0" value="13">Strategic Planning  (4)</option> <option class="level-0" value="59">Tech  (8)</option> <option class="level-0" value="42">Technology Portfolio Management  (1)</option> <option class="level-0" value="178">themes  (2)</option> <option class="level-0" value="22">Tips  (52)</option> <option class="level-0" value="113">Tools  (6)</option> <option class="level-0" value="114">tools for web designers  (3)</option> <option class="level-0" value="61">Trends  (8)</option> <option class="level-0" value="23">Tricks  (52)</option> <option class="level-0" value="227">Typefaces and Fonts  (1)</option> <option class="level-0" value="224">Typography  (2)</option> <option class="level-0" value="163">UCD  (1)</option> <option class="level-0" value="372">UI  (2)</option> <option class="level-0" value="1">Uncategorized  (180)</option> <option class="level-0" value="164">user centered design  (1)</option> <option class="level-0" value="165">user experience  (1)</option> <option class="level-0" value="161">UX  (3)</option> <option class="level-0" value="48">Value Stream Management  (3)</option> <option class="level-0" value="135">Video  (1)</option> <option class="level-0" value="136">video apps  (1)</option> <option class="level-0" value="137">video editing  (1)</option> <option class="level-0" value="29">Vision and Trends  (2)</option> <option class="level-0" value="52">vsm  (1)</option> <option class="level-0" value="864">Web  (5)</option> <option class="level-0" value="62">Web Design  (8)</option> <option class="level-0" value="115">Web Design Resources  (2)</option> <option class="level-0" value="985">Web Design Tools  (1)</option> <option class="level-0" value="189">web design trends  (1)</option> <option class="level-0" value="1387">web designer  (1)</option> <option class="level-0" value="484">woocommerce  (1)</option> <option class="level-0" value="64">WooCommerce themes  (2)</option> <option class="level-0" value="63">WordPress  (12)</option> <option class="level-0" value="146">wordpress plugins  (2)</option> <option class="level-0" value="99">wordpress themes  (5)</option> <option class="level-0" value="1388">work  (1)</option> <option class="level-0" value="12">Work Management for Teams  (3)</option> </select> </form><script> (function() { var dropdown = document.getElementById( "cat" ); function onCatChange() { if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) { dropdown.parentNode.submit(); } } dropdown.onchange = onCatChange; })(); </script> </div></div> </aside> </div> </main> <footer id="footer" class="site-footer wpex-surface-dark wpex-print-hidden"> <div id="footer-inner" class="site-footer-inner container wpex-pt-40 wpex-clr"> <div id="footer-widgets" class="wpex-row wpex-clr gap-60"> <div class="footer-box span_1_of_3 col col-1"><div id="wpex_info_widget-1" class="footer-widget widget wpex-pb-40 wpex-clr widget_wpex_info_widget"><div class='widget-title wpex-heading wpex-text-md wpex-mb-20'>Business Info</div><ul class="wpex-info-widget wpex-last-mb-0"><li class="wpex-info-widget-address wpex-flex wpex-mb-10"><div class="wpex-info-widget-icon wpex-mr-15"><span class="ticon ticon-map-marker" aria-hidden="true"></span></div><div class="wpex-info-widget-data wpex-flex-grow wpex-last-mb-0"><p>Queens County, New York, United States</p> </div></li><li class="wpex-info-widget-phone wpex-flex wpex-mb-10"><div class="wpex-info-widget-icon wpex-mr-15"><span class="ticon ticon-phone" aria-hidden="true"></span></div><div class="wpex-info-widget-data wpex-flex-grow"><a href="tel:+1 (347) 333-6564">+1 (347) 333-6564</a></div></li></ul></div><div id="wpex_info_widget-4" class="footer-widget widget wpex-pb-40 wpex-clr widget_wpex_info_widget"><ul class="wpex-info-widget wpex-last-mb-0"><li class="wpex-info-widget-address wpex-flex wpex-mb-10"><div class="wpex-info-widget-icon wpex-mr-15"><span class="ticon ticon-map-marker" aria-hidden="true"></span></div><div class="wpex-info-widget-data wpex-flex-grow wpex-last-mb-0"><p>Sheikh Mohammed Bin Rashed Boulevard Downtown Dubai, PO Box 123234 Dubai, UAE</p> </div></li></ul></div><div id="wpex_info_widget-3" class="footer-widget widget wpex-pb-40 wpex-clr widget_wpex_info_widget"><ul class="wpex-info-widget wpex-last-mb-0"><li class="wpex-info-widget-address wpex-flex wpex-mb-10"><div class="wpex-info-widget-icon wpex-mr-15"><span class="ticon ticon-map-marker" aria-hidden="true"></span></div><div class="wpex-info-widget-data wpex-flex-grow wpex-last-mb-0"><p>Gateway Zone Estate, Magodo GRA Phase 1, Lagos, Nigeria.</p> </div></li></ul></div></div> <div class="footer-box span_1_of_3 col col-2"><div id="wpex_about-2" class="footer-widget widget wpex-pb-40 wpex-clr widget_wpex_about"><div class='widget-title wpex-heading wpex-text-md wpex-mb-20'>About TechRuum</div><div class="wpex-about-widget wpex-clr"><div class="wpex-about-widget-description wpex-last-mb-0 wpex-clr">TechRuum Inc is a world class information technology company committed to use the best business practices to help companies develop the capabilities needed to compete in the global market.</div></div></div></div> <div class="footer-box span_1_of_3 col col-3"><div id="wpex_fontawesome_social_widget-1" class="footer-widget widget wpex-pb-40 wpex-clr widget_wpex_fontawesome_social_widget"><div class='widget-title wpex-heading wpex-text-md wpex-mb-20'>Follow Us</div><style>#wpex_fontawesome_social_widget-1 .wpex-social-btn{font-size:18px;border-radius:4px;}</style><div class="wpex-fa-social-widget textleft"><div class="desc wpex-last-mb-0 wpex-mb-20 wpex-clr">Don't forget to follow us via our various social media profiles and keep up with the latest scoop about us.</div><ul class="wpex-list-none wpex-m-0 wpex-last-mr-0 wpex-text-md"><li class="wpex-inline-block wpex-mb-5 wpex-mr-5"><a href="https://www.linkedin.com/company/techruum" title="LinkedIn" class="wpex-linkedin wpex-social-btn wpex-social-btn-flat wpex-social-bg" rel="noopener noreferrer" target="_blank"><span class="ticon ticon-linkedin" aria-hidden="true"></span><span class="screen-reader-text">LinkedIn</span></a></li><li class="wpex-inline-block wpex-mb-5 wpex-mr-5"><a href="https://wa.me/message/247EOXVZ2T22J1" title="Whatsapp" class="wpex-whatsapp wpex-social-btn wpex-social-btn-flat wpex-social-bg" rel="noopener noreferrer" target="_blank"><span class="ticon ticon-whatsapp" aria-hidden="true"></span><span class="screen-reader-text">Whatsapp</span></a></li><li class="wpex-inline-block wpex-mb-5 wpex-mr-5"><a href="https://www.facebook.com/TechRuum-114932764555254" title="Facebook" class="wpex-facebook wpex-social-btn wpex-social-btn-flat wpex-social-bg" rel="noopener noreferrer" target="_blank"><span class="ticon ticon-facebook" aria-hidden="true"></span><span class="screen-reader-text">Facebook</span></a></li><li class="wpex-inline-block wpex-mb-5 wpex-mr-5"><a href="https://instagram.com/techruum" title="Instagram" class="wpex-instagram wpex-social-btn wpex-social-btn-flat wpex-social-bg" rel="noopener noreferrer" target="_blank"><span class="ticon ticon-instagram" aria-hidden="true"></span><span class="screen-reader-text">Instagram</span></a></li><li class="wpex-inline-block wpex-mb-5 wpex-mr-5"><a href="https://twitter.com/TechRuum" title="Twitter" class="wpex-twitter wpex-social-btn wpex-social-btn-flat wpex-social-bg" rel="noopener noreferrer" target="_blank"><span class="ticon ticon-twitter" aria-hidden="true"></span><span class="screen-reader-text">Twitter</span></a></li><li class="wpex-inline-block wpex-mb-5 wpex-mr-5"><a href="https://techruum.com/feed/" title="RSS" class="wpex-rss wpex-social-btn wpex-social-btn-flat wpex-social-bg" rel="noopener noreferrer" target="_blank"><span class="ticon ticon-rss" aria-hidden="true"></span><span class="screen-reader-text">RSS</span></a></li></ul></div></div></div> </div> </div> </footer> <div id="footer-bottom" class="wpex-py-20 wpex-text-sm wpex-surface-dark wpex-bg-gray-900 wpex-text-center wpex-md-text-left wpex-print-hidden"> <div id="footer-bottom-inner" class="container"><div class="footer-bottom-flex wpex-md-flex wpex-md-justify-between wpex-md-items-center"> <div id="copyright" class="wpex-last-mb-0">Copyright 2024 <a href="https://techruum.com/">TechRuum Inc.</a> - All Rights Reserved</div> <nav id="footer-bottom-menu" class="wpex-mt-10 wpex-md-mt-0" aria-label="Footer menu"><div class="menu-footer-container"><ul id="menu-footer" class="menu"><li id="menu-item-136" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-136"><a href="https://techruum.com/submit-a-project/">Submit a project</a></li> <li id="menu-item-263" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-263"><a href="https://techruum.com/cookies-policy/">Cookies Policy</a></li> <li id="menu-item-297" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-297"><a rel="privacy-policy" href="https://techruum.com/privacy-policy/">Privacy Policy</a></li> <li id="menu-item-264" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-264"><a href="https://techruum.com/terms-of-use/">Terms Of Use</a></li> <li id="menu-item-265" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-265"><a href="https://techruum.com/terms-and-conditions/">Terms & Conditions</a></li> <li id="menu-item-262" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-262"><a href="https://techruum.com/return-and-refund-policy/">Refund Policy</a></li> </ul></div></nav> </div></div> </div> </div> </div> <div id="mobile-menu-alternative" class="wpex-hidden"><ul id="menu-main-1" class="dropdown-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-131"><a href="https://techruum.com/"><span class="link-inner">Home</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-209"><a href="https://techruum.com/about-us/"><span class="link-inner">About us</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-134"><a href="https://techruum.com/services/"><span class="link-inner">Services</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1244"><a href="https://techruum.com/jobs/"><span class="link-inner">Careers</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page current_page_parent menu-item-135"><a href="https://techruum.com/blog/"><span class="link-inner">Blog</span></a></li> <li class="menu-button menu-item menu-item-type-post_type menu-item-object-page menu-item-133"><a href="https://techruum.com/submit-a-project/"><span class="link-inner">Submit a project</span></a></li> </ul></div> <div class="wpex-hidden wpex-sm-block"> <a href="#outer-wrap" id="site-scroll-top" class="wpex-flex wpex-items-center wpex-justify-center wpex-fixed wpex-rounded-full wpex-text-center wpex-box-content wpex-transition-all wpex-duration-200 wpex-bottom-0 wpex-right-0 wpex-mr-25 wpex-mb-25 wpex-no-underline wpex-print-hidden wpex-surface-2 wpex-text-4 wpex-hover-bg-accent wpex-invisible wpex-opacity-0" data-scroll-speed="1000" data-scroll-offset="100"><span class="ticon ticon-caret-square-o-up" aria-hidden="true"></span><span class="screen-reader-text">Back To Top</span></a> </div> <nav class="mobile-toggle-nav wpex-mobile-menu mobile-toggle-nav--animate wpex-surface-1 wpex-hidden wpex-text-2 wpex-togglep-afterheader wpex-z-9999" aria-expanded="false" aria-label="Mobile menu" data-wpex-insert-after="#site-header"> <div class="mobile-toggle-nav-inner container"> <ul class="mobile-toggle-nav-ul wpex-h-auto wpex-leading-inherit wpex-list-none wpex-my-0 wpex-mx-auto"></ul> </div> </nav> <script> window.RS_MODULES = window.RS_MODULES || {}; window.RS_MODULES.modules = window.RS_MODULES.modules || {}; window.RS_MODULES.waiting = window.RS_MODULES.waiting || []; window.RS_MODULES.defered = true; window.RS_MODULES.moduleWaiting = window.RS_MODULES.moduleWaiting || {}; window.RS_MODULES.type = 'compiled'; </script> <script type="text/javascript"> /* MonsterInsights Scroll Tracking */ if ( typeof(jQuery) !== 'undefined' ) { jQuery( document ).ready(function(){ function monsterinsights_scroll_tracking_load() { if ( ( typeof(__gaTracker) !== 'undefined' && __gaTracker && __gaTracker.hasOwnProperty( "loaded" ) && __gaTracker.loaded == true ) || ( typeof(__gtagTracker) !== 'undefined' && __gtagTracker ) ) { (function(factory) { factory(jQuery); }(function($) { /* Scroll Depth */ "use strict"; var defaults = { percentage: true }; var $window = $(window), cache = [], scrollEventBound = false, lastPixelDepth = 0; /* * Plugin */ $.scrollDepth = function(options) { var startTime = +new Date(); options = $.extend({}, defaults, options); /* * Functions */ function sendEvent(action, label, scrollDistance, timing) { if ( 'undefined' === typeof MonsterInsightsObject || 'undefined' === typeof MonsterInsightsObject.sendEvent ) { return; } var paramName = action.toLowerCase(); var fieldsArray = { send_to: 'G-W14Y83S62Z', non_interaction: true }; fieldsArray[paramName] = label; if (arguments.length > 3) { fieldsArray.scroll_timing = timing MonsterInsightsObject.sendEvent('event', 'scroll_depth', fieldsArray); } else { MonsterInsightsObject.sendEvent('event', 'scroll_depth', fieldsArray); } } function calculateMarks(docHeight) { return { '25%' : parseInt(docHeight * 0.25, 10), '50%' : parseInt(docHeight * 0.50, 10), '75%' : parseInt(docHeight * 0.75, 10), /* Cushion to trigger 100% event in iOS */ '100%': docHeight - 5 }; } function checkMarks(marks, scrollDistance, timing) { /* Check each active mark */ $.each(marks, function(key, val) { if ( $.inArray(key, cache) === -1 && scrollDistance >= val ) { sendEvent('Percentage', key, scrollDistance, timing); cache.push(key); } }); } function rounded(scrollDistance) { /* Returns String */ return (Math.floor(scrollDistance/250) * 250).toString(); } function init() { bindScrollDepth(); } /* * Public Methods */ /* Reset Scroll Depth with the originally initialized options */ $.scrollDepth.reset = function() { cache = []; lastPixelDepth = 0; $window.off('scroll.scrollDepth'); bindScrollDepth(); }; /* Add DOM elements to be tracked */ $.scrollDepth.addElements = function(elems) { if (typeof elems == "undefined" || !$.isArray(elems)) { return; } $.merge(options.elements, elems); /* If scroll event has been unbound from window, rebind */ if (!scrollEventBound) { bindScrollDepth(); } }; /* Remove DOM elements currently tracked */ $.scrollDepth.removeElements = function(elems) { if (typeof elems == "undefined" || !$.isArray(elems)) { return; } $.each(elems, function(index, elem) { var inElementsArray = $.inArray(elem, options.elements); var inCacheArray = $.inArray(elem, cache); if (inElementsArray != -1) { options.elements.splice(inElementsArray, 1); } if (inCacheArray != -1) { cache.splice(inCacheArray, 1); } }); }; /* * Throttle function borrowed from: * Underscore.js 1.5.2 * http://underscorejs.org * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Underscore may be freely distributed under the MIT license. */ function throttle(func, wait) { var context, args, result; var timeout = null; var previous = 0; var later = function() { previous = new Date; timeout = null; result = func.apply(context, args); }; return function() { var now = new Date; if (!previous) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); } else if (!timeout) { timeout = setTimeout(later, remaining); } return result; }; } /* * Scroll Event */ function bindScrollDepth() { scrollEventBound = true; $window.on('scroll.scrollDepth', throttle(function() { /* * We calculate document and window height on each scroll event to * account for dynamic DOM changes. */ var docHeight = $(document).height(), winHeight = window.innerHeight ? window.innerHeight : $window.height(), scrollDistance = $window.scrollTop() + winHeight, /* Recalculate percentage marks */ marks = calculateMarks(docHeight), /* Timing */ timing = +new Date - startTime; checkMarks(marks, scrollDistance, timing); }, 500)); } init(); }; /* UMD export */ return $.scrollDepth; })); jQuery.scrollDepth(); } else { setTimeout(monsterinsights_scroll_tracking_load, 200); } } monsterinsights_scroll_tracking_load(); }); } /* End MonsterInsights Scroll Tracking */ </script><link rel='stylesheet' id='matrixloader_animation_css-css' href='https://techruum.com/wp-content/plugins/matrix-pre-loader/assets/css/animate.min.css?ver=6.7.1' media='all' /> <link rel='stylesheet' id='rs-plugin-settings-css' href='//techruum.com/wp-content/plugins/revslider/sr6/assets/css/rs6.css?ver=6.7.15' media='all' /> <style id='rs-plugin-settings-inline-css'> #rs-demo-id {} </style> <script src="//techruum.com/wp-content/plugins/revslider/sr6/assets/js/rbtools.min.js?ver=6.7.15" defer async id="tp-tools-js"></script> <script src="//techruum.com/wp-content/plugins/revslider/sr6/assets/js/rs6.min.js?ver=6.7.15" defer async id="revmin-js"></script> <script id="wpex-core-js-extra"> var wpex_theme_params = {"menuWidgetAccordion":"1","mobileMenuBreakpoint":"959","i18n":{"openSubmenu":"Open submenu of %s","closeSubmenu":"Close submenu of %s"},"selectArrowIcon":"<span class=\"wpex-select-arrow__icon ticon ticon-angle-down\" aria-hidden=\"true\"><\/span>","customSelects":".widget_categories form,.widget_archive select,.vcex-form-shortcode select","scrollToHash":"1","localScrollFindLinks":"1","localScrollHighlight":"1","localScrollUpdateHash":"","scrollToHashTimeout":"500","localScrollTargets":"li.local-scroll a, a.local-scroll, .local-scroll-link, .local-scroll-link > a","localScrollSpeed":"1000","scrollToBehavior":"smooth","mobileMenuOpenSubmenuIcon":"<span class=\"wpex-open-submenu__icon wpex-transition-all wpex-duration-300 ticon ticon-angle-down\" aria-hidden=\"true\"><\/span>"}; </script> <script src="https://techruum.com/wp-content/themes/Total/assets/js/frontend/core.min.js?ver=5.17" id="wpex-core-js"></script> <script src="https://techruum.com/wp-content/themes/Total/assets/js/frontend/mobile-menu/toggle.min.js?ver=5.17" id="wpex-mobile-menu-toggle-js"></script> <script id="matrixloader-plugin-preloader-script-js-extra"> var matrixloaderPublic = {"loader_delay":"1000","font_size":"20","text_animation_in_loop":"1","loader_animation_in":"","loader_animation_out":"fadeMatrixOutDown","text_animation_in_type":"sequence"}; </script> <script src="https://techruum.com/wp-content/plugins/matrix-pre-loader/assets/js/matrix-pre-loader.js?ver=2.0.1" id="matrixloader-plugin-preloader-script-js"></script> <script src="https://techruum.com/wp-content/themes/Total/assets/js/frontend/social-share.min.js?ver=5.17" id="wpex-social-share-js"></script> <script></script> </body> </html>