It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: https://heo.li

  1. <!DOCTYPE html>
  2. <html lang="gb" dir="ltr">
  3.    <head>
  4.        <title>Smart Links, Secure Connections, Creativity in Linking - Heo Links</title>
  5.        <base href="https://heo.li/">
  6.        <meta charset="UTF-8">
  7.        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
  8.  
  9.        
  10.                    <meta name="description" content="Improve the efficiency of link shortening, bio link pages, QR code generators, and vCard sharing. Enhance your link management, strengthen privacy, and monitor analytics with HEO Links" />
  11.                            <meta name="keywords" content="Link Shortening Service, Bio Link Page Creator, QR Code Generator, vCard Sharing, Custom Short URL, Link Management, Privacy-Focused Links, Secure Link Shortening Service, Link Analytics, QR Code Sharing, vCard Contact Information Sharing, User-Friendly Link Shortener, Protected Link Sharing, URL Privacy, Track and Analyze Links, Customizable Short Links, QR Codes for Marketing, Link Management Platform, Secure and Private Bio Link, vCard Contact Information" />
  12.        
  13.        <!-- Open graph / Twitter markup -->
  14. <meta property="og:type" content="website" />
  15. <meta property="og:url" content="https://heo.li/" />
  16. <meta property="og:title" content="Smart Links, Secure Connections, Creativity in Linking - Heo Links" />
  17. <meta property="og:image" content="https://heo.li/uploads/main/d77b89e88429756390344ccccff78c2d.png" />
  18. <meta property="og:site_name" content="Heo Links" />
  19. <meta name="twitter:card" content="summary_large_image" />
  20. <meta name="twitter:url" content="https://heo.li/" />
  21. <meta name="twitter:title" content="Smart Links, Secure Connections, Creativity in Linking - Heo Links" />
  22. <meta name="twitter:image" content="https://heo.li/uploads/main/d77b89e88429756390344ccccff78c2d.png" />
  23.  
  24.                    <link rel="canonical" href="https://heo.li/" />
  25.        
  26.        
  27.                    <link rel="alternate" href="https://heo.li/" hreflang="x-default" />
  28.                                                                                                            <link rel="alternate" href="https://heo.li/id/" hreflang="id" />
  29.                                                                                <link rel="alternate" href="https://heo.li/ro/" hreflang="ro" />
  30.                                                                                <link rel="alternate" href="https://heo.li/ro/" hreflang="ro" />
  31.                                                        
  32.                    <link href="https://heo.li/uploads/main/9895138f2a1a870beea3485e7582123f.webp" rel="icon" />
  33.        
  34.        <link href="https://heo.li/themes/altum/assets/css/bootstrap.min.css?v=6000" id="css_theme_style" rel="stylesheet" media="screen,print">
  35.                    <link href="https://heo.li/themes/altum/assets/css/custom.css?v=6000" rel="stylesheet" media="screen,print">
  36.        
  37.        <link rel="stylesheet" href="https://heo.li/themes/altum/assets/css/libraries/aos.min.css?v=6000">
  38.    <link href="https://heo.li/themes/altum/assets/css/index-custom.css?v=6000" rel="stylesheet" media="screen,print">
  39.  
  40.        
  41.                    <!-- Google tag (gtag.js) -->
  42. <script async src="https://www.googletagmanager.com/gtag/js?id=G-50RPKK0NRT"></script>
  43. <script>
  44.  window.dataLayer = window.dataLayer || [];
  45.  function gtag(){dataLayer.push(arguments);}
  46.  gtag('js', new Date());
  47.  
  48.  gtag('config', 'G-50RPKK0NRT');
  49. </script>        
  50.                    <style>.blog-post-content img {width: 100%}</style>
  51.            </head>
  52.  
  53.    <body class="index  " data-theme-style="light">
  54.        
  55.                
  56.                
  57.                    
  58.        <div data-announcement="guests" class="announcement-wrapper py-3" style="background-color: #38B2AC;">
  59.            <div class="container d-flex justify-content-center position-relative">
  60.                <div class="row w-100">
  61.                    <div class="col">
  62.                        <div class="text-center" style="color: #FFFFDB;">Unlock Your Chance - <b style="color:white">Grab a 50% Discount on All Plans</b> – Exclusive for the First 100 Lucky Users! <a href="https://heo.li/register" style="color:white"><b>JOIN NOW</b></a></div>
  63.                    </div>
  64.                    <div class="col-auto px-0">
  65.                        <div>
  66.                            <button data-announcement-close="guests" data-announcement-id="6d4af583c2141cadcf181cf3d537da3a" type="button" class="close ml-2" data-dismiss="alert" data-toggle="tooltip" title="Close" data-tooltip-hide-on-click>
  67.                                <i class="fas fa-sm fa-times" style="color: #FFFFDB; opacity: .5;"></i>
  68.                            </button>
  69.                        </div>
  70.                    </div>
  71.                </div>
  72.            </div>
  73.        </div>
  74.        
  75.            
  76.  
  77.    
  78.        
  79.        
  80.    <div id="spotlight_wrapper" class="spotlight-wrapper d-none" aria-hidden="true">
  81.        <div class="container spotlight-modal">
  82.  
  83.            <form id="spotlight_form" action="" method="get" role="form">
  84.                <input type="hidden" name="global_token" value="a161f6e9d418b7a61546831aad81ac8e" />
  85.  
  86.                <input id="spotlight_search" type="search" name="search" class="form-control" required="required" autocomplete="off" placeholder="🔎 Search & navigate to a page..." aria-label="Search" />
  87.  
  88.                <div id="spotlight_results" class="spotlight-results mt-3"></div>
  89.  
  90.                <div id="spotlight_no_data" class="my-3 p-3 bg-gray-50 rounded-2x position-relative text-center" style="display:none;">
  91.                    <span class="text-muted">No information available</span>
  92.                </div>
  93.            </form>
  94.        </div>
  95.    </div>
  96.  
  97.    
  98.                    
  99.  
  100.        <div class="container pt-4">
  101.            
  102. <nav id="navbar" class="navbar navbar-main navbar-expand-lg navbar-light mb-6 index-highly-rounded border border-gray-100">
  103.    <div class="container">
  104.        <a
  105.                class="navbar-brand d-flex"
  106.                href="https://heo.li/"
  107.                data-logo
  108.                data-light-value="https://heo.li/uploads/main/2a11e7f7a3ad4b1134ece7d6cfa2af16.webp"
  109.                data-light-class="img-fluid navbar-logo"
  110.                data-light-tag="img"
  111.                data-dark-value="https://heo.li/uploads/main/7732c7117ad7922758e5f0eeffbe059f.webp"
  112.                data-dark-class="img-fluid navbar-logo"
  113.                data-dark-tag="img"
  114.        >
  115.                            <img src="https://heo.li/uploads/main/2a11e7f7a3ad4b1134ece7d6cfa2af16.webp" class="img-fluid navbar-logo" alt="Website emblem" />
  116.                    </a>
  117.  
  118.        <button class="btn navbar-custom-toggler d-lg-none" type="button" data-toggle="collapse" data-target="#main_navbar" aria-controls="main_navbar" aria-expanded="false" aria-label="Toggle navigation">
  119.            <i class="fas fa-fw fa-bars"></i>
  120.        </button>
  121.  
  122.        <div class="collapse navbar-collapse justify-content-end" id="main_navbar">
  123.            <ul class="navbar-nav">
  124.  
  125.                                    <li class="nav-item">
  126.                        <a class="nav-link" href="https://heo.li/plan" target="_self">
  127.                            
  128.                            Pricing                        </a>
  129.                    </li>
  130.                
  131.                                    <li class="nav-item"><a class="nav-link" href="https://heo.li/tools">Tools</a></li>
  132.                
  133.                
  134.                
  135.                    <li class="nav-item d-flex align-items-center">
  136.                        <a class="btn btn-sm btn-outline-primary" href="https://heo.li/login"><i class="fas fa-fw fa-sm fa-sign-in-alt"></i> Log in</a>
  137.                    </li>
  138.  
  139.                                            <li class="nav-item d-flex align-items-center">
  140.                            <a class="btn btn-sm btn-primary" href="https://heo.li/register"><i class="fas fa-fw fa-sm fa-user-plus"></i> Register</a>
  141.                        </li>
  142.                    
  143.                
  144.            </ul>
  145.        </div>
  146.    </div>
  147. </nav>
  148.        </div>
  149.  
  150.        
  151.        <main class="altum-animate altum-animate-fill-none altum-animate-fade-in">
  152.            
  153. <div class="index-container">
  154.    <div class="container index-container-content">
  155.        
  156.        <div class="row">
  157.            <div class="col">
  158.                <div class="text-left">
  159.                    <div class="mb-2">
  160.                        <span class="badge badge-pill badge-light">
  161.                            <i class="fas fa-fw fa-star fa-sm text-warning"></i><i class="fas fa-fw fa-star fa-sm text-warning"></i><i class="fas fa-fw fa-star fa-sm text-warning"></i><i class="fas fa-fw fa-star fa-sm text-warning"></i><i class="fas fa-fw fa-star fa-sm text-warning mr-1"></i>
  162.                            Adored by <span class="font-weight-bolder">13,150+</span> creators                        </span>
  163.                    </div>
  164.  
  165.                    <h1 class="index-header mb-4">Do Everything With One Platform Marketing Wizard</h1>
  166.  
  167.                    <div class="row mb-5">
  168.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  169.                                <a href="https://heo.li/links?type=biolink" class="text-truncate">
  170.                                    📱   Profile pages                                </a>
  171.                            </div>
  172.                        
  173.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  174.                                <a href="https://heo.li/links?type=link">
  175.                                    🔗   Short URLs                                </a>
  176.                            </div>
  177.                        
  178.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  179.                                <a href="https://heo.li/links?type=file">
  180.                                    📃   Move files                                </a>
  181.                            </div>
  182.                        
  183.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  184.                                <a href="https://heo.li/links?type=vcard">
  185.                                    👤   Share contact cards                                </a>
  186.                            </div>
  187.                        
  188.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  189.                                <a href="https://heo.li/links?type=event">
  190.                                    📆   Event links                                </a>
  191.                            </div>
  192.                        
  193.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  194.                                <a href="https://heo.li/links?type=static">
  195.                                    🧑‍💻   Host HTML                                </a>
  196.                            </div>
  197.                        
  198.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  199.                                <a href="https://heo.li/qr-codes">
  200.                                    🤳   QR codes                                </a>
  201.                            </div>
  202.                        
  203.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  204.                                <a href="https://heo.li/tools">
  205.                                    🛠️   Web tools                                </a>
  206.                            </div>
  207.                        
  208.                                                    <div class="col-6 col-xl-4 index-feature text-truncate">
  209.                                <a href="https://heo.li/links-statistics">
  210.                                    📊️ &nbsp; Analytics                                </a>
  211.                            </div>
  212.                                            </div>
  213.  
  214.                    <div class="d-flex flex-column">
  215.                                                                                    <div class="mb-3">
  216.                                    <div class="input-group">
  217.                                        <div class="input-group-prepend">
  218.                                                                                            <div class="input-group-text bg-gray-50">
  219.                                                    heo.li/                                                </div>
  220.                                                                                    </div>
  221.                                        <input id="claim_url" type="text" name="url" class="form-control index-input" value="" maxlength="64" placeholder="your-personalized-url" />
  222.                                    </div>
  223.                                </div>
  224.  
  225.                                                            
  226.                            <a id="claim_button" href="https://heo.li/register" class="btn index-button rounded-2x index-button-white bg-gradient border-0 mb-3 rounded-pill">
  227.                                Claim URL <i class="fas fa-fw fa-sm fa-arrow-right"></i>
  228.                            </a>
  229.                        
  230.                                                                                            </div>
  231.                </div>
  232.            </div>
  233.  
  234.            <div class="d-none d-lg-flex justify-content-center col">
  235.                <img src="https://heo.li/uploads/main/368b7380df0f2bfa66746a34fc2a1843.webp" class="index-image index-image-one" alt="Screenshot of examples of biolink pages" />
  236.                <img src="https://heo.li/uploads/main/4063b95b701460bf36c7b1231ebc4d6e.webp" class="index-image index-image-two" alt="Screenshot of examples of biolink pages" />
  237.            </div>
  238.  
  239.        </div>
  240.    </div>
  241. </div>
  242.  
  243.    <div class="container mt-6">
  244.        <div class="card index-highly-rounded border-0" data-aos="fade-up">
  245.            <div class="card-body">
  246.                <div class="row">
  247.                    <div class="col-auto col-lg-5 mb-4 mb-lg-0">
  248.                        <img src="https://heo.li/uploads/main/66f06be18f32aa3fbf2a33a4e2f57b72.webp" class="inverse-colors-animation index-card-image index-highly-rounded" loading="lazy" alt="Screenshot of the app biolink editing page" />
  249.                    </div>
  250.                    <div class="col ml-3">
  251.                        <div class="bg-primary-100 p-3 w-fit-content rounded-2x">
  252.                            <i class="fas fa-fw fa-users fa-lg text-primary"></i>
  253.                        </div>
  254.  
  255.                        <h2 class="mt-3">Biographical link pages</h2>
  256.                        <p class="h6 mt-3 text-muted">Effortlessly design your personalized and highly customizable bio link page.</p>
  257.  
  258.                        <ul class="list-style-none mt-4 font-size-small">
  259.                            <li class="d-flex align-items-center mb-2">
  260.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  261.                                <div>Custom colors and branding</div>
  262.                            </li>
  263.                            <li class="d-flex align-items-center mb-2">
  264.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  265.                                <div>A multitude of ready-to-use components</div>
  266.                            </li>
  267.                            <li class="d-flex align-items-center mb-2">
  268.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  269.                                <div>Search Engine Optimization settings</div>
  270.                            </li>
  271.                            <li class="d-flex align-items-center mb-2">
  272.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  273.                                <div>Password protection, sensitive content alert</div>
  274.                            </li>
  275.                            <li class="d-flex align-items-center mb-2">
  276.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  277.                                <div>Numerous ready-made templates & themes</div>
  278.                            </li>
  279.                        </ul>
  280.                    </div>
  281.                </div>
  282.            </div>
  283.        </div>
  284.    </div>
  285.  
  286.    <div class="container mt-6">
  287.        <div class="card index-highly-rounded border-0" data-aos="fade-up">
  288.            <div class="card-body">
  289.                <div class="row">
  290.                    <div class="col-auto col-lg-5 mb-4 mb-lg-0">
  291.                        <img src="https://heo.li/uploads/main/c51636390544d5c490d8f35fc0146fc8.webp" class="inverse-colors-animation index-card-image index-highly-rounded" loading="lazy" alt="Screenshot of the app short URL modification page" />
  292.                    </div>
  293.                    <div class="col ml-3">
  294.                        <div class="bg-primary-100 p-3 w-fit-content rounded-2x">
  295.                            <i class="fas fa-fw fa-link fa-lg text-primary"></i>
  296.                        </div>
  297.  
  298.                        <h2 class="mt-3">Short links</h2>
  299.                        <p class="h6 mt-3 text-muted">A cutting-edge URL shortener service.</p>
  300.  
  301.                        <ul class="list-style-none mt-4 font-size-small">
  302.                            <li class="d-flex align-items-center mb-2">
  303.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  304.                                <div>Scheduling & expiration limits</div>
  305.                            </li>
  306.                            <li class="d-flex align-items-center mb-2">
  307.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  308.                                <div>Country, device, and language targeting</div>
  309.                            </li>
  310.                            <li class="d-flex align-items-center mb-2">
  311.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  312.                                <div>A/B Rotation</div>
  313.                            </li>
  314.                            <li class="d-flex align-items-center mb-2">
  315.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  316.                                <div>Password protection, sensitive content alert</div>
  317.                            </li>
  318.                            <li class="d-flex align-items-center mb-2">
  319.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  320.                                <div>Support for deep links in apps</div>
  321.                            </li>
  322.                            <li class="d-flex align-items-center mb-2">
  323.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  324.                                <div>Advanced URL masking</div>
  325.                            </li>
  326.                        </ul>
  327.                    </div>
  328.                </div>
  329.            </div>
  330.        </div>
  331.    </div>
  332.  
  333.    <div class="container mt-6">
  334.        <div class="card index-highly-rounded border-0" data-aos="fade-up">
  335.            <div class="card-body">
  336.                <div class="row">
  337.                    <div class="col-auto col-lg-5 mb-4 mb-lg-0">
  338.                        <img src="https://heo.li/themes/altum/assets/images/index/static-link.webp" class="inverse-colors-animation index-card-image index-highly-rounded" loading="lazy" alt="Screenshot of the app's static sites hosting system" />
  339.                    </div>
  340.                    <div class="col ml-3">
  341.                        <div class="bg-primary-100 p-3 w-fit-content rounded-2x">
  342.                            <i class="fas fa-fw fa-file-code fa-lg text-primary"></i>
  343.                        </div>
  344.  
  345.                        <h2 class="mt-3">Host static websites</h2>
  346.                        <p class="h6 mt-3 text-muted">Upload your website files, and we will host them for you.</p>
  347.  
  348.                        <ul class="list-style-none mt-4 font-size-small">
  349.                            <li class="d-flex align-items-center mb-2">
  350.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  351.                                <div>HTML, CSS, JS, Video/Audio files.</div>
  352.                            </li>
  353.                            <li class="d-flex align-items-center mb-2">
  354.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  355.                                <div>Analytics, password-protected</div>
  356.                            </li>
  357.                            <li class="d-flex align-items-center mb-2">
  358.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  359.                                <div>Automated tracking pixels</div>
  360.                            </li>
  361.                            <li class="d-flex align-items-center mb-2">
  362.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  363.                                <div>and much more...</div>
  364.                            </li>
  365.                        </ul>
  366.                    </div>
  367.                </div>
  368.            </div>
  369.        </div>
  370.    </div>
  371.  
  372.    <div class="container mt-6">
  373.        <div class="card index-highly-rounded border-0" data-aos="fade-up">
  374.            <div class="card-body">
  375.                <div class="row">
  376.                    <div class="col-auto col-lg-5 mb-4 mb-lg-0">
  377.                        <img src="https://heo.li/themes/altum/assets/images/index/qr-code.webp" class="inverse-colors-animation index-card-image index-highly-rounded" loading="lazy" alt="Screenshot of the app's QR code system page" />
  378.                    </div>
  379.                    <div class="col ml-3">
  380.                        <div class="bg-primary-100 p-3 w-fit-content rounded-2x">
  381.                            <i class="fas fa-fw fa-qrcode fa-lg text-primary"></i>
  382.                        </div>
  383.  
  384.                        <h2 class="mt-3">QR codes</h2>
  385.                        <p class="h6 mt-3 text-muted">Comprehensive QR code generator system with user-friendly templates.</p>
  386.  
  387.                        <ul class="list-style-none mt-4 font-size-small">
  388.                            <li class="d-flex align-items-center mb-2">
  389.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  390.                                <div>Custom colors with gradients</div>
  391.                            </li>
  392.                            <li class="d-flex align-items-center mb-2">
  393.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  394.                                <div>Custom logo and background branding</div>
  395.                            </li>
  396.                            <li class="d-flex align-items-center mb-2">
  397.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  398.                                <div>Various QR shapes to select from</div>
  399.                            </li>
  400.                            <li class="d-flex align-items-center mb-2">
  401.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  402.                                <div>Frames for Customizable QR Codes</div>
  403.                            </li>
  404.                            <li class="d-flex align-items-center mb-2">
  405.                                <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  406.                                <div>Vcard, WiFi, Calendar, Location, etc. templates</div>
  407.                            </li>
  408.                        </ul>
  409.                    </div>
  410.                </div>
  411.            </div>
  412.        </div>
  413.    </div>
  414.  
  415. <div class="container mt-6">
  416.    <div class="card index-highly-rounded border-0" data-aos="fade-up">
  417.        <div class="card-body">
  418.            <div class="row">
  419.                <div class="col-auto col-lg-5 mb-4 mb-lg-0">
  420.                    <img src="https://heo.li/themes/altum/assets/images/index/analytics.webp" class="inverse-colors-animation index-card-image index-highly-rounded" loading="lazy" alt="Screenshot of the app links analytics system page" />
  421.                </div>
  422.                <div class="col ml-3">
  423.                    <div class="bg-primary-100 p-3 w-fit-content rounded-2x">
  424.                        <i class="fas fa-fw fa-chart-bar fa-lg text-primary"></i>
  425.                    </div>
  426.  
  427.                    <h2 class="mt-3">Integrated analytics</h2>
  428.                    <p class="h6 mt-3 text-muted">Detailed analytics for all your links that are easy to understand.</p>
  429.  
  430.                    <ul class="list-style-none mt-4 font-size-small">
  431.                        <li class="d-flex align-items-center mb-2">
  432.                            <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  433.                            <div>Continents, Countries & Cities</div>
  434.                        </li>
  435.                        <li class="d-flex align-items-center mb-2">
  436.                            <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  437.                            <div>Referrers & UTMs</div>
  438.                        </li>
  439.                        <li class="d-flex align-items-center mb-2">
  440.                            <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  441.                            <div>Devices and operating systems</div>
  442.                        </li>
  443.                        <li class="d-flex align-items-center mb-2">
  444.                            <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  445.                            <div>Web Browsers, Languages</div>
  446.                        </li>
  447.                        <li class="d-flex align-items-center mb-2">
  448.                            <i class="fas fa-fw fa-sm fa-check-circle text-success mr-3"></i>
  449.                            <div>Compliant with GDPR, CCPA, and PECR</div>
  450.                        </li>
  451.                    </ul>
  452.                </div>
  453.            </div>
  454.        </div>
  455.    </div>
  456. </div>
  457.  
  458. <div class="py-3"></div>
  459.  
  460. <div class="container mt-8">
  461.    <div class="row">
  462.        <style>
  463.            /* File Links */
  464.            .file-links-background {
  465.                background-color: #ecfdf5;
  466.                color: #0b4e3a;
  467.            }
  468.            .file-links-icon {
  469.                color: #10b981;
  470.            }
  471.  
  472.            /* VCard Links */
  473.            .vcard-links-background {
  474.                background-color: #ecfeff;
  475.                color: #04505a;
  476.            }
  477.            .vcard-links-icon {
  478.                color: #06b6d4;
  479.            }
  480.  
  481.            /* Event Links */
  482.            .event-links-background {
  483.                background-color: #eef2ff;
  484.                color: #444088;
  485.            }
  486.            .event-links-icon {
  487.                color: #6366f1;
  488.            }
  489.  
  490.            /* Splash pages */
  491.            .splash-pages-background {
  492.                background-color: #eef2ff;
  493.                color: #044852;
  494.            }
  495.            .splash-pages-icon {
  496.                color: #06b6d4;
  497.            }
  498.  
  499.            /* Domains */
  500.            .domains-background {
  501.                background-color: #faf5ff;
  502.                color: #4b1d7a;
  503.            }
  504.            .domains-icon {
  505.                color: #a855f7;
  506.            }
  507.  
  508.            /* Projects */
  509.            .projects-background {
  510.                background-color: #fdf4ff;
  511.                color: #851c8d;
  512.            }
  513.            .projects-icon {
  514.                color: #d946ef;
  515.            }
  516.  
  517.            /* File Links - Dark Theme */
  518.            [data-theme-style='dark'] .file-links-background {
  519.                background-color: #1a4731;
  520.                color: #9ee5c9;
  521.            }
  522.            [data-theme-style='dark'] .file-links-icon {
  523.                color: #047857;
  524.            }
  525.  
  526.            /* VCard Links - Dark Theme */
  527.            [data-theme-style='dark'] .vcard-links-background {
  528.                background-color: #1a4044;
  529.                color: #8fe2da;
  530.            }
  531.            [data-theme-style='dark'] .vcard-links-icon {
  532.                color: #025e73;
  533.            }
  534.  
  535.            /* Event Links - Dark Theme */
  536.            [data-theme-style='dark'] .event-links-background {
  537.                background-color: #1a1c36;
  538.                color: #b6bde7;
  539.            }
  540.            [data-theme-style='dark'] .event-links-icon {
  541.                color: #3134a1;
  542.            }
  543.  
  544.            /* Splash pages - Dark Theme */
  545.            [data-theme-style='dark'] .splash-pages-background {
  546.                background-color: #1a1c36;
  547.                color: #99e0e7;
  548.            }
  549.            [data-theme-style='dark'] .splash-pages-icon {
  550.                color: #025e73;
  551.            }
  552.  
  553.            /* Domains - Dark Theme */
  554.            [data-theme-style='dark'] .domains-background {
  555.                background-color: #2d1e3f;
  556.                color: #d8c1f2;
  557.            }
  558.            [data-theme-style='dark'] .domains-icon {
  559.                color: #6d22a5;
  560.            }
  561.  
  562.            /* Projects - Dark Theme */
  563.            [data-theme-style='dark'] .projects-background {
  564.                background-color: #321a36;
  565.                color: #f0c9e7;
  566.            }
  567.            [data-theme-style='dark'] .projects-icon {
  568.                color: #a316af;
  569.            }
  570.        </style>
  571.  
  572.                    <div class="col-12 col-md-6 col-lg-4 p-4 icon-zoom-animation" data-aos="fade-up" data-aos-delay="100">
  573.                <div class="card index-highly-rounded border-0 d-flex flex-column justify-content-between h-100" data-toggle="tooltip" title="Create dynamic, advanced, and downloadable links to files.">
  574.                    <div class="card-body">
  575.                        <div class="file-links-background p-3 index-highly-rounded">
  576.                            <i class="fas fa-fw fa-lg fa-file mr-3 file-links-icon"></i>
  577.                            <span class="h5">File connections</span>
  578.                        </div>
  579.                    </div>
  580.                </div>
  581.            </div>
  582.        
  583.                    <div class="col-12 col-md-6 col-lg-4 p-4 icon-zoom-animation" data-aos="fade-up" data-aos-delay="200">
  584.                <div class="card index-highly-rounded border-0 d-flex flex-column justify-content-between h-100" data-toggle="tooltip" title="Generate dynamic digital contact cards, tracked and downloadable.">
  585.                    <div class="card-body">
  586.                        <div class="vcard-links-background p-3 index-highly-rounded">
  587.                            <i class="fas fa-fw fa-lg fa-id-card mr-3 vcard-links-icon"></i>
  588.                            <span class="h5">vCard links</span>
  589.                        </div>
  590.                    </div>
  591.                </div>
  592.            </div>
  593.        
  594.                    <div class="col-12 col-md-6 col-lg-4 p-4 icon-zoom-animation" data-aos="fade-up" data-aos-delay="300">
  595.                <div class="card index-highly-rounded border-0 d-flex flex-column justify-content-between h-100" data-toggle="tooltip" title="Create downloadable and tracked calendar files dynamically.">
  596.                    <div class="card-body">
  597.                        <div class="event-links-background p-3 index-highly-rounded">
  598.                            <i class="fas fa-fw fa-lg fa-calendar mr-3 event-links-icon"></i>
  599.                            <span class="h5">Event links</span>
  600.                        </div>
  601.                    </div>
  602.                </div>
  603.            </div>
  604.        
  605.                    <div class="col-12 col-md-6 col-lg-4 p-4 icon-zoom-animation" data-aos="fade-up" data-aos-delay="400">
  606.                <div class="card index-highly-rounded border-0 d-flex flex-column justify-content-between h-100" data-toggle="tooltip" title="Utilize custom intermediary pages with countdowns for your links.">
  607.                    <div class="card-body">
  608.                        <div class="splash-pages-background p-3 index-highly-rounded">
  609.                            <i class="fas fa-fw fa-lg fa-droplet mr-3 splash-pages-icon"></i>
  610.                            <span class="h5">Introductory pages</span>
  611.                        </div>
  612.                    </div>
  613.                </div>
  614.            </div>
  615.        
  616.                    <div class="col-12 col-md-6 col-lg-4 p-4 icon-zoom-animation" data-aos="fade-up" data-aos-delay="500">
  617.                <div class="card index-highly-rounded border-0 d-flex flex-column justify-content-between h-100" data-toggle="tooltip" title="Connect your own domain or use our predefined options.">
  618.                    <div class="card-body">
  619.                        <div class="domains-background p-3 index-highly-rounded">
  620.                            <i class="fas fa-fw fa-lg fa-globe mr-3 domains-icon"></i>
  621.                            <span class="h5">Custom domains</span>
  622.                        </div>
  623.                    </div>
  624.                </div>
  625.            </div>
  626.        
  627.            </div>
  628. </div>
  629.  
  630.    <div class="container mt-8">
  631.        <div class="card py-4 index-highly-rounded border-0">
  632.            <div class="card-body">
  633.                <div class="text-center mb-4">
  634.                    <h2>URLs that automatically open apps</h2>
  635.                    <p class="text-muted">Short links that automatically detect the app being used and open it on mobile.</p>
  636.                </div>
  637.  
  638.                <div class="d-flex flex-wrap justify-content-center">
  639.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="AliExpress">
  640.                            <span title="AliExpress"><i class="fas fa-shopping-cart fa-fw fa-xl mx-1" style="color: #ff4747"></i></span>
  641.                        </div>
  642.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="TikTok">
  643.                            <span title="TikTok"><i class="fab fa-tiktok fa-fw fa-xl mx-1" style="color: #fc295d"></i></span>
  644.                        </div>
  645.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Reddit">
  646.                            <span title="Reddit"><i class="fab fa-reddit fa-fw fa-xl mx-1" style="color: #fc3a06"></i></span>
  647.                        </div>
  648.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="X">
  649.                            <span title="X"><i class="fab fa-x-twitter fa-fw fa-xl mx-1" style="color: #1da1f2"></i></span>
  650.                        </div>
  651.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="YouTube">
  652.                            <span title="YouTube"><i class="fab fa-youtube fa-fw fa-xl mx-1" style="color: #ff0000"></i></span>
  653.                        </div>
  654.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Instagram">
  655.                            <span title="Instagram"><i class="fab fa-instagram fa-fw fa-xl mx-1" style="color: #e1306c"></i></span>
  656.                        </div>
  657.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Whatsapp">
  658.                            <span title="Whatsapp"><i class="fab fa-whatsapp fa-fw fa-xl mx-1" style="color: #128c7e"></i></span>
  659.                        </div>
  660.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Snapchat">
  661.                            <span title="Snapchat"><i class="fab fa-snapchat fa-fw fa-xl mx-1" style="color: #FFB700"></i></span>
  662.                        </div>
  663.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Facebook Messenger">
  664.                            <span title="Facebook Messenger"><i class="fab fa-facebook-messenger fa-fw fa-xl mx-1" style="color: #0084ff"></i></span>
  665.                        </div>
  666.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Facebook">
  667.                            <span title="Facebook"><i class="fab fa-facebook fa-fw fa-xl mx-1" style="color: #1877f2"></i></span>
  668.                        </div>
  669.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Telegram">
  670.                            <span title="Telegram"><i class="fab fa-telegram fa-fw fa-xl mx-1" style="color: #0088cc"></i></span>
  671.                        </div>
  672.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Spotify">
  673.                            <span title="Spotify"><i class="fab fa-spotify fa-fw fa-xl mx-1" style="color: #2CD85C"></i></span>
  674.                        </div>
  675.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Apple Music">
  676.                            <span title="Apple Music"><i class="fab fa-apple fa-fw fa-xl mx-1" style="color: #f8506b"></i></span>
  677.                        </div>
  678.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="LinkedIn">
  679.                            <span title="LinkedIn"><i class="fab fa-linkedin fa-fw fa-xl mx-1" style="color: #0a66c2"></i></span>
  680.                        </div>
  681.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Pinterest">
  682.                            <span title="Pinterest"><i class="fab fa-pinterest fa-fw fa-xl mx-1" style="color: #e60023"></i></span>
  683.                        </div>
  684.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Twitch">
  685.                            <span title="Twitch"><i class="fab fa-twitch fa-fw fa-xl mx-1" style="color: #9146ff"></i></span>
  686.                        </div>
  687.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Netflix">
  688.                            <span title="Netflix"><i class="fas fa-film fa-fw fa-xl mx-1" style="color: #e50914"></i></span>
  689.                        </div>
  690.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Google Sheets">
  691.                            <span title="Google Sheets"><i class="fas fa-file fa-fw fa-xl mx-1" style="color: #25a465"></i></span>
  692.                        </div>
  693.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Google Docs">
  694.                            <span title="Google Docs"><i class="fas fa-file-word fa-fw fa-xl mx-1" style="color: #2a7efc"></i></span>
  695.                        </div>
  696.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Google Slides">
  697.                            <span title="Google Slides"><i class="fas fa-image fa-fw fa-xl mx-1" style="color: #fabe0b"></i></span>
  698.                        </div>
  699.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Google Maps">
  700.                            <span title="Google Maps"><i class="fas fa-map-location-dot fa-fw fa-xl mx-1" style="color: #4285f4"></i></span>
  701.                        </div>
  702.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Airbnb">
  703.                            <span title="Airbnb"><i class="fab fa-airbnb fa-fw fa-xl mx-1" style="color: #FF385c"></i></span>
  704.                        </div>
  705.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="TripAdvisor">
  706.                            <span title="TripAdvisor"><i class="fas fa-plane fa-fw fa-xl mx-1" style="color: #00AF87"></i></span>
  707.                        </div>
  708.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Amazon">
  709.                            <span title="Amazon"><i class="fab fa-amazon fa-fw fa-xl mx-1" style="color: #ff9900"></i></span>
  710.                        </div>
  711.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="StockX">
  712.                            <span title="StockX"><i class="fab fa-mixer fa-fw fa-xl mx-1" style="color: #00AF87"></i></span>
  713.                        </div>
  714.                                            <div class="bg-gray-100 index-highly-rounded w-fit-content p-3 m-4 icon-zoom-animation" data-toggle="tooltip" title="Booking.com">
  715.                            <span title="Booking.com"><i class="fas fa-hotel fa-fw fa-xl mx-1" style="color: #003580"></i></span>
  716.                        </div>
  717.                                    </div>
  718.            </div>
  719.        </div>
  720.    </div>
  721.  
  722. <div class="py-3"></div>
  723.  
  724. <div class="container mt-8">
  725.    <div class="card py-4 index-highly-rounded border-0 bg-gray-900">
  726.        <div class="card-body">
  727.            <div class="row justify-content-between">
  728.                <div class="col-12 col-lg-3 mb-4 mb-lg-0">
  729.                    <div class="text-center d-flex flex-column">
  730.                        <span class="font-weight-bold text-muted mb-3">Links</span>
  731.                        <span class="h1 text-gradient-primary" style="--gradient-one: var(--purple); --gradient-two: var(--pink);">655+</span>
  732.                    </div>
  733.                </div>
  734.  
  735.                                    <div class="col-12 col-lg-3 mb-4 mb-lg-0">
  736.                        <div class="text-center d-flex flex-column">
  737.                            <span class="font-weight-bold text-muted mb-3">QR Codes</span>
  738.                            <span class="h1 text-gradient-primary" style="--gradient-one: var(--teal); --gradient-two: var(--blue);">8+</span>
  739.                        </div>
  740.                    </div>
  741.                
  742.                <div class="col-12 col-lg-3 mb-4 mb-lg-0">
  743.                    <div class="text-center d-flex flex-column">
  744.                        <span class="font-weight-bold text-muted mb-3">Pageviews tracked</span>
  745.                        <span class="h1 text-gradient-primary" style="--gradient-one: var(--blue); --gradient-two: var(--purple);">417K+</span>
  746.                    </div>
  747.                </div>
  748.            </div>
  749.        </div>
  750.    </div>
  751. </div>
  752.  
  753. <div class="py-3"></div>
  754.  
  755.    <div class="container mt-8">
  756.        <div class="card py-4 border-0 index-highly-rounded">
  757.            <div class="card-body">
  758.                <div class="text-center mb-4">
  759.                    <h2>Tracking pixels</h2>
  760.                    <p class="text-muted">All the links seamlessly integrate with any of the following pixel providers.</p>
  761.                </div>
  762.  
  763.                <div class="row no-gutters">
  764.                                                                <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="0">
  765.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  766.                                <i class="fab fa-facebook fa-fw fa-lg mx-1" style="color: #1877f2"></i>
  767.                                <span class="h6">Facebook</span>
  768.                            </div>
  769.                        </div>
  770.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="100">
  771.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  772.                                <i class="fab fa-google fa-fw fa-lg mx-1" style="color: #4285f4"></i>
  773.                                <span class="h6">Google Analytics</span>
  774.                            </div>
  775.                        </div>
  776.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="200">
  777.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  778.                                <i class="fab fa-google fa-fw fa-lg mx-1" style="color: #34a853"></i>
  779.                                <span class="h6">Google Tag Manager</span>
  780.                            </div>
  781.                        </div>
  782.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="300">
  783.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  784.                                <i class="fab fa-linkedin fa-fw fa-lg mx-1" style="color: #0077b5"></i>
  785.                                <span class="h6">LinkedIn</span>
  786.                            </div>
  787.                        </div>
  788.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="400">
  789.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  790.                                <i class="fab fa-pinterest fa-fw fa-lg mx-1" style="color: #e60023"></i>
  791.                                <span class="h6">Pinterest</span>
  792.                            </div>
  793.                        </div>
  794.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="500">
  795.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  796.                                <i class="fab fa-x-twitter fa-fw fa-lg mx-1" style="color: #1da1f2"></i>
  797.                                <span class="h6">X</span>
  798.                            </div>
  799.                        </div>
  800.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="600">
  801.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  802.                                <i class="fab fa-quora fa-fw fa-lg mx-1" style="color: #a82400"></i>
  803.                                <span class="h6">Quora</span>
  804.                            </div>
  805.                        </div>
  806.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="700">
  807.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  808.                                <i class="fab fa-tiktok fa-fw fa-lg mx-1" style="color: #ff0050"></i>
  809.                                <span class="h6">TikTok</span>
  810.                            </div>
  811.                        </div>
  812.                                                                    <div class="col-12 col-md-6 col-lg-4 p-4" data-aos="fade-up" data-aos-delay="800">
  813.                            <div class="bg-gray-100 rounded-3x w-100 p-3 icon-zoom-animation text-truncate">
  814.                                <i class="fab fa-snapchat fa-fw fa-lg mx-1" style="color: #FFB700"></i>
  815.                                <span class="h6">Snapchat</span>
  816.                            </div>
  817.                        </div>
  818.                                                            </div>
  819.            </div>
  820.        </div>
  821.    </div>
  822.  
  823.  
  824.    <div class="py-3"></div>
  825.  
  826.    <div class="container mt-8">
  827.        <h2 class="text-center mb-4">126 useful tools <i class="fas fa-fw fa-xs fa-screwdriver-wrench text-muted ml-1"></i></h2>
  828.  
  829.        <div class="row position-relative">
  830.            <div class="index-fade"></div>
  831.  
  832.                                        <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="100">
  833.                    <div class="card rounded-2x"  style="background: #d72cef; border-color: #d72cef; color: white;">
  834.                        <div class="card-body">
  835.                            <div class="d-flex justify-content-between align-items-center">
  836.                                <div class="d-flex text-truncate">
  837.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #f5d2fe;">
  838.                                        <i class="fas fa-check-square fa-fw" style="color: #d72cef"></i>
  839.                                    </div>
  840.  
  841.                                    <div class="text-truncate ml-3">
  842.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  843.                                            <strong>Verification tools</strong>
  844.                                        </a>
  845.                                        <p class="text-truncate small m-0">A selection of excellent checker-type tools to assist you in checking and verifying various types of things.</p>
  846.                                    </div>
  847.                                </div>
  848.                            </div>
  849.                        </div>
  850.                    </div>
  851.                </div>
  852.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="200">
  853.                    <div class="card rounded-2x"  style="background: #64748b; border-color: #64748b; color: white;">
  854.                        <div class="card-body">
  855.                            <div class="d-flex justify-content-between align-items-center">
  856.                                <div class="d-flex text-truncate">
  857.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #dbeaff;">
  858.                                        <i class="fas fa-font fa-fw" style="color: #64748b"></i>
  859.                                    </div>
  860.  
  861.                                    <div class="text-truncate ml-3">
  862.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  863.                                            <strong>Text utilities</strong>
  864.                                        </a>
  865.                                        <p class="text-truncate small m-0">A set of text content-related tools to assist you in creating, modifying, and enhancing text-based content.</p>
  866.                                    </div>
  867.                                </div>
  868.                            </div>
  869.                        </div>
  870.                    </div>
  871.                </div>
  872.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="300">
  873.                    <div class="card rounded-2x"  style="background: #10b981; border-color: #10b981; color: white;">
  874.                        <div class="card-body">
  875.                            <div class="d-flex justify-content-between align-items-center">
  876.                                <div class="d-flex text-truncate">
  877.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #c0ffea;">
  878.                                        <i class="fas fa-exchange-alt fa-fw" style="color: #10b981"></i>
  879.                                    </div>
  880.  
  881.                                    <div class="text-truncate ml-3">
  882.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  883.                                            <strong>Conversion tools</strong>
  884.                                        </a>
  885.                                        <p class="text-truncate small m-0">A set of tools that allow you to effortlessly transform data.</p>
  886.                                    </div>
  887.                                </div>
  888.                            </div>
  889.                        </div>
  890.                    </div>
  891.                </div>
  892.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="400">
  893.                    <div class="card rounded-2x"  style="background: #0ea5e9; border-color: #0ea5e9; color: white;">
  894.                        <div class="card-body">
  895.                            <div class="d-flex justify-content-between align-items-center">
  896.                                <div class="d-flex text-truncate">
  897.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #c9eeff;">
  898.                                        <i class="fas fa-cogs fa-fw" style="color: #0ea5e9"></i>
  899.                                    </div>
  900.  
  901.                                    <div class="text-truncate ml-3">
  902.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  903.                                            <strong>Generator tools</strong>
  904.                                        </a>
  905.                                        <p class="text-truncate small m-0">A collection of the most useful generator tools that you can use to generate data.</p>
  906.                                    </div>
  907.                                </div>
  908.                            </div>
  909.                        </div>
  910.                    </div>
  911.                </div>
  912.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="500">
  913.                    <div class="card rounded-2x"  style="background: #3b82f6; border-color: #3b82f6; color: white;">
  914.                        <div class="card-body">
  915.                            <div class="d-flex justify-content-between align-items-center">
  916.                                <div class="d-flex text-truncate">
  917.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #ccdfff;">
  918.                                        <i class="fas fa-code fa-fw" style="color: #3b82f6"></i>
  919.                                    </div>
  920.  
  921.                                    <div class="text-truncate ml-3">
  922.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  923.                                            <strong>Developer Tools</strong>
  924.                                        </a>
  925.                                        <p class="text-truncate small m-0">A set of very useful tools primarily for developers and beyond.</p>
  926.                                    </div>
  927.                                </div>
  928.                            </div>
  929.                        </div>
  930.                    </div>
  931.                </div>
  932.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="600">
  933.                    <div class="card rounded-2x"  style="background: #f97316; border-color: #f97316; color: white;">
  934.                        <div class="card-body">
  935.                            <div class="d-flex justify-content-between align-items-center">
  936.                                <div class="d-flex text-truncate">
  937.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #ffd5b7;">
  938.                                        <i class="fas fa-image fa-fw" style="color: #f97316"></i>
  939.                                    </div>
  940.  
  941.                                    <div class="text-truncate ml-3">
  942.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  943.                                            <strong>Image editing tools</strong>
  944.                                        </a>
  945.                                        <p class="text-truncate small m-0">A set of tools that assist in modifying and converting image files.</p>
  946.                                    </div>
  947.                                </div>
  948.                            </div>
  949.                        </div>
  950.                    </div>
  951.                </div>
  952.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="700">
  953.                    <div class="card rounded-2x"  style="background: #32758c; border-color: #32758c; color: white;">
  954.                        <div class="card-body">
  955.                            <div class="d-flex justify-content-between align-items-center">
  956.                                <div class="d-flex text-truncate">
  957.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #c9eefb;">
  958.                                        <i class="fas fa-clock fa-fw" style="color: #32758c"></i>
  959.                                    </div>
  960.  
  961.                                    <div class="text-truncate ml-3">
  962.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  963.                                            <strong>Time conversion tools</strong>
  964.                                        </a>
  965.                                        <p class="text-truncate small m-0">A set of tools for converting dates and times.</p>
  966.                                    </div>
  967.                                </div>
  968.                            </div>
  969.                        </div>
  970.                    </div>
  971.                </div>
  972.                            <div class="col-12 col-lg-6 p-4 position-relative" data-aos="fade-in" data-aos-delay="800">
  973.                    <div class="card rounded-2x"  style="background: #a855f7; border-color: #a855f7; color: white;">
  974.                        <div class="card-body">
  975.                            <div class="d-flex justify-content-between align-items-center">
  976.                                <div class="d-flex text-truncate">
  977.                                    <div class="d-flex align-items-center justify-content-center rounded mr-3 tool-icon" style="background: #e4cdfa;">
  978.                                        <i class="fas fa-tools fa-fw" style="color: #a855f7"></i>
  979.                                    </div>
  980.  
  981.                                    <div class="text-truncate ml-3">
  982.                                        <a href="https://heo.li/tools" class="stretched-link text-decoration-none" style="color: white;">
  983.                                            <strong>Various tools</strong>
  984.                                        </a>
  985.                                        <p class="text-truncate small m-0">A variety of other random, yet excellent and useful tools.</p>
  986.                                    </div>
  987.                                </div>
  988.                            </div>
  989.                        </div>
  990.                    </div>
  991.                </div>
  992.                    </div>
  993.    </div>
  994.  
  995.  
  996.  
  997.  
  998.  
  999.  
  1000.  
  1001.  
  1002.    <div class="py-3"></div>
  1003.  
  1004.    <div class="container mt-8">
  1005.        <div class="text-center mb-5">
  1006.            <h2>%1$sResponses%2$s for your common %1$squeries%2$s</h2>
  1007.        </div>
  1008.  
  1009.        
  1010.        <div class="accordion index-faq" id="faq_accordion">
  1011.                            <div class="card index-highly-rounded">
  1012.                    <div class="card-body">
  1013.                        <div class="" id="faq_accordion_one">
  1014.                            <h3 class="mb-0">
  1015.                                <button class="btn btn-lg font-weight-bold btn-block d-flex justify-content-between text-gray-800 px-0 icon-zoom-animation" type="button" data-toggle="collapse" data-target="#faq_accordion_answer_one" aria-expanded="true" aria-controls="faq_accordion_answer_one">
  1016.                                    <span class="text-left">What kinds of payments do you accept?</span>
  1017.  
  1018.                                    <span data-icon>
  1019.                                        <i class="fas fa-fw fa-circle-chevron-down"></i>
  1020.                                    </span>
  1021.                                </button>
  1022.                            </h3>
  1023.                        </div>
  1024.  
  1025.                        <div id="faq_accordion_answer_one" class="collapse text-muted mt-3" aria-labelledby="faq_accordion_one" data-parent="#faq_accordion">
  1026.                            We accept payments through credit card, PayPal, and crypto as well                        </div>
  1027.                    </div>
  1028.                </div>
  1029.                            <div class="card index-highly-rounded">
  1030.                    <div class="card-body">
  1031.                        <div class="" id="faq_accordion_two">
  1032.                            <h3 class="mb-0">
  1033.                                <button class="btn btn-lg font-weight-bold btn-block d-flex justify-content-between text-gray-800 px-0 icon-zoom-animation" type="button" data-toggle="collapse" data-target="#faq_accordion_answer_two" aria-expanded="true" aria-controls="faq_accordion_answer_two">
  1034.                                    <span class="text-left">Is it possible to cancel my subscription?</span>
  1035.  
  1036.                                    <span data-icon>
  1037.                                        <i class="fas fa-fw fa-circle-chevron-down"></i>
  1038.                                    </span>
  1039.                                </button>
  1040.                            </h3>
  1041.                        </div>
  1042.  
  1043.                        <div id="faq_accordion_answer_two" class="collapse text-muted mt-3" aria-labelledby="faq_accordion_two" data-parent="#faq_accordion">
  1044.                            Yes, you can definitely cancel your subscription, and you will still have access to all the features you have paid for until the end of the paid date range.                        </div>
  1045.                    </div>
  1046.                </div>
  1047.                            <div class="card index-highly-rounded">
  1048.                    <div class="card-body">
  1049.                        <div class="" id="faq_accordion_three">
  1050.                            <h3 class="mb-0">
  1051.                                <button class="btn btn-lg font-weight-bold btn-block d-flex justify-content-between text-gray-800 px-0 icon-zoom-animation" type="button" data-toggle="collapse" data-target="#faq_accordion_answer_three" aria-expanded="true" aria-controls="faq_accordion_answer_three">
  1052.                                    <span class="text-left">Will I receive an invoice?</span>
  1053.  
  1054.                                    <span data-icon>
  1055.                                        <i class="fas fa-fw fa-circle-chevron-down"></i>
  1056.                                    </span>
  1057.                                </button>
  1058.                            </h3>
  1059.                        </div>
  1060.  
  1061.                        <div id="faq_accordion_answer_three" class="collapse text-muted mt-3" aria-labelledby="faq_accordion_three" data-parent="#faq_accordion">
  1062.                            Yes, an invoice will be automatically created for you whenever a payment is made from your account                        </div>
  1063.                    </div>
  1064.                </div>
  1065.                            <div class="card index-highly-rounded">
  1066.                    <div class="card-body">
  1067.                        <div class="" id="faq_accordion_four">
  1068.                            <h3 class="mb-0">
  1069.                                <button class="btn btn-lg font-weight-bold btn-block d-flex justify-content-between text-gray-800 px-0 icon-zoom-animation" type="button" data-toggle="collapse" data-target="#faq_accordion_answer_four" aria-expanded="true" aria-controls="faq_accordion_answer_four">
  1070.                                    <span class="text-left">May I receive a refund</span>
  1071.  
  1072.                                    <span data-icon>
  1073.                                        <i class="fas fa-fw fa-circle-chevron-down"></i>
  1074.                                    </span>
  1075.                                </button>
  1076.                            </h3>
  1077.                        </div>
  1078.  
  1079.                        <div id="faq_accordion_answer_four" class="collapse text-muted mt-3" aria-labelledby="faq_accordion_four" data-parent="#faq_accordion">
  1080.                            We provide refunds if anything goes wrong or you change your mind, just reach out to us if needed.                        </div>
  1081.                    </div>
  1082.                </div>
  1083.                            <div class="card index-highly-rounded">
  1084.                    <div class="card-body">
  1085.                        <div class="" id="faq_accordion_five">
  1086.                            <h3 class="mb-0">
  1087.                                <button class="btn btn-lg font-weight-bold btn-block d-flex justify-content-between text-gray-800 px-0 icon-zoom-animation" type="button" data-toggle="collapse" data-target="#faq_accordion_answer_five" aria-expanded="true" aria-controls="faq_accordion_answer_five">
  1088.                                    <span class="text-left">What makes this different from other tools?</span>
  1089.  
  1090.                                    <span data-icon>
  1091.                                        <i class="fas fa-fw fa-circle-chevron-down"></i>
  1092.                                    </span>
  1093.                                </button>
  1094.                            </h3>
  1095.                        </div>
  1096.  
  1097.                        <div id="faq_accordion_answer_five" class="collapse text-muted mt-3" aria-labelledby="faq_accordion_five" data-parent="#faq_accordion">
  1098.                            We focus on simplicity and performance. Our platform is lightweight, easy to use, and designed to help you achieve results faster.                        </div>
  1099.                    </div>
  1100.                </div>
  1101.                    </div>
  1102.    </div>
  1103.  
  1104.    
  1105.    <div class="py-3"></div>
  1106.  
  1107.    <div class="container mt-8">
  1108.        <div class="card index-highly-rounded border-0 index-cta py-5 py-lg-6" data-aos="fade-up">
  1109.            <div class="card-body row align-items-center justify-content-center">
  1110.                <div class="col-12 col-lg-5">
  1111.                    <div class="text-center text-lg-left mb-4 mb-lg-0">
  1112.                        <h2 class="h1">Begin</h2>
  1113.                        <p class="h5">Start using the versatile tool for marketers.</p>
  1114.                    </div>
  1115.                </div>
  1116.  
  1117.                <div class="col-12 col-lg-5 mt-4 mt-lg-0">
  1118.                    <div class="text-center text-lg-right">
  1119.                                                    <a href="https://heo.li/register" class="btn btn-primary zoom-animation">
  1120.                                Register <i class="fas fa-fw fa-arrow-right"></i>
  1121.                            </a>
  1122.                                            </div>
  1123.                </div>
  1124.            </div>
  1125.        </div>
  1126.    </div>
  1127.  
  1128.    <div class="py-3"></div>
  1129.  
  1130.    <div class="container mt-8">
  1131.        <div class="text-center mb-5">
  1132.            <h2>Latest <span class="text-primary">blog</span> articles</h2>
  1133.        </div>
  1134.  
  1135.        <div class="row">
  1136.                            <div class="col-12 col-lg-4 p-4">
  1137.                    <div class="card h-100 zoom-animation-subtle">
  1138.                        <div class="card-body">
  1139.                                                            <a href="https://heo.li/gb/blog/what-is-bcrypt-and-why-you-should-use-it-for-passwords" aria-label="What is Bcrypt and Why You Should Use It for Passwords">
  1140.                                    <img src="https://heo.li/uploads/blog/270c52f314199b794d757a1ac829afe9.webp" class="blog-post-image-small img-fluid w-100 rounded mb-4" alt="Bcrypt The Best Solution for Secure Password Storage" loading="lazy" />
  1141.                                </a>
  1142.                            
  1143.                            <a href="https://heo.li/gb/blog/what-is-bcrypt-and-why-you-should-use-it-for-passwords">
  1144.                                <h3 class="h5 card-title mb-2">What is Bcrypt and Why You Should Use It for Passwords</h3>
  1145.                            </a>
  1146.  
  1147.                            <p class="text-muted mb-0">Learn why Bcrypt is essential for password security, how it works, and why it’s safer than plain text storage.</p>
  1148.                        </div>
  1149.                    </div>
  1150.                </div>
  1151.                            <div class="col-12 col-lg-4 p-4">
  1152.                    <div class="card h-100 zoom-animation-subtle">
  1153.                        <div class="card-body">
  1154.                                                            <a href="https://heo.li/gb/blog/the-transformative-role-of-digital-marketing-in-modern-business-success" aria-label="The Transformative Role of Digital Marketing in Modern Business Success">
  1155.                                    <img src="https://heo.li/uploads/blog/f493d9b640a956af822d5259b0753ffe.webp" class="blog-post-image-small img-fluid w-100 rounded mb-4" alt="diverse digital marketing strategies including SEO, social media, email campaigns, and online ads boosting business performance on a virtual dashboard" loading="lazy" />
  1156.                                </a>
  1157.                            
  1158.                            <a href="https://heo.li/gb/blog/the-transformative-role-of-digital-marketing-in-modern-business-success">
  1159.                                <h3 class="h5 card-title mb-2">The Transformative Role of Digital Marketing in Modern Business Success</h3>
  1160.                            </a>
  1161.  
  1162.                            <p class="text-muted mb-0">Explore how digital marketing transforms business success through SEO, content, social media, PPC, and email to reach audiences and drive measurable growth.</p>
  1163.                        </div>
  1164.                    </div>
  1165.                </div>
  1166.                            <div class="col-12 col-lg-4 p-4">
  1167.                    <div class="card h-100 zoom-animation-subtle">
  1168.                        <div class="card-body">
  1169.                                                            <a href="https://heo.li/gb/blog/digital-marketing-trends-and-innovations-shaping-the-future-of-business" aria-label="Digital Marketing Trends and Innovations Shaping the Future of Business">
  1170.                                    <img src="https://heo.li/uploads/blog/d8ce6a73c37c2567dcf101ee23b2023d.webp" class="blog-post-image-small img-fluid w-100 rounded mb-4" alt="AI, voice search, AR, interactive video, and social shopping in a futuristic digital landscape" loading="lazy" />
  1171.                                </a>
  1172.                            
  1173.                            <a href="https://heo.li/gb/blog/digital-marketing-trends-and-innovations-shaping-the-future-of-business">
  1174.                                <h3 class="h5 card-title mb-2">Digital Marketing Trends and Innovations Shaping the Future of Business</h3>
  1175.                            </a>
  1176.  
  1177.                            <p class="text-muted mb-0">Digital marketing in 2025 is led by AI, voice search, interactive content, and privacy-first strategies. Businesses must adapt to stay competitive in the new era.</p>
  1178.                        </div>
  1179.                    </div>
  1180.                </div>
  1181.                    </div>
  1182.    </div>
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.        </main>
  1189.  
  1190.        
  1191.        <div class="container d-print-none">
  1192.            <footer class="footer app-footer">
  1193.                
  1194. <div class="d-flex flex-column flex-lg-row justify-content-between mb-3">
  1195.    <div class="mb-3 mb-lg-0">
  1196.        <a
  1197.            class="h5 footer-heading"
  1198.            href="https://heo.li/"
  1199.            data-logo
  1200.            data-light-value="https://heo.li/uploads/main/2a11e7f7a3ad4b1134ece7d6cfa2af16.webp"
  1201.            data-light-class="mb-2 footer-logo"
  1202.            data-light-tag="img"
  1203.            data-dark-value="https://heo.li/uploads/main/7732c7117ad7922758e5f0eeffbe059f.webp"
  1204.            data-dark-class="mb-2 footer-logo"
  1205.            data-dark-tag="img"
  1206.        >
  1207.                            <img src="https://heo.li/uploads/main/2a11e7f7a3ad4b1134ece7d6cfa2af16.webp" class="mb-2 footer-logo" alt="Website emblem" />
  1208.                    </a>
  1209.        <div class="text-muted">Copyright © 2025 Heo Links.</div>
  1210.    </div>
  1211.  
  1212.    <div class="d-flex flex-row flex-truncate">
  1213.                    <div class="dropdown mr-3 ml-lg-3 mr-lg-0">
  1214.                <button type="button" class="btn btn-link text-decoration-none p-0" id="language_switch" data-tooltip data-tooltip-hide-on-click title="Choose a language" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  1215.                    <i class="fas fa-fw fa-sm fa-language mr-1"></i> English                </button>
  1216.  
  1217.                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="language_switch">
  1218.                                                                                                                                                <a href="https://heo.li/gb/" class="dropdown-item" data-set-language="English">
  1219.                                                                    <i class="fas fa-fw fa-sm fa-check mr-2 text-success"></i>
  1220.                                
  1221.                                English                            </a>
  1222.                                                                                                                            <a href="https://heo.li/id/" class="dropdown-item" data-set-language="Indonesia">
  1223.                                                                                                            <span class="mr-2">🇮🇩</span>
  1224.                                                                    
  1225.                                Indonesia                            </a>
  1226.                                                                                                                            <a href="https://heo.li/ro/" class="dropdown-item" data-set-language="romanian">
  1227.                                                                                                            <i class="fas fa-fw fa-sm fa-circle-notch mr-2 text-muted"></i>
  1228.                                                                    
  1229.                                romanian                            </a>
  1230.                                                                                                                            <a href="https://heo.li/ro/" class="dropdown-item" data-set-language="Romanian">
  1231.                                                                                                            <span class="mr-2">🇷🇴</span>
  1232.                                                                    
  1233.                                Romanian                            </a>
  1234.                                                            </div>
  1235.            </div>
  1236.  
  1237.                    
  1238.                    <div class="dropdown mr-3 ml-lg-3 mr-lg-0">
  1239.                <button type="button" class="btn btn-link text-decoration-none p-0" id="currency_switch" data-tooltip data-tooltip-hide-on-click title="Select currency" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  1240.                    <i class="fas fa-fw fa-sm fa-coins mr-1"></i> USD                </button>
  1241.  
  1242.                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="currency_switch">
  1243.                                            <a href="#" class="dropdown-item" data-set-currency="USD">
  1244.                                                            <i class="fas fa-fw fa-sm fa-check mr-2 text-success"></i>
  1245.                            
  1246.                            USD                        </a>
  1247.                                            <a href="#" class="dropdown-item" data-set-currency="IDR">
  1248.                                                            <span class="fas fa-fw text-muted mr-2">Rp</span>
  1249.                            
  1250.                            IDR                        </a>
  1251.                                    </div>
  1252.            </div>
  1253.  
  1254.                    
  1255.        
  1256.                    <div class="mr-3 ml-lg-3 mr-lg-0">
  1257.                <button type="button" id="switch_theme_style" class="btn btn-link text-decoration-none p-0" data-toggle="tooltip" title="Switch to Dark Mode" aria-label="Switch to Dark Mode" data-title-theme-style-light="Switch to Light Mode" data-title-theme-style-dark="Switch to Dark Mode">
  1258.                    <span data-theme-style="light" class=""><i class="fas fa-fw fa-sm fa-sun text-warning"></i></span>
  1259.                    <span data-theme-style="dark" class="d-none"><i class="fas fa-fw fa-sm fa-moon"></i></span>
  1260.                </button>
  1261.            </div>
  1262.  
  1263.                        </div>
  1264. </div>
  1265.  
  1266. <div class="row">
  1267.    <div class="col-12 col-lg mb-3 mb-lg-0">
  1268.        <ul class="list-style-none d-flex flex-column flex-lg-row flex-wrap m-0">
  1269.                            <li class="mb-2 mr-lg-3"><a href="https://heo.li/blog">Blog</a></li>
  1270.            
  1271.                                                <li class="mb-2 mr-lg-3"><a href="https://heo.li/affiliate">Partner</a></li>
  1272.                            
  1273.                            <li class="mb-2 mr-lg-3"><a href="https://heo.li/contact">Get in touch</a></li>
  1274.            
  1275.                            <li class="mb-2 mr-lg-3"><a href="#" data-cc="show-preferencesModal">Cookies</a></li>
  1276.            
  1277.                            <li class="mb-2 mr-lg-3"><a href="#" data-toggle="modal" data-target="#push_notifications_modal">Push notifications</a></li>
  1278.            
  1279.                                                <li class="mb-2 mr-lg-3">
  1280.                        <a href="https://heo.li/pages/guides" target="_blank">
  1281.                            
  1282.                            Guides                        </a>
  1283.                    </li>
  1284.                                    <li class="mb-2 mr-lg-3">
  1285.                        <a href="https://heo.li/gb/page/privacy-policy" target="_self">
  1286.                            
  1287.                            Privacy Policy                        </a>
  1288.                    </li>
  1289.                                    <li class="mb-2 mr-lg-3">
  1290.                        <a href="https://heo.li/gb/page/terms" target="_self">
  1291.                            
  1292.                            Terms and Conditions                        </a>
  1293.                    </li>
  1294.                                    </ul>
  1295.    </div>
  1296.  
  1297.  
  1298.    <div class="col-12 col-lg-auto">
  1299.        <div class="d-flex flex-wrap">
  1300.                                                                                                                                                                                                                                                                                </div>
  1301.    </div>
  1302. </div>
  1303.            </footer>
  1304.        </div>
  1305.  
  1306.        
  1307.        
  1308. <input type="hidden" name="global_site_url" value="https://heo.li/" />
  1309. <input type="hidden" name="global_url" value="https://heo.li/" />
  1310. <input type="hidden" name="global_token" value="a161f6e9d418b7a61546831aad81ac8e" />
  1311. <input type="hidden" name="global_number_decimal_point" value="." />
  1312. <input type="hidden" name="global_number_thousands_separator" value="," />
  1313.  
  1314. <script>
  1315.    'use strict';
  1316.    
  1317.    /* Some global variables */
  1318.    window.altum = {};
  1319.    let global_token = document.querySelector('input[name="global_token"]').value;
  1320.    let site_url = document.querySelector('input[name="global_site_url"]').value;
  1321.    let url = document.querySelector('input[name="global_url"]').value;
  1322.    let decimal_point = document.querySelector('[name="global_number_decimal_point"]').value;
  1323.    let thousands_separator = document.querySelector('[name="global_number_thousands_separator"]').value;
  1324. </script>
  1325.  
  1326.                    <script src="https://heo.li/themes/altum/assets/js/libraries/jquery.min.js?v=6000"></script>
  1327.                    <script src="https://heo.li/themes/altum/assets/js/libraries/popper.min.js?v=6000"></script>
  1328.                    <script src="https://heo.li/themes/altum/assets/js/libraries/bootstrap.min.js?v=6000"></script>
  1329.                    <script src="https://heo.li/themes/altum/assets/js/custom.js?v=6000"></script>
  1330.        
  1331.                    <script src="https://heo.li/themes/altum/assets/js/libraries/fontawesome.min.js?v=6000" defer></script>
  1332.                    <script src="https://heo.li/themes/altum/assets/js/libraries/fontawesome-solid.min.js?v=6000" defer></script>
  1333.                    <script src="https://heo.li/themes/altum/assets/js/libraries/fontawesome-brands.modified.js?v=6000" defer></script>
  1334.        
  1335.                    <script>
  1336.                'use strict';
  1337.  
  1338.                let payment_frequency_handler = (event = null) => {
  1339.  
  1340.                    let payment_frequency = null;
  1341.  
  1342.                    if(event) {
  1343.                        payment_frequency = $(event.currentTarget).data('payment-frequency');
  1344.                    } else {
  1345.                        payment_frequency = $('[name="payment_frequency"]:checked').closest('label').data('payment-frequency');
  1346.                    }
  1347.  
  1348.                    const frequencies = ['monthly', 'quarterly', 'biannual', 'annual', 'lifetime'];
  1349.  
  1350.                    frequencies.forEach(freq => {
  1351.                        const $el = $(`[data-plan-payment-frequency="${freq}"]`);
  1352.                        if(freq === payment_frequency) {
  1353.                            $el.removeClass('d-none').addClass('d-inline-block');
  1354.                        } else {
  1355.                            $el.removeClass('d-inline-block').addClass('d-none');
  1356.                        }
  1357.                    });
  1358.  
  1359.                    $(`[data-plan-payment-frequency="${payment_frequency}"]`).addClass('d-inline-block');
  1360.  
  1361.                    $(`[data-plan-${payment_frequency}="true"]`).removeClass('d-none').addClass('');
  1362.                    $(`[data-plan-${payment_frequency}="false"]`).addClass('d-none').removeClass('');
  1363.  
  1364.                };
  1365.  
  1366.                $('[data-payment-frequency]').on('click', payment_frequency_handler);
  1367.  
  1368.                payment_frequency_handler();
  1369.            </script>
  1370.        <script type="application/ld+json">
  1371.    {
  1372.        "@context": "https://schema.org",
  1373.        "@type": "SoftwareApplication",
  1374.        "name": "Heo Links",
  1375.        "description": "Do Everything With One Platform Marketing Wizard",
  1376.        "applicationCategory": "WebApplication",
  1377.        "operatingSystem": "All",
  1378.        "url": "https://heo.li/",
  1379.            "image": "https://heo.li/uploads/main/2a11e7f7a3ad4b1134ece7d6cfa2af16.webp",
  1380.            "offers": [{"@type":"Offer","name":"FREE","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/plan"},{"@type":"Offer","name":"Custom","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/plan"},{"@type":"Offer","name":"BASIC - Monthly","price":"2.20","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/1"},{"@type":"Offer","name":"BASIC - Quarterly","price":"5.94","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/1"},{"@type":"Offer","name":"BASIC - Twice a year","price":"12.54","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/1"},{"@type":"Offer","name":"BASIC - Yearly","price":"23.76","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/1"},{"@type":"Offer","name":"BASIC - Lifetime","price":"118.80","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/1"},{"@type":"Offer","name":"BASIC PLUS - Monthly","price":"3.55","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/2"},{"@type":"Offer","name":"BASIC PLUS - Quarterly","price":"9.59","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/2"},{"@type":"Offer","name":"BASIC PLUS - Twice a year","price":"20.24","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/2"},{"@type":"Offer","name":"BASIC PLUS - Yearly","price":"38.34","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/2"},{"@type":"Offer","name":"BASIC PLUS - Lifetime","price":"191.70","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/2"},{"@type":"Offer","name":"PREMIUM - Monthly","price":"5.50","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/3"},{"@type":"Offer","name":"PREMIUM - Quarterly","price":"14.85","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/3"},{"@type":"Offer","name":"PREMIUM - Twice a year","price":"31.35","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/3"},{"@type":"Offer","name":"PREMIUM - Yearly","price":"59.40","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/3"},{"@type":"Offer","name":"PREMIUM - Lifetime","price":"297","priceCurrency":"USD","availability":"https:\/\/schema.org\/InStock","url":"https:\/\/heo.li\/pay\/3"}]    }
  1381. </script>
  1382.  
  1383.                                    <script>
  1384.    'use strict';
  1385.  
  1386.                                        let claim_button_default_href = document.querySelector('#claim_button').href;
  1387.                                        ['change', 'paste', 'keyup', 'keypress'].forEach(event_type => document.querySelector('#claim_url').addEventListener(event_type, event => {
  1388.                                            let url = get_slug(document.querySelector('#claim_url').value);
  1389.                                            let domain_id_element = document.querySelector('#domain_id');
  1390.                                            let domain_id = domain_id_element ? domain_id_element.value : null;
  1391.  
  1392.                                            let query_params = new URLSearchParams();
  1393.                                            if(url) query_params.set('claim-url', url);
  1394.                                            if(domain_id) query_params.set('domain-id', domain_id);
  1395.  
  1396.                                            document.querySelector('#claim_button').href = query_params.toString()
  1397.                                                ? `${claim_button_default_href}?${query_params}`
  1398.                                                : claim_button_default_href;
  1399.  
  1400.                                            if(event.key === 'Enter') {
  1401.                                                event.preventDefault();
  1402.                                                document.querySelector('#claim_button').click();
  1403.                                            }
  1404.                                        }));
  1405.                                    </script>
  1406.                                    <script>
  1407.        'use strict';
  1408.  
  1409.        $('#faq_accordion').on('show.bs.collapse', event => {
  1410.            let svg = event.target.parentElement.querySelector('[data-icon] svg')
  1411.            svg.style.transform = 'rotate(180deg)';
  1412.            svg.style.color = 'var(--primary)';
  1413.        })
  1414.  
  1415.        $('#faq_accordion').on('hide.bs.collapse', event => {
  1416.            let svg = event.target.parentElement.querySelector('[data-icon] svg')
  1417.            svg.style.color = 'var(--primary-800)';
  1418.            svg.style.removeProperty('transform');
  1419.        })
  1420.    </script>
  1421.    <script src="https://heo.li/themes/altum/assets/js/libraries/aos.min.js?v=6000"></script>
  1422.  
  1423. <script>
  1424.    'use strict';
  1425.  
  1426.    AOS.init({
  1427.        duration: 600
  1428.    });
  1429. </script>
  1430. <script type="application/ld+json">
  1431.    {
  1432.        "@context": "https://schema.org",
  1433.        "@type": "Organization",
  1434.        "name": "Heo Links",
  1435.        "url": "https://heo.li/",
  1436.            "logo": "https://heo.li/uploads/main/2a11e7f7a3ad4b1134ece7d6cfa2af16.webp",
  1437.            "slogan": "Do Everything With One Platform Marketing Wizard",
  1438.        "contactPoint": {
  1439.            "@type": "ContactPoint",
  1440.            "url": "https://heo.li/contact",
  1441.            "contactType": "Contact us"
  1442.        }
  1443.    }
  1444. </script>
  1445.  
  1446. <script type="application/ld+json">
  1447.    {
  1448.        "@context": "https://schema.org",
  1449.        "@type": "BreadcrumbList",
  1450.        "itemListElement": [
  1451.            {
  1452.                "@type": "ListItem",
  1453.                "position": 1,
  1454.                "name": "Smart Links, Secure Connections, Creativity in Linking",
  1455.                    "item": "https://heo.li/"
  1456.                }
  1457.            ]
  1458.        }
  1459. </script>
  1460.  
  1461.        <script type="application/ld+json">
  1462.        {
  1463.            "@context": "https://schema.org",
  1464.            "@type": "FAQPage",
  1465.            "mainEntity": [{"@type":"Question","name":"What kinds of payments do you accept?","acceptedAnswer":{"@type":"Answer","text":"We accept payments through credit card, PayPal, and crypto as well"}},{"@type":"Question","name":"Is it possible to cancel my subscription?","acceptedAnswer":{"@type":"Answer","text":"Yes, you can definitely cancel your subscription, and you will still have access to all the features you have paid for until the end of the paid date range."}},{"@type":"Question","name":"Will I receive an invoice?","acceptedAnswer":{"@type":"Answer","text":"Yes, an invoice will be automatically created for you whenever a payment is made from your account"}},{"@type":"Question","name":"May I receive a refund","acceptedAnswer":{"@type":"Answer","text":"We provide refunds if anything goes wrong or you change your mind, just reach out to us if needed."}},{"@type":"Question","name":"What makes this different from other tools?","acceptedAnswer":{"@type":"Answer","text":"We focus on simplicity and performance. Our platform is lightweight, easy to use, and designed to help you achieve results faster."}}]        }
  1466.    </script>
  1467.            <script>
  1468.                'use strict';
  1469.  
  1470.                document.querySelectorAll('[data-set-language]').forEach(element => element.addEventListener('click', event => {
  1471.                    let language = event.currentTarget.getAttribute('data-set-language');
  1472.                    set_cookie(`set_language`, language, 90, "\/");
  1473.                }));
  1474.            </script>
  1475.                        <script>
  1476.                'use strict';
  1477.  
  1478.                document.querySelectorAll('[data-set-currency]').forEach(element => element.addEventListener('click', event => {
  1479.                    let currency = event.currentTarget.getAttribute('data-set-currency');
  1480.                    set_cookie(`set_currency`, currency, 90, "\/");
  1481.                    window.location.reload();
  1482.                    event.preventDefault();
  1483.                }));
  1484.            </script>
  1485.            <script>
  1486.    'use strict';
  1487.    
  1488.    let switch_theme_style = document.querySelector('#switch_theme_style');
  1489.  
  1490.    if(switch_theme_style) {
  1491.        switch_theme_style.addEventListener('click', event => {
  1492.            let theme_style = document.querySelector('body[data-theme-style]').getAttribute('data-theme-style');
  1493.            let new_theme_style = theme_style == 'light' ? 'dark' : 'light';
  1494.  
  1495.            /* Set a cookie with the new theme style */
  1496.            document.cookie = 'theme_style=' + encodeURIComponent(new_theme_style) + '; max-age=' + (30 * 24 * 60 * 60) + '; path="\/"';
  1497.  
  1498.            /* Change the css and button on the page */
  1499.            let css = document.querySelector(`#css_theme_style`);
  1500.  
  1501.            document.querySelector(`body[data-theme-style]`).setAttribute('data-theme-style', new_theme_style);
  1502.  
  1503.            switch (new_theme_style) {
  1504.                case 'dark':
  1505.                    css.setAttribute('href', "https:\/\/heo.li\/themes\/altum\/assets\/css\/bootstrap-dark.min.css?v=6000");
  1506.                    document.body.classList.add('cc--darkmode');
  1507.                    break;
  1508.  
  1509.                case 'light':
  1510.                    css.setAttribute('href', "https:\/\/heo.li\/themes\/altum\/assets\/css\/bootstrap.min.css?v=6000");
  1511.                    document.body.classList.remove('cc--darkmode');
  1512.                    break;
  1513.            }
  1514.  
  1515.            /* Refresh the logo/title */
  1516.            document.querySelectorAll('[data-logo]').forEach(element => {
  1517.                let new_brand_value = element.getAttribute(`data-${new_theme_style}-value`);
  1518.                let new_brand_class = element.getAttribute(`data-${new_theme_style}-class`);
  1519.                let new_brand_tag = element.getAttribute(`data-${new_theme_style}-tag`)
  1520.                let new_brand_html = new_brand_tag == 'img' ? `<img src="${new_brand_value}" class="${new_brand_class}" alt="Website emblem" />` : `<${new_brand_tag} class="${new_brand_class}">${new_brand_value}</${new_brand_tag}>`;
  1521.                element.innerHTML = new_brand_html;
  1522.            });
  1523.  
  1524.  
  1525.            document.querySelector(`#switch_theme_style`).setAttribute('data-original-title', document.querySelector(`#switch_theme_style`).getAttribute(`data-title-theme-style-${theme_style}`));
  1526.            document.querySelector(`#switch_theme_style [data-theme-style="${new_theme_style}"]`).classList.remove('d-none');
  1527.            document.querySelector(`#switch_theme_style [data-theme-style="${theme_style}"]`).classList.add('d-none');
  1528.  
  1529.            if (typeof bootstrap !== 'undefined' && typeof bootstrap.Tooltip === 'function' && typeof Popper !== 'undefined') {
  1530.                $(`#switch_theme_style`).tooltip('hide').tooltip('show');
  1531.            }
  1532.  
  1533.            event.preventDefault();
  1534.        });
  1535.  
  1536.        document.addEventListener('keydown', event => {
  1537.            if((event.ctrlKey || event.metaKey) && event.key === 'i') {
  1538.                event.preventDefault();
  1539.                switch_theme_style.click();
  1540.  
  1541.                if (typeof bootstrap !== 'undefined' && typeof bootstrap.Tooltip === 'function' && typeof Popper !== 'undefined') {
  1542.                    $(`#switch_theme_style`).tooltip('hide');
  1543.                }
  1544.            }
  1545.        });
  1546.    }
  1547. </script>
  1548.    <script>
  1549.    'use strict';
  1550.    
  1551.        document.querySelector('[data-announcement-close]').addEventListener('click', event => {
  1552.            let type = event.currentTarget.getAttribute('data-announcement-close');
  1553.            let id = event.currentTarget.getAttribute('data-announcement-id');
  1554.            document.querySelector(`[data-announcement="${type}"]`).style.display = 'none';
  1555.            set_cookie(`announcement_${type}_id`, id, 15, "\/");
  1556.        })
  1557.    </script>
  1558.        <script src="https://heo.li/themes/altum/assets/js/libraries/cookieconsent.js?v=6000"></script>
  1559.    <link href="https://heo.li/themes/altum/assets/css/libraries/cookieconsent.css?v=6000" rel="stylesheet" media="screen">
  1560.    <style>
  1561.        :root {
  1562.            --cc-font-family: inherit;
  1563.            --cc-bg: hsla(0, 0%, 100%, 90%);
  1564.            --cc-separator-border-color: transparent;
  1565.  
  1566.            --cc-modal-border-radius: var(--border-radius);
  1567.            --cc-btn-border-radius: var(--border-radius);
  1568.  
  1569.            --cc-primary-color:var(--gray-700);
  1570.            --cc-secondary-color:var(--gray-600);
  1571.  
  1572.            --cc-btn-primary-color: var(--white);
  1573.            --cc-btn-primary-bg: var(--primary);
  1574.            --cc-btn-primary-hover-bg: var(--primary-600);
  1575.            --cc-btn-primary-color-bg: var(--white);
  1576.            --cc-btn-primary-hover-color: var(--white);
  1577.  
  1578.            --cc-btn-secondary-bg:var(--gray-300);
  1579.            --cc-btn-secondary-hover-bg:var(--gray-400);
  1580.  
  1581.            --cc-btn-secondary-hover-color: var(--black);
  1582.            --cc-btn-secondary-hover-border-color: var(--cc-btn-secondary-hover-bg);
  1583.        }
  1584.  
  1585.        .cc--darkmode {
  1586.            --cc-bg: hsla(0, 0%, 0%, 90%);
  1587.            --cc-separator-border-color: transparent;
  1588.        }
  1589.    </style>
  1590.  
  1591.    <script>
  1592.    'use strict';
  1593.    
  1594.        window.addEventListener('load', () => {
  1595.            let language_code = document.documentElement.getAttribute('lang');
  1596.            let language_direction = document.documentElement.getAttribute('dir');
  1597.            let translations = {};
  1598.  
  1599.            translations[language_code] = {
  1600.                consentModal: {
  1601.                    title: "We utilize cookies \ud83c\udf6a",
  1602.                    description: "Hello, this website uses essential cookies to ensure its proper operation and tracking cookies to understand how you interact with it. The latter will be set only after consent.",
  1603.                    acceptAllBtn: "Accept all",
  1604.                    acceptNecessaryBtn: "Reject all",
  1605.                    showPreferencesBtn: "Personalize",
  1606.                },
  1607.  
  1608.                preferencesModal: {
  1609.                    title: "Cookie settings",
  1610.                    acceptAllBtn: "Accept all",
  1611.                    acceptNecessaryBtn: "Reject all",
  1612.                    savePreferencesBtn: "Save settings",
  1613.                    closeIconLabel: "Close",
  1614.                    sections: [
  1615.                        {
  1616.                            title: "Cookie usage \ud83d\udce2",
  1617.                            description: "We use cookies to ensure the basic functions of the website and to enhance your online experience. You can choose for each category to opt-in\/out whenever you want. For more details regarding cookies and other sensitive data, please read the full <a href=\"https:\/\/heo.li\/page\/privacy-policy\" class=\"cc-link\">privacy policy<\/a>."                        },
  1618.  
  1619.                        {
  1620.                            title: "Strictly essential cookies",
  1621.                            description: "These cookies are crucial for the proper operation of my website. Without these cookies, the website would not function correctly.",
  1622.                            linkedCategory: 'necessary'
  1623.                        },
  1624.  
  1625.                                                {
  1626.                            title: "Performance and Analytics cookies",
  1627.                            description: "These cookies enable the website to recall the selections you made previously.",
  1628.                            linkedCategory: 'analytics'
  1629.                        },
  1630.                        
  1631.                                                {
  1632.                            title: "Advertising and Targeting cookies",
  1633.                            description: "These cookies gather information about your website usage, including the pages you visited and the links you clicked on. All the data is anonymized and cannot be used to identify you.",
  1634.                            linkedCategory: 'targeting'
  1635.                        },
  1636.                                            ]
  1637.                }
  1638.            };
  1639.  
  1640.            CookieConsent.run({
  1641.                categories: {
  1642.                    necessary: {
  1643.                        enabled: true,
  1644.                        readOnly: true,
  1645.                    },
  1646.                    analytics: {},
  1647.                    targeting: {},
  1648.                },
  1649.  
  1650.                language: {
  1651.                    rtl: language_direction == 'rtl' ? language_code : null,
  1652.                    default: language_code,
  1653.                    autoDetect: 'document',
  1654.                    translations
  1655.                },
  1656.  
  1657.                onFirstConsent: () => {
  1658.                    const preferences = CookieConsent.getUserPreferences();
  1659.                    window.dispatchEvent(new CustomEvent('cookie_consent_update', { detail: { accepted_categories: preferences.acceptedCategories } }));
  1660.  
  1661.                                    },
  1662.  
  1663.                onChange: () => {
  1664.                    const preferences = CookieConsent.getUserPreferences();
  1665.                    window.dispatchEvent(new CustomEvent('cookie_consent_update', { detail: { accepted_categories: preferences.acceptedCategories } }));
  1666.  
  1667.                    
  1668.                },
  1669.  
  1670.                guiOptions: {
  1671.                    consentModal: {
  1672.                        layout: "bar",
  1673.                        position: "bottom center",
  1674.                        flipButtons: false
  1675.                    },
  1676.                    preferencesModal: {
  1677.                        layout: 'box',
  1678.                    }
  1679.                },
  1680.            });
  1681.        });
  1682.    </script>
  1683.        <script>
  1684.        'use strict';
  1685.  
  1686.        /* ------------------------------
  1687.           DOM Elements & Data Storage
  1688.        ------------------------------ */
  1689.        const spotlight_wrapper = document.getElementById('spotlight_wrapper');
  1690.        const spotlight_modal = document.querySelector('.spotlight-modal');
  1691.        const spotlight_results = document.querySelector('#spotlight_results');
  1692.        let spotlight_results_array = [];
  1693.  
  1694.        /* ------------------------------
  1695.           Show / Hide Spotlight
  1696.        ------------------------------ */
  1697.        const spotlight_display = () => {
  1698.            spotlight_wrapper.classList.remove('d-none');
  1699.            requestAnimationFrame(() => {
  1700.                spotlight_wrapper.classList.add('show');
  1701.            });
  1702.            spotlight_wrapper.setAttribute('aria-hidden', 'false');
  1703.            document.querySelector('#spotlight_search').focus();
  1704.        };
  1705.  
  1706.        const spotlight_hide = () => {
  1707.            spotlight_wrapper.classList.remove('show');
  1708.            spotlight_wrapper.setAttribute('aria-hidden', 'true');
  1709.  
  1710.            setTimeout(() => {
  1711.                spotlight_wrapper.classList.add('d-none');
  1712.            }, 150);
  1713.        };
  1714.  
  1715.        /* ------------------------------
  1716.           Fetch Pages & Store Locally
  1717.        ------------------------------ */
  1718.        const spotlight_get_pages = async () => {
  1719.            const form = new FormData(document.querySelector('#spotlight_form'));
  1720.            const params = new URLSearchParams(form).toString();
  1721.  
  1722.            const response = await fetch(`${url}spotlight?global_token=${global_token}`, { method: 'get' });
  1723.            let data;
  1724.  
  1725.            try {
  1726.                data = await response.json();
  1727.            } catch (error) {
  1728.                return false;
  1729.            }
  1730.  
  1731.            if(!response.ok || data.status === 'error') {
  1732.                return false;
  1733.            } else {
  1734.                let results = data.details.map(obj => ({ ...obj, clicks: 0 }));
  1735.                localStorage.setItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_spotlight_results', JSON.stringify(results));
  1736.            }
  1737.  
  1738.            return data.details;
  1739.        };
  1740.  
  1741.        /* ------------------------------
  1742.           Build & Insert All Results Once
  1743.        ------------------------------ */
  1744.        const build_all_spotlight_results = (pages) => {
  1745.            // Sort them once by clicks (descending)
  1746.            pages.sort((a, b) => b.clicks - a.clicks);
  1747.  
  1748.            // Build in one shot
  1749.            let html = '';
  1750.            for (const page of pages) {
  1751.                // Include lowercase name/url as data attrs for quick toggling
  1752.                html += `
  1753.            <a
  1754.                href="${url}${page.url || ''}"
  1755.                target="_blank"
  1756.                class="my-3 p-3 bg-gray-50 rounded-2x position-relative text-decoration-none text-reset"
  1757.                style="display: block"
  1758.                data-spotlight-result-url="${page.url}"
  1759.                data-spotlight-result-name="${page.name}"
  1760.            >
  1761.                <div class="d-flex justify-content-between align-items-center">
  1762.                    <div>
  1763.                        <span>${page.name}</span>
  1764.                        <div class="small text-muted">${page.url ? '/' + page.url : url}</div>
  1765.                    </div>
  1766.                    <div>
  1767.                        <i class="fas fa-fw fa-lg fa-arrow-right text-muted"></i>
  1768.                    </div>
  1769.                </div>
  1770.            </a>
  1771.        `;
  1772.            }
  1773.  
  1774.            spotlight_results.innerHTML = html;
  1775.  
  1776.            document.querySelector('#spotlight_no_data').style.display = pages.length ? 'none' : 'block';
  1777.        };
  1778.  
  1779.        /* ------------------------------
  1780.           Toggle Display Instead of Re-rendering
  1781.        ------------------------------ */
  1782.        const filter_spotlight_results = (search_value) => {
  1783.            const spotlight_no_data = document.querySelector('#spotlight_no_data');
  1784.            const lower_search = search_value.toLowerCase();
  1785.            const links = spotlight_results.querySelectorAll('a[data-spotlight-result-url]');
  1786.            let matches = 0;
  1787.  
  1788.            links.forEach(link => {
  1789.                const page_name = link.getAttribute('data-spotlight-result-name').toLowerCase();
  1790.                const page_url = link.getAttribute('data-spotlight-result-url').toLowerCase();
  1791.  
  1792.                if(page_name.includes(lower_search) || page_url.includes(lower_search)) {
  1793.                    link.style.display = 'block';
  1794.                    matches++;
  1795.                } else {
  1796.                    link.style.display = 'none';
  1797.                }
  1798.            });
  1799.  
  1800.            // If no matches, show #spotlight_no_data
  1801.            spotlight_no_data.style.display = matches ? 'none' : 'block';
  1802.        };
  1803.  
  1804.        /* ------------------------------
  1805.           Initial Load
  1806.        ------------------------------ */
  1807.        const spotlight_init = async () => {
  1808.  
  1809.            // Show spinner only once, on load
  1810.            spotlight_results.innerHTML = `
  1811.        <div class="my-3 p-3 bg-gray-50 rounded-2x position-relative d-flex justify-content-center">
  1812.            <div class="spinner-border spinner-border-lg" role="status"></div>
  1813.        </div>
  1814.    `;
  1815.  
  1816.            // If no local results, fetch from server
  1817.            if(!get_cookie('spotlight_has_results')) {
  1818.                localStorage.removeItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_spotlight_results');
  1819.            }
  1820.            if(!localStorage.getItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_spotlight_results')) {
  1821.                const fetched_pages = await spotlight_get_pages();
  1822.                spotlight_results_array = fetched_pages || [];
  1823.            } else {
  1824.                spotlight_results_array = JSON.parse(localStorage.getItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_spotlight_results'));
  1825.            }
  1826.  
  1827.            set_cookie('spotlight_has_results', 1, 90, "\/");
  1828.  
  1829.            // Now build the entire set
  1830.            build_all_spotlight_results(spotlight_results_array);
  1831.  
  1832.            // Optional: highlight first result if you want
  1833.            const first_link = spotlight_results.querySelector('a');
  1834.            if(first_link) {
  1835.                first_link.dispatchEvent(new Event('mouseover', { bubbles: true }));
  1836.            }
  1837.        };
  1838.  
  1839.        /* ------------------------------
  1840.           Debounced Search on Input
  1841.        ------------------------------ */
  1842.        let search_timeout;
  1843.        const spotlight_process_search = () => {
  1844.            if(search_timeout) clearTimeout(search_timeout);
  1845.            search_timeout = setTimeout(() => {
  1846.                const search = document.querySelector('#spotlight_search').value;
  1847.  
  1848.                filter_spotlight_results(search);
  1849.            }, 100);
  1850.        };
  1851.  
  1852.        /* ------------------------------
  1853.           Track Clicks via Delegation
  1854.        ------------------------------ */
  1855.        spotlight_results.addEventListener('click', event => {
  1856.            const link = event.target.closest('a[data-spotlight-result-url]');
  1857.            if(!link) return;
  1858.  
  1859.            const result_url = link.getAttribute('data-spotlight-result-url');
  1860.            const page_obj = spotlight_results_array.find(p => p.url === result_url);
  1861.  
  1862.            if(page_obj) {
  1863.                page_obj.clicks += 1;
  1864.                localStorage.setItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_spotlight_results', JSON.stringify(spotlight_results_array));
  1865.            }
  1866.        });
  1867.  
  1868.        /* ------------------------------
  1869.           Keyboard Navigation
  1870.        ------------------------------ */
  1871.        const navigate_results = direction => {
  1872.            // Only get visible links
  1873.            const focusable_results = Array
  1874.                .from(spotlight_results.querySelectorAll('a'))
  1875.                .filter(a => a.style.display !== 'none');
  1876.  
  1877.            if(!focusable_results.length) return;
  1878.  
  1879.            // Where is the current focus?
  1880.            let current_index = focusable_results.indexOf(document.activeElement);
  1881.  
  1882.            // If nothing is focused yet, treat it as -1
  1883.            if(current_index === -1) current_index = -1;
  1884.  
  1885.            // Move up or down among only visible items
  1886.            if(direction === 'down') {
  1887.                current_index = (current_index + 1) % focusable_results.length;
  1888.            } else if(direction === 'up') {
  1889.                current_index = (current_index - 1 + focusable_results.length) % focusable_results.length;
  1890.            }
  1891.  
  1892.            focusable_results[current_index].focus();
  1893.        };
  1894.  
  1895.        /* ------------------------------
  1896.           Global Keydown for CTRL+K, etc.
  1897.        ------------------------------ */
  1898.        document.addEventListener('keydown', event => {
  1899.            if((event.ctrlKey || event.metaKey) && event.key === 'k') {
  1900.                event.preventDefault();
  1901.                spotlight_wrapper.getAttribute('aria-hidden') === 'true' ? spotlight_display() : spotlight_hide();
  1902.            }
  1903.  
  1904.            if(spotlight_wrapper.getAttribute('aria-hidden') === 'false') {
  1905.                if(event.key === 'Escape') {
  1906.                    spotlight_hide();
  1907.                } else if(event.key === 'ArrowDown') {
  1908.                    event.preventDefault();
  1909.                    navigate_results('down');
  1910.                } else if(event.key === 'ArrowUp') {
  1911.                    event.preventDefault();
  1912.                    navigate_results('up');
  1913.                } else if(event.key === 'Enter') {
  1914.                    /* handle enter if needed */
  1915.                } else {
  1916.                    document.querySelector('#spotlight_search').focus();
  1917.                }
  1918.            }
  1919.        });
  1920.  
  1921.        /* ------------------------------
  1922.           Hide on Click Outside
  1923.        ------------------------------ */
  1924.        spotlight_wrapper.addEventListener('click', event => {
  1925.            if(!spotlight_wrapper.classList.contains('d-none') && !spotlight_modal.contains(event.target)) {
  1926.                spotlight_hide();
  1927.            }
  1928.        });
  1929.  
  1930.        /* ------------------------------
  1931.           Attach Debounced Search
  1932.        ------------------------------ */
  1933.        ['change','paste','keyup'].forEach(event_type => {
  1934.            document.querySelector('#spotlight_search').addEventListener(event_type, spotlight_process_search);
  1935.        });
  1936.  
  1937.        /* ------------------------------
  1938.           Submit Form -> Go to First Result
  1939.        ------------------------------ */
  1940.        document.querySelector('#spotlight_form').addEventListener('submit', event => {
  1941.            event.preventDefault();
  1942.  
  1943.            const first_visible = Array
  1944.                .from(document.querySelectorAll('#spotlight_results a'))
  1945.                .find(a => a.style.display !== 'none');
  1946.  
  1947.            if(first_visible) {
  1948.                first_visible.click();
  1949.            }
  1950.        });
  1951.  
  1952.        /* ------------------------------
  1953.           Kick off initial load
  1954.        ------------------------------ */
  1955.        (async () => {
  1956.            await spotlight_init();
  1957.        })();
  1958.    </script>
  1959.        <style>
  1960.        /* Spotlight search */
  1961.        .spotlight-wrapper {
  1962.            background: hsla(0, 100%, 100%, 0.5);
  1963.            position: fixed;
  1964.            width: 100%;
  1965.            height: 100%;
  1966.            z-index: 200;
  1967.            display: flex;
  1968.            justify-content: center;
  1969.            align-items: center;
  1970.            opacity: 0;
  1971.            transition: opacity .15s;
  1972.            pointer-events: none;
  1973.        }
  1974.  
  1975.        [data-theme-style="dark"] .spotlight-wrapper {
  1976.            background: hsla(0, 100%, 0%, 0.5);
  1977.        }
  1978.  
  1979.        .spotlight-wrapper.show {
  1980.            opacity: 1;
  1981.            pointer-events: auto;
  1982.        }
  1983.  
  1984.        .spotlight-modal {
  1985.            padding: 2rem;
  1986.            border-radius: calc(2*var(--border-radius));
  1987.            background: var(--gray-100);
  1988.        }
  1989.  
  1990.        .spotlight-results {
  1991.            overflow-y: scroll;
  1992.            max-height: 29rem;
  1993.        }
  1994.  
  1995.        .spotlight-results a {
  1996.            border-radius: calc(2*var(--border-radius));
  1997.        }
  1998.  
  1999.        .spotlight-results a:focus-visible {
  2000.            outline: none;
  2001.        }
  2002.    </style>
  2003.    <div class="modal fade" id="push_notifications_modal" tabindex="-1" role="dialog" aria-hidden="true">
  2004.    <div class="modal-dialog modal-dialog-centered" role="document">
  2005.        <div class="modal-content">
  2006.  
  2007.            <div class="modal-body">
  2008.                <div class="d-flex justify-content-between mb-3">
  2009.                    <h5 class="modal-title">
  2010.                        <i class="fas fa-fw fa-sm fa-bolt-lightning text-dark mr-2"></i>
  2011.                        Push notifications                    </h5>
  2012.  
  2013.                    <button type="button" class="close" data-dismiss="modal" title="Close">
  2014.                        <span aria-hidden="true">&times;</span>
  2015.                    </button>
  2016.                </div>
  2017.  
  2018.                <div class="notification-container"></div>
  2019.  
  2020.                <p class="text-muted">You can sign up for our web push notifications if you want to get helpful content and non-spam promotions from us.</p>
  2021.  
  2022.                <div class="mt-4">
  2023.                    <div id="push_notifications_modal_incompatible" class="alert alert-info">Your browser window cannot receive push notifications.</div>
  2024.                    <button type="button" id="push_notifications_modal_subscribe" class="btn btn-block btn-primary d-none">Sign up</button>
  2025.                    <button type="button" id="push_notifications_modal_unsubscribe" class="btn btn-block btn-danger d-none">Unsubscribe</button>
  2026.                </div>
  2027.            </div>
  2028.  
  2029.        </div>
  2030.    </div>
  2031. </div>
  2032.  
  2033. <script>
  2034.    if('serviceWorker' in navigator) {
  2035.        let push_notifications_public_key = "BImoy0Rs4ulYgQZaE0sWtesJLzkLjgv_hx14E7uPWlKidBhuHS4WER7jHGir2ZSJGRd7YRhiNAgzZWucG2-5_Zs";
  2036.        navigator.serviceWorker.register("https:\/\/heo.li\/sw.js", {
  2037.            scope: "https:\/\/heo.li\/",
  2038.        });
  2039.  
  2040.        /* Get the current status of the web push subscription */
  2041.        let process_subscription_status = () => {
  2042.            return navigator.serviceWorker.ready.then(sw => {
  2043.                sw.pushManager.getSubscription()
  2044.                    .then(subscription => {
  2045.                        /* No subscription */
  2046.                        if(!subscription) {
  2047.                            document.querySelector('#push_notifications_modal_subscribe').classList.remove('d-none');
  2048.                            document.querySelector('#push_notifications_modal_unsubscribe').classList.add('d-none');
  2049.                        }
  2050.  
  2051.                        /* Subscribed */
  2052.                        else {
  2053.                            document.querySelector('#push_notifications_modal_subscribe').classList.add('d-none');
  2054.                            document.querySelector('#push_notifications_modal_unsubscribe').classList.remove('d-none');
  2055.                        }
  2056.  
  2057.                        document.querySelector('#push_notifications_modal_incompatible').classList.add('d-none');
  2058.                    });
  2059.            });
  2060.        }
  2061.  
  2062.        let unsubscribe = () => {
  2063.            pause_submit_button(document.querySelector('#push_notifications_modal_unsubscribe'));
  2064.  
  2065.            navigator.serviceWorker.ready.then(sw => {
  2066.                sw.pushManager.getSubscription().then(subscription => {
  2067.                    subscription.unsubscribe().then(event => {
  2068.                        subscription = subscription.toJSON();
  2069.  
  2070.                        /* Prepare form data */
  2071.                        let form = new FormData();
  2072.                        form.set('endpoint', subscription.endpoint);
  2073.                        form.set('auth', subscription.keys.auth);
  2074.                        form.set('p256dh', subscription.keys.p256dh);
  2075.  
  2076.                        /* Send request to server */
  2077.                        let response = fetch(`${url}push-subscribers/delete_ajax`, {
  2078.                            method: 'post',
  2079.                            body: form
  2080.                        })
  2081.  
  2082.                        enable_submit_button(document.querySelector('#push_notifications_modal_unsubscribe'));
  2083.                        process_subscription_status();
  2084.                    });
  2085.                })
  2086.            });
  2087.        }
  2088.  
  2089.        let request_push_notification_permission_and_subscribe = event => {
  2090.            event.preventDefault();
  2091.  
  2092.            Notification.requestPermission().then(permission => {
  2093.  
  2094.                if(permission === 'granted') {
  2095.                    navigator.serviceWorker.ready.then(sw => {
  2096.  
  2097.                        let subscribe = () => {
  2098.                            pause_submit_button(document.querySelector('#push_notifications_modal_subscribe'));
  2099.  
  2100.                            sw.pushManager.subscribe({
  2101.                                userVisibleOnly: true,
  2102.                                applicationServerKey: push_notifications_public_key
  2103.                            }).then(subscription => {
  2104.                                subscription = subscription.toJSON();
  2105.  
  2106.                                /* Prepare form data */
  2107.                                let form = new FormData();
  2108.                                form.set('endpoint', subscription.endpoint);
  2109.                                form.set('auth', subscription.keys.auth);
  2110.                                form.set('p256dh', subscription.keys.p256dh);
  2111.  
  2112.                                /* Send request to server */
  2113.                                let response = fetch(`${url}push-subscribers/create_ajax`, {
  2114.                                    method: 'post',
  2115.                                    body: form
  2116.                                });
  2117.  
  2118.                                enable_submit_button(document.querySelector('#push_notifications_modal_subscribe'));
  2119.                                process_subscription_status();
  2120.                            });
  2121.                        }
  2122.  
  2123.                        /* Get current subscription */
  2124.                        sw.pushManager.getSubscription()
  2125.                            .then(subscription => {
  2126.                                /* No subscription, try to subscribe */
  2127.                                if(!subscription) {
  2128.                                    subscribe();
  2129.                                }
  2130.  
  2131.                                /* Subscribed */
  2132.                                else {
  2133.                                    unsubscribe();
  2134.                                    subscribe();
  2135.                                }
  2136.                            });
  2137.  
  2138.                    });
  2139.                }
  2140.  
  2141.                if(permission == 'denied') {
  2142.                    alert("You have turned off or blocked push notifications. You need to enable them again in the browser settings to subscribe.");
  2143.                }
  2144.  
  2145.            });
  2146.        }
  2147.  
  2148.        /* On subscribe click */
  2149.        document.querySelector('#push_notifications_modal_subscribe').addEventListener('click', request_push_notification_permission_and_subscribe);
  2150.  
  2151.        /* On unsubscribe click */
  2152.        document.querySelector('#push_notifications_modal_unsubscribe').addEventListener('click', unsubscribe);
  2153.  
  2154.        /* On modal show */
  2155.        $('#push_notifications_modal').on('show.bs.modal', event => {
  2156.            process_subscription_status();
  2157.        });
  2158.  
  2159.                let minimum_push_pageviews_count = 3;
  2160.        let session_push_pageviews_count = parseInt(sessionStorage.getItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_pageviews_count') ?? 0);
  2161.  
  2162.        /* Only display modal if it was not already shown to the user */
  2163.        if(session_push_pageviews_count >= minimum_push_pageviews_count && !get_cookie('push_notifications_modal_has_been_shown')) {
  2164.            process_subscription_status().then(() => {
  2165.                /* Only display modal if it's supported by the browser */
  2166.                if(!document.querySelector('#push_notifications_modal_incompatible').classList.contains('d-none')) {
  2167.  
  2168.                    setTimeout(() => {
  2169.                        $('#push_notifications_modal').modal('show');
  2170.  
  2171.                        set_cookie(`push_notifications_modal_has_been_shown`, '1', 90, "\/");
  2172.                    }, 2 * 1000);
  2173.  
  2174.                }
  2175.            });
  2176.        }
  2177.  
  2178.        sessionStorage.setItem('3e25f4e4ebb0e6cdc8210fd4d276ba10_push_pageviews_count', session_push_pageviews_count + 1);
  2179.            } else {
  2180.        /* ;) */
  2181.    }
  2182. </script>
  2183.    </body>
  2184. </html>
  2185.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda