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