{"id":17,"date":"2026-07-26T16:51:55","date_gmt":"2026-07-26T16:51:55","guid":{"rendered":"https:\/\/digitalgrowth.digital\/?page_id=17"},"modified":"2026-07-26T19:23:22","modified_gmt":"2026-07-26T19:23:22","slug":"tools","status":"publish","type":"page","link":"https:\/\/digitalgrowth.digital\/?page_id=17","title":{"rendered":"Tools"},"content":{"rendered":"\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,700&family=Inter:wght@400;500;600;700&family=IBM+Plex+Mono:wght@500&display=swap');\n  :root{\n    --bg:#EEF2ED; --ink:#1C1B18; --forest:#1B4332; --forest-deep:#10281E;\n    --amber:#E8A33D; --clay:#A45C28; --line:rgba(28,27,24,0.12); --paper:#FBFAF6;\n  }\n  *{box-sizing:border-box;}\n  body{ margin:0; background:var(--bg); color:var(--ink); font-family:'Inter',sans-serif; line-height:1.55; }\n  h1,h2,h3{ font-family:'Fraunces',serif; font-weight:600; margin:0; letter-spacing:-0.01em; color:var(--forest-deep); }\n  a{ color:inherit; text-decoration:none; }\n  .wrap{ max-width:1120px; margin:0 auto; padding:0 24px; }\n  .eyebrow{ font-family:'IBM Plex Mono',monospace; font-size:12px; letter-spacing:0.12em; text-transform:uppercase; color:var(--clay); display:flex; align-items:center; gap:8px; margin-bottom:14px; }\n  .eyebrow::after{ content:\"\"; flex:1; height:1px; background:var(--line); max-width:60px; }\n  nav{ position:sticky; top:0; z-index:50; background:rgba(238,242,237,0.9); backdrop-filter:blur(8px); border-bottom:1px solid var(--line); }\n  nav .wrap{ display:flex; align-items:center; justify-content:space-between; height:72px; }\n  .logo{ font-family:'Fraunces',serif; font-weight:700; font-size:19px; }\n  .logo .dot{ color:var(--amber); }\n  .nav-links{ display:flex; gap:24px; font-size:14px; font-weight:500; }\n  .nav-links a{ opacity:0.75; } .nav-links a:hover{ opacity:1; }\n  .nav-links a.current{ opacity:1; color:var(--forest); font-weight:700; }\n  .btn{ display:inline-flex; align-items:center; gap:8px; font-weight:600; font-size:14px; padding:11px 20px; border-radius:3px; cursor:pointer; border:none; }\n  .btn-primary{ background:var(--amber); color:var(--forest-deep); }\n  .btn-primary:hover{ box-shadow:0 6px 18px rgba(232,163,61,0.4); }\n  header.page-head{ padding:72px 0 40px; }\n  header.page-head p{ font-size:18px; max-width:620px; color:rgba(28,27,24,0.75); }\n  header.page-head h1{ font-size:clamp(34px,4.8vw,52px); margin-bottom:16px; }\n\n  .tool-panel{ background:var(--forest-deep); border-radius:8px; padding:44px; margin-bottom:36px; color:#EFEDE4; }\n  .tool-panel h2{ color:#fff; font-size:22px; margin-bottom:6px; }\n  .tool-panel p.sub{ color:rgba(239,237,228,0.65); font-size:14px; margin-bottom:28px; }\n  .speed-display{ display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin-bottom:26px; }\n  .speed-stat{ background:rgba(255,255,255,0.05); border:1px solid rgba(255,255,255,0.12); border-radius:6px; padding:18px; text-align:center; }\n  .speed-stat b{ font-family:'Fraunces',serif; font-size:28px; display:block; color:var(--amber); }\n  .speed-stat span{ font-size:11px; font-family:'IBM Plex Mono',monospace; color:rgba(239,237,228,0.6); }\n  #run-test{ background:var(--amber); color:var(--forest-deep); padding:14px 26px; border-radius:4px; font-weight:700; font-size:14px; }\n  #run-test:disabled{ opacity:0.6; cursor:default; }\n  #status-line{ font-family:'IBM Plex Mono',monospace; font-size:13px; color:rgba(239,237,228,0.6); margin-top:14px; }\n\n  .section-title{ font-size:22px; margin:8px 0 4px; }\n  .section-sub{ font-size:14px; color:rgba(28,27,24,0.65); margin-bottom:24px; max-width:600px; }\n\n  details.tool-card{ background:var(--paper); border:1px solid var(--line); border-radius:6px; margin-bottom:14px; overflow:hidden; }\n  details.tool-card summary{ list-style:none; cursor:pointer; padding:20px 24px; display:flex; justify-content:space-between; align-items:center; font-weight:700; font-size:15px; color:var(--forest-deep); }\n  details.tool-card summary::-webkit-details-marker{ display:none; }\n  details.tool-card summary .plus{ font-family:'IBM Plex Mono',monospace; color:var(--clay); font-size:18px; }\n  details.tool-card[open] summary .plus{ transform:rotate(45deg); }\n  .tool-body{ padding:0 24px 26px; }\n  .tool-body p.desc{ font-size:13px; color:rgba(28,27,24,0.65); margin:0 0 18px; }\n  .tool-body label{ font-size:12px; font-weight:700; color:var(--forest-deep); display:block; margin-bottom:5px; }\n  .tool-body input[type=text], .tool-body input[type=number], .tool-body input[type=url], .tool-body select, .tool-body textarea{\n    font-family:'Inter',sans-serif; font-size:14px; padding:10px 12px; border:1px solid var(--line); border-radius:4px; background:#fff; width:100%; margin-bottom:14px;\n  }\n  .row-inline{ display:flex; gap:12px; flex-wrap:wrap; }\n  .row-inline > div{ flex:1; min-width:140px; }\n  .tool-btn{ background:var(--forest); color:#fff; padding:10px 18px; border-radius:4px; font-weight:700; font-size:13px; border:none; cursor:pointer; }\n  .tool-btn:hover{ background:var(--forest-deep); }\n  .tool-output{ margin-top:16px; padding:14px; background:#fff; border:1px solid var(--line); border-radius:4px; font-size:14px; word-break:break-word; }\n  .chip-row{ display:flex; gap:10px; flex-wrap:wrap; margin-bottom:14px; }\n  .chip-check{ font-size:13px; padding:7px 12px; border:1px solid var(--line); border-radius:20px; cursor:pointer; background:#fff; }\n  .chip-check input{ margin-right:6px; }\n\n  .grid3{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; margin-bottom:60px; }\n  .soon-card{ background:var(--paper); border:1px solid var(--line); border-radius:6px; padding:24px; position:relative; }\n  .soon-card h4{ font-family:'Inter',sans-serif; font-weight:700; font-size:15px; margin:0 0 8px; color:var(--forest-deep); }\n  .soon-card p{ font-size:13px; color:rgba(28,27,24,0.65); margin:0; }\n  .badge{ position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:10px; letter-spacing:0.06em; text-transform:uppercase; color:var(--clay); border:1px solid var(--line); padding:3px 7px; border-radius:2px; }\n\n  footer{ background:var(--forest-deep); color:rgba(239,237,228,0.6); padding:40px 0; font-size:13px; text-align:center; margin-top:40px;}\n  @media (max-width:820px){ .nav-links{ display:none; } .speed-display, .grid3{ grid-template-columns:1fr; } .tool-panel{ padding:26px; } }\n\n  \/* ---- WordPress theme-conflict fixes (added for embedding as a Custom HTML block) ---- *\/\n  .dg-breakout { width: 100%; max-width: 100%; }\n  \/* Neutralize the theme's content-area width constraints, wherever they are *\/\n  body :where(.entry-content, .wp-block-post-content, .is-layout-constrained, main, .wp-site-blocks main, .wp-block-group) {\n    max-width: 100% !important;\n    width: 100% !important;\n    padding: 0 !important;\n    margin: 0 !important;\n  }\n  \/* Hide the theme's own header\/footer template parts so only our custom nav\/footer show *\/\n  .wp-site-blocks > header,\n  .wp-site-blocks > footer,\n  header.wp-block-template-part,\n  footer.wp-block-template-part {\n    display: none !important;\n  }\n<\/style>\n\n<div class=\"dg-breakout\">\n\n\n<nav>\n  <div class=\"wrap\">\n    <a href=\"index.html\" class=\"logo\">Digital Growth<span class=\"dot\">.<\/span><\/a>\n    <div class=\"nav-links\">\n      <a href=\"services.html\">Services<\/a>\n      <a href=\"tools.html\" class=\"current\">Tools<\/a>\n      <a href=\"portfolio.html\">Portfolio<\/a>\n      <a href=\"about.html\">About<\/a>\n      <a href=\"blog.html\">Blog<\/a>\n      <a href=\"contact.html\">Contact<\/a>\n      <a href=\"registration.html\">Registration<\/a>\n    <\/div>\n    <a href=\"registration.html\" class=\"btn btn-primary\">\ud83d\ude80 Start Your Growth<\/a>\n  <\/div>\n<\/nav>\n\n<header class=\"page-head\">\n  <div class=\"wrap\">\n    <div class=\"eyebrow\">Free Tools<\/div>\n    <h1>Powerful tools. Free for everyone.<\/h1>\n    <p>Explore our growing collection of free tools designed to help businesses, professionals, and creators work smarter. No sign-up required, no hidden fees \u2014 just practical tools that save time and solve real problems.<\/p>\n  <\/div>\n<\/header>\n\n<div class=\"wrap\">\n\n  <div class=\"tool-panel\">\n    <h2>\ud83d\udfe2 Live \u2014 Internet Speed Test<\/h2>\n    <p class=\"sub\">Measure your download speed, upload speed, ping, and jitter in real time.<\/p>\n    <div class=\"speed-display\">\n      <div class=\"speed-stat\"><b id=\"dl-speed\">\u2014<\/b><span>DOWNLOAD (MBPS)<\/span><\/div>\n      <div class=\"speed-stat\"><b id=\"ul-speed\">\u2014<\/b><span>UPLOAD (MBPS)<\/span><\/div>\n      <div class=\"speed-stat\"><b id=\"ping\">\u2014<\/b><span>PING (MS)<\/span><\/div>\n      <div class=\"speed-stat\"><b id=\"jitter\">\u2014<\/b><span>JITTER (MS)<\/span><\/div>\n    <\/div>\n    <button id=\"run-test\" onclick=\"runSpeedTest()\">\ud83d\ude80 Start Test<\/button>\n    <div id=\"status-line\">Ready when you are.<\/div>\n  <\/div>\n\n  <div class=\"eyebrow\">Business &amp; Productivity Tools<\/div>\n  <h2 class=\"section-title\">\ud83d\udfe2 Live tools you can use right now<\/h2>\n  <p class=\"section-sub\">Every tool below runs directly in your browser \u2014 nothing to install, nothing to sign up for.<\/p>\n\n  <details class=\"tool-card\">\n    <summary>Password Generator <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Create a strong, random password instantly.<\/p>\n      <div class=\"row-inline\">\n        <div><label>Length<\/label><input type=\"number\" id=\"pw-length\" value=\"16\" min=\"6\" max=\"64\"><\/div>\n      <\/div>\n      <div class=\"chip-row\">\n        <label class=\"chip-check\"><input type=\"checkbox\" id=\"pw-upper\" checked>Uppercase<\/label>\n        <label class=\"chip-check\"><input type=\"checkbox\" id=\"pw-lower\" checked>Lowercase<\/label>\n        <label class=\"chip-check\"><input type=\"checkbox\" id=\"pw-nums\" checked>Numbers<\/label>\n        <label class=\"chip-check\"><input type=\"checkbox\" id=\"pw-sym\" checked>Symbols<\/label>\n      <\/div>\n      <button class=\"tool-btn\" onclick=\"genPassword()\">Generate Password<\/button>\n      <div class=\"tool-output\" id=\"pw-output\" style=\"font-family:'IBM Plex Mono',monospace;\">Click generate to see a password here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>QR Code Generator <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Turn any link or text into a scannable QR code.<\/p>\n      <label>Text or URL<\/label>\n      <input type=\"text\" id=\"qr-input\" placeholder=\"https:\/\/digitalgrowth.com.pk\">\n      <button class=\"tool-btn\" onclick=\"genQR()\">Generate QR Code<\/button>\n      <div class=\"tool-output\" id=\"qr-output\" style=\"text-align:center;\">Your QR code will appear here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>Currency Converter <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Convert between currencies using live exchange rates.<\/p>\n      <div class=\"row-inline\">\n        <div><label>Amount<\/label><input type=\"number\" id=\"cc-amount\" value=\"100\"><\/div>\n        <div><label>From<\/label>\n          <select id=\"cc-from\"><option>USD<\/option><option>PKR<\/option><option>GBP<\/option><option>EUR<\/option><option>AED<\/option><option>SAR<\/option><\/select>\n        <\/div>\n        <div><label>To<\/label>\n          <select id=\"cc-to\"><option>PKR<\/option><option>USD<\/option><option>GBP<\/option><option>EUR<\/option><option>AED<\/option><option>SAR<\/option><\/select>\n        <\/div>\n      <\/div>\n      <button class=\"tool-btn\" onclick=\"convertCurrency()\">Convert<\/button>\n      <div class=\"tool-output\" id=\"cc-output\">Result will appear here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>GST \/ Tax Calculator <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Add or remove tax from any amount.<\/p>\n      <div class=\"row-inline\">\n        <div><label>Amount<\/label><input type=\"number\" id=\"tax-amount\" value=\"1000\"><\/div>\n        <div><label>Tax rate (%)<\/label><input type=\"number\" id=\"tax-rate\" value=\"17\"><\/div>\n        <div><label>Mode<\/label>\n          <select id=\"tax-mode\"><option value=\"add\">Add tax to amount<\/option><option value=\"remove\">Remove tax (amount is tax-inclusive)<\/option><\/select>\n        <\/div>\n      <\/div>\n      <button class=\"tool-btn\" onclick=\"calcTax()\">Calculate<\/button>\n      <div class=\"tool-output\" id=\"tax-output\">Result will appear here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>Image Compressor <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Shrink an image&#8217;s file size right in your browser \u2014 nothing is uploaded anywhere.<\/p>\n      <label>Choose image<\/label>\n      <input type=\"text\" style=\"display:none;\">\n      <input type=\"file\" id=\"img-file\" accept=\"image\/*\" style=\"margin-bottom:14px;\">\n      <label>Quality: <span id=\"img-quality-val\">70<\/span>%<\/label>\n      <input type=\"range\" id=\"img-quality\" min=\"10\" max=\"95\" value=\"70\" style=\"width:100%; margin-bottom:14px;\" oninput=\"document.getElementById('img-quality-val').textContent=this.value\">\n      <button class=\"tool-btn\" onclick=\"compressImage()\">Compress Image<\/button>\n      <div class=\"tool-output\" id=\"img-output\">Choose an image to get started.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>Invoice Generator <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Create a simple, printable invoice in seconds.<\/p>\n      <div class=\"row-inline\">\n        <div><label>Client name<\/label><input type=\"text\" id=\"inv-client\" placeholder=\"Client \/ business name\"><\/div>\n        <div><label>Invoice date<\/label><input type=\"text\" id=\"inv-date\" placeholder=\"e.g. 25 Jul 2026\"><\/div>\n      <\/div>\n      <label>Item description<\/label>\n      <input type=\"text\" id=\"inv-item\" placeholder=\"e.g. SEO services \u2014 July 2026\">\n      <div class=\"row-inline\">\n        <div><label>Quantity<\/label><input type=\"number\" id=\"inv-qty\" value=\"1\"><\/div>\n        <div><label>Unit price<\/label><input type=\"number\" id=\"inv-price\" value=\"0\"><\/div>\n      <\/div>\n      <button class=\"tool-btn\" onclick=\"genInvoice()\">Generate Invoice<\/button>\n      <div class=\"tool-output\" id=\"inv-output\">Your invoice preview will appear here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>Business Name Generator <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Get name ideas based on your keyword and style.<\/p>\n      <div class=\"row-inline\">\n        <div><label>Keyword<\/label><input type=\"text\" id=\"bn-keyword\" placeholder=\"e.g. Growth, Bloom, Peak\"><\/div>\n        <div><label>Style<\/label>\n          <select id=\"bn-style\"><option>Modern<\/option><option>Playful<\/option><option>Professional<\/option><\/select>\n        <\/div>\n      <\/div>\n      <button class=\"tool-btn\" onclick=\"genBusinessNames()\">Generate Names<\/button>\n      <div class=\"tool-output\" id=\"bn-output\">Suggestions will appear here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>Social Media Caption Generator <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Get caption ideas with matching hashtags for your next post.<\/p>\n      <div class=\"row-inline\">\n        <div><label>Topic<\/label><input type=\"text\" id=\"cap-topic\" placeholder=\"e.g. new product launch\"><\/div>\n        <div><label>Platform<\/label>\n          <select id=\"cap-platform\"><option>Instagram<\/option><option>TikTok<\/option><option>Facebook<\/option><option>LinkedIn<\/option><\/select>\n        <\/div>\n        <div><label>Tone<\/label>\n          <select id=\"cap-tone\"><option>Exciting<\/option><option>Professional<\/option><option>Funny<\/option><\/select>\n        <\/div>\n      <\/div>\n      <button class=\"tool-btn\" onclick=\"genCaptions()\">Generate Captions<\/button>\n      <div class=\"tool-output\" id=\"cap-output\">Captions will appear here.<\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"tool-card\">\n    <summary>Meta Title &amp; Description Checker <span class=\"plus\">\uff0b<\/span><\/summary>\n    <div class=\"tool-body\">\n      <p class=\"desc\">Check your SEO title and description length and preview how it looks on Google.<\/p>\n      <label>Page title<\/label>\n      <input type=\"text\" id=\"seo-title\" placeholder=\"Digital Growth \u2014 Full-Service Marketing Agency\" oninput=\"checkSeo()\">\n      <label>Meta description<\/label>\n      <textarea id=\"seo-desc\" rows=\"3\" placeholder=\"We engineer digital growth through SEO, ads, and web development.\" oninput=\"checkSeo()\"><\/textarea>\n      <div class=\"tool-output\" id=\"seo-output\">Start typing to see your live preview and length check.<\/div>\n    <\/div>\n  <\/details>\n\n  <div class=\"eyebrow\" style=\"margin-top:56px;\">Coming Soon<\/div>\n  <h2 class=\"section-title\">\ud83d\udea7 Tools we&#8217;re actively building<\/h2>\n  <p class=\"section-sub\">These need either file-conversion infrastructure or an AI backend \u2014 both are on our roadmap.<\/p>\n  <div class=\"grid3\">\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>PDF to Word<\/h4><p>Convert PDF documents into fully editable Microsoft Word files while preserving formatting.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Word to PDF<\/h4><p>Turn Word documents into secure, professional-quality PDF files in seconds.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Image to PDF<\/h4><p>Merge one or multiple images into a single, high-quality PDF document.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>PDF to Image<\/h4><p>Convert PDF pages into high-resolution PNG or JPG images.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Image to Word (OCR)<\/h4><p>Extract editable text from images using Optical Character Recognition.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Word to Image<\/h4><p>Convert Word documents into high-quality images for presentations or sharing.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>AI Content Writer<\/h4><p>Generate blog posts, ad copy, and captions using AI, tuned to your brand voice.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>SEO Audit Tool<\/h4><p>Scan any website and get an instant report on technical SEO issues.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Keyword Research Tool<\/h4><p>Discover keyword volume, difficulty, and related terms for your niche.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Resume Builder<\/h4><p>Build a clean, professional resume from a simple form.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Logo Maker<\/h4><p>Generate simple logo concepts from your business name and style.<\/p><\/div>\n    <div class=\"soon-card\"><span class=\"badge\">Soon<\/span><h4>Website Page Speed Test<\/h4><p>Check how fast any website loads and get improvement suggestions.<\/p><\/div>\n  <\/div>\n\n  <p style=\"text-align:center; font-size:14px; color:rgba(28,27,24,0.6); padding-bottom:60px;\">Have a suggestion for a tool? <a href=\"contact.html\" style=\"color:var(--forest); font-weight:700;\">Tell us \u2192<\/a><\/p>\n\n<\/div>\n\n<footer>\u00a9 2026 Digital Growth Marketing Agency<\/footer>\n\n<script>\n  \/\/ ---------- Speed Test (download + upload + ping + jitter) ----------\n  async function runSpeedTest(){\n    const btn = document.getElementById('run-test');\n    const status = document.getElementById('status-line');\n    const dlEl = document.getElementById('dl-speed');\n    const ulEl = document.getElementById('ul-speed');\n    const pingEl = document.getElementById('ping');\n    const jitterEl = document.getElementById('jitter');\n    btn.disabled = true;\n    dlEl.textContent = '\u2014'; ulEl.textContent = '\u2014'; pingEl.textContent = '\u2014'; jitterEl.textContent = '\u2014';\n    try {\n      status.textContent = 'Measuring ping...';\n      const pings = [];\n      for (let i = 0; i < 4; i++) {\n        const t0 = performance.now();\n        await fetch('https:\/\/www.cloudflare.com\/cdn-cgi\/trace', { cache: 'no-store', mode: 'no-cors' }).catch(()=>{});\n        pings.push(performance.now() - t0);\n      }\n      const avgPing = pings.reduce((a,b)=>a+b,0) \/ pings.length;\n      pingEl.textContent = avgPing.toFixed(0);\n      jitterEl.textContent = (Math.max(...pings) - Math.min(...pings)).toFixed(0);\n\n      status.textContent = 'Measuring download speed...';\n      const start = performance.now();\n      const res = await fetch('https:\/\/speed.cloudflare.com\/__down?bytes=25000000', { cache: 'no-store' });\n      const reader = res.body.getReader();\n      let bytes = 0;\n      while (true) { const { done, value } = await reader.read(); if (done) break; bytes += value.length; }\n      const seconds = (performance.now() - start) \/ 1000;\n      dlEl.textContent = ((bytes * 8) \/ seconds \/ 1_000_000).toFixed(1);\n\n      status.textContent = 'Measuring upload speed...';\n      try {\n        const payload = new Blob([new Uint8Array(5_000_000)]);\n        const ut0 = performance.now();\n        await fetch('https:\/\/speed.cloudflare.com\/__up', { method: 'POST', body: payload, cache: 'no-store' });\n        const useconds = (performance.now() - ut0) \/ 1000;\n        ulEl.textContent = ((payload.size * 8) \/ useconds \/ 1_000_000).toFixed(1);\n      } catch(e) { ulEl.textContent = 'N\/A'; }\n\n      status.textContent = 'Done. Results are an estimate \u2014 actual speeds vary by server and network conditions.';\n    } catch (e) {\n      status.textContent = 'Test failed \u2014 check your connection and try again.';\n    } finally { btn.disabled = false; }\n  }\n\n  \/\/ ---------- Password Generator ----------\n  function genPassword(){\n    const len = parseInt(document.getElementById('pw-length').value) || 16;\n    let chars = '';\n    if (document.getElementById('pw-upper').checked) chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    if (document.getElementById('pw-lower').checked) chars += 'abcdefghijklmnopqrstuvwxyz';\n    if (document.getElementById('pw-nums').checked) chars += '0123456789';\n    if (document.getElementById('pw-sym').checked) chars += '!@#$%^&*()_+-=[]{}';\n    if (!chars) { document.getElementById('pw-output').textContent = 'Select at least one character type.'; return; }\n    let pw = '';\n    const arr = new Uint32Array(len);\n    crypto.getRandomValues(arr);\n    for (let i = 0; i < len; i++) pw += chars[arr[i] % chars.length];\n    document.getElementById('pw-output').textContent = pw;\n  }\n\n  \/\/ ---------- QR Code Generator ----------\n  function genQR(){\n    const text = document.getElementById('qr-input').value.trim();\n    const out = document.getElementById('qr-output');\n    if (!text) { out.textContent = 'Enter some text or a URL first.'; return; }\n    const url = 'https:\/\/api.qrserver.com\/v1\/create-qr-code\/?size=200x200&#038;data=' + encodeURIComponent(text);\n    out.innerHTML = '<img loading=\"lazy\" decoding=\"async\" src=\"' + url + '\" alt=\"QR code\" width=\"200\" height=\"200\">';\n  }\n\n  \/\/ ---------- Currency Converter ----------\n  async function convertCurrency(){\n    const amount = parseFloat(document.getElementById('cc-amount').value) || 0;\n    const from = document.getElementById('cc-from').value;\n    const to = document.getElementById('cc-to').value;\n    const out = document.getElementById('cc-output');\n    out.textContent = 'Fetching live rates...';\n    try {\n      const res = await fetch('https:\/\/open.er-api.com\/v6\/latest\/' + from);\n      const data = await res.json();\n      const rate = data.rates[to];\n      out.textContent = amount + ' ' + from + ' = ' + (amount * rate).toFixed(2) + ' ' + to + '  (rate: 1 ' + from + ' = ' + rate.toFixed(4) + ' ' + to + ')';\n    } catch(e) {\n      out.textContent = 'Could not fetch live rates right now \u2014 try again in a moment.';\n    }\n  }\n\n  \/\/ ---------- GST \/ Tax Calculator ----------\n  function calcTax(){\n    const amount = parseFloat(document.getElementById('tax-amount').value) || 0;\n    const rate = parseFloat(document.getElementById('tax-rate').value) || 0;\n    const mode = document.getElementById('tax-mode').value;\n    const out = document.getElementById('tax-output');\n    if (mode === 'add') {\n      const tax = amount * (rate \/ 100);\n      out.textContent = 'Net: ' + amount.toFixed(2) + '  +  Tax: ' + tax.toFixed(2) + '  =  Total: ' + (amount + tax).toFixed(2);\n    } else {\n      const net = amount \/ (1 + rate \/ 100);\n      const tax = amount - net;\n      out.textContent = 'Total: ' + amount.toFixed(2) + '  =  Net: ' + net.toFixed(2) + '  +  Tax: ' + tax.toFixed(2);\n    }\n  }\n\n  \/\/ ---------- Image Compressor ----------\n  function compressImage(){\n    const fileInput = document.getElementById('img-file');\n    const out = document.getElementById('img-output');\n    const quality = parseInt(document.getElementById('img-quality').value) \/ 100;\n    if (!fileInput.files[0]) { out.textContent = 'Choose an image first.'; return; }\n    const file = fileInput.files[0];\n    const originalKB = (file.size \/ 1024).toFixed(1);\n    const img = new Image();\n    const reader = new FileReader();\n    reader.onload = function(e){\n      img.onload = function(){\n        const canvas = document.createElement('canvas');\n        canvas.width = img.width; canvas.height = img.height;\n        canvas.getContext('2d').drawImage(img, 0, 0);\n        canvas.toBlob(function(blob){\n          const compressedKB = (blob.size \/ 1024).toFixed(1);\n          const url = URL.createObjectURL(blob);\n          out.innerHTML = 'Original: ' + originalKB + ' KB \u2192 Compressed: ' + compressedKB + ' KB<br><a href=\"' + url + '\" download=\"compressed.jpg\" style=\"color:#1B4332; font-weight:700;\">Download compressed image \u2192<\/a>';\n        }, 'image\/jpeg', quality);\n      };\n      img.src = e.target.result;\n    };\n    reader.readAsDataURL(file);\n  }\n\n  \/\/ ---------- Invoice Generator ----------\n  function genInvoice(){\n    const client = document.getElementById('inv-client').value || 'Client';\n    const date = document.getElementById('inv-date').value || new Date().toLocaleDateString();\n    const item = document.getElementById('inv-item').value || 'Service';\n    const qty = parseFloat(document.getElementById('inv-qty').value) || 0;\n    const price = parseFloat(document.getElementById('inv-price').value) || 0;\n    const total = qty * price;\n    document.getElementById('inv-output').innerHTML =\n      '<strong>Invoice \u2014 Digital Growth<\/strong><br>Bill to: ' + client + '<br>Date: ' + date +\n      '<br><br>' + item + ' \u2014 Qty ' + qty + ' \u00d7 ' + price.toFixed(2) +\n      '<br><strong>Total: ' + total.toFixed(2) + '<\/strong>';\n  }\n\n  \/\/ ---------- Business Name Generator ----------\n  function genBusinessNames(){\n    const kw = (document.getElementById('bn-keyword').value || 'Growth').trim();\n    const style = document.getElementById('bn-style').value;\n    const sets = {\n      Modern: ['Nova', 'Zenith', 'Pulse', 'Orbit', 'Flux'],\n      Playful: ['Bloom', 'Sprout', 'Zesty', 'Nook', 'Bright'],\n      Professional: ['Alliance', 'Summit', 'Prime', 'Sterling', 'Vantage']\n    };\n    const words = sets[style];\n    const names = words.map(w => Math.random() > 0.5 ? kw + w : w + ' ' + kw);\n    document.getElementById('bn-output').innerHTML = names.map(n => '\u2022 ' + n).join('<br>');\n  }\n\n  \/\/ ---------- Social Caption Generator ----------\n  function genCaptions(){\n    const topic = document.getElementById('cap-topic').value || 'our latest update';\n    const platform = document.getElementById('cap-platform').value;\n    const tone = document.getElementById('cap-tone').value;\n    const templates = {\n      Exciting: ['\ud83d\ude80 Big news: ' + topic + '! You do not want to miss this.', '\u2728 Something new just dropped \u2014 ' + topic + '!'],\n      Professional: ['We are pleased to share an update on ' + topic + '.', 'Here is what is new: ' + topic + '.'],\n      Funny: ['We tried to keep ' + topic + ' a secret. We failed. \ud83d\ude05', topic + '? Say less.']\n    };\n    const hashtags = { Instagram: '#DigitalGrowth #Marketing #GrowYourBusiness', TikTok: '#DigitalGrowth #Marketing #fyp', Facebook: '#DigitalGrowth #SmallBusiness', LinkedIn: '#DigitalGrowth #BusinessGrowth' };\n    const caps = templates[tone];\n    document.getElementById('cap-output').innerHTML = caps.map(c => c + '<br><span style=\"color:#1B4332;\">' + hashtags[platform] + '<\/span>').join('<br><br>');\n  }\n\n  \/\/ ---------- Meta Title & Description Checker ----------\n  function checkSeo(){\n    const title = document.getElementById('seo-title').value;\n    const desc = document.getElementById('seo-desc').value;\n    const titleColor = title.length > 60 ? '#E03131' : '#2F9E44';\n    const descColor = (desc.length > 160 || desc.length < 50) ? '#E03131' : '#2F9E44';\n    document.getElementById('seo-output').innerHTML =\n      '<div style=\"color:#1a0dab; font-size:16px; margin-bottom:2px;\">' + (title || 'Your page title') + '<\/div>' +\n      '<div style=\"color:#006621; font-size:12px; margin-bottom:6px;\">digitalgrowth.com.pk<\/div>' +\n      '<div style=\"color:#545454; font-size:13px; margin-bottom:10px;\">' + (desc || 'Your meta description will preview here.') + '<\/div>' +\n      '<div style=\"font-size:12px; color:' + titleColor + ';\">Title length: ' + title.length + '\/60<\/div>' +\n      '<div style=\"font-size:12px; color:' + descColor + ';\">Description length: ' + desc.length + '\/160<\/div>';\n  }\n<\/script>\n\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Digital Growth. Services Tools Portfolio About Blog Contact Registration \ud83d\ude80 Start Your Growth Free Tools Powerful tools. Free for everyone. Explore our growing collection of free tools designed to help businesses, professionals, and creators work smarter. No sign-up required, no hidden fees \u2014 just practical tools that save time and solve real problems. \ud83d\udfe2 Live [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-no-title","meta":{"footnotes":""},"class_list":["post-17","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=\/wp\/v2\/pages\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=17"}],"version-history":[{"count":1,"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=\/wp\/v2\/pages\/17\/revisions"}],"predecessor-version":[{"id":18,"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=\/wp\/v2\/pages\/17\/revisions\/18"}],"wp:attachment":[{"href":"https:\/\/digitalgrowth.digital\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}