1<!DOCTYPE html><html lang="en" data-lang="en"> <head><meta charset="UTF-8"><link rel="dns-prefetch" href="//acct.acceptrics.com"><link rel="dns-prefetch" href="//cdn.acceptrics.com">
1<script async src="https://acct.acceptrics.com/45c56c5"></script>
1<script> 2 (function () { 3 function readPurposes() { 4 try { 5 var raw = localStorage.getItem('__acceptrics_settings'); 6 if (!raw) return null; 7 return JSON.parse(raw).purposes || null; 8 } catch (e) { 9 return null; 10 } 11 } 12 function purposePending(value) { 13 return value === 'unset' || value === undefined || value === null || value === ''; 14 } 15 function consentStillPending() { 16 var p = readPurposes(); 17 if (!p) return true; 18 return ( 19 purposePending(p.ads) && 20 purposePending(p.analytics) && 21 purposePending(p.functional) 22 ); 23 } 24 function syncGtagFromAcceptrics() { 25 var p = readPurposes(); 26 if (!p || typeof window.gtag !== 'function') return; 27 function toGtag(value) { 28 if (value === 'accepted') return 'granted'; 29 if (value === 'rejected') return 'denied'; 30 return null; 31 } 32 var update = {}; 33 var analytics = toGtag(p.analytics); 34 var ads = toGtag(p.ads); 35 if (analytics) update.analytics_storage = analytics; 36 if (ads) { 37 update.ad_storage = ads; 38 update.ad_user_data = ads; 39 update.ad_personalization = ads; 40 } 41 if (Object.keys(update).length) { 42 window.gtag('consent', 'update', update); 43 } 44 } 45 var bannerShowAttempts = 0; 46 var maxBannerShowAttempts = 3; 47 function showPendingBanner() { 48 if (!consentStillPending()) { 49 syncGtagFromAcceptrics(); 50 return false; 51 } 52 if (bannerShowAttempts >= maxBannerShowAttempts) return false; 53 if (!document.body) return false; 54 bannerShowAttempts += 1; 55 try { 56 if (window.acceptrics && typeof window.acceptrics.showBanner === 'function') { 57 window.acceptrics.showBanner(); 58 return true; 59 } 60 } catch (e) { 61 /* Acceptrics: showBanner() przed gotowym DOM modala â null.style */ 62 } 63 return false; 64 } 65 function scheduleBannerRetry(delayMs) { 66 window.setTimeout(showPendingBanner, delayMs); 67 } 68 function onConsentSettled() { 69 syncGtagFromAcceptrics(); 70 } 71 document.addEventListener('__acceptrics_loaded', function () { 72 scheduleBannerRetry(200); 73 }); 74 document.addEventListener('__acceptrics_ini_complete', function () { 75 onConsentSettled(); 76 if (consentStillPending()) scheduleBannerRetry(200); 77 }); 78 document.addEventListener('DOMContentLoaded', function () { 79 if (consentStillPending()) scheduleBannerRetry(500); 80 }); 81 window.addEventListener('load', function () { 82 onConsentSettled(); 83 if (consentStillPending()) scheduleBannerRetry(900); 84 }); 85 window.addEventListener('storage', function (e) { 86 if (e.key === '__acceptrics_settings') onConsentSettled(); 87 }); 88 [ 89 '__acceptrics_consent_saved', 90 '__acceptrics_consent_update', 91 'acceptrics:consent-saved', 92 'acceptrics:consent-update', 93 ].forEach(function (eventName) { 94 document.addEventListener(eventName, onConsentSettled); 95 }); 96 })(); 97 </script>
vendor: 63 bytes, line 97
97<script async src="https://www.googletagmanager.com/gtag/js?id=
97G-NG233LKNKS
vendor: 11 bytes, line 97
97"></script>
97<script> 98 window.dataLayer = window.dataLayer || []; 99 function gtag() { 100 dataLayer.push(arguments); 101 } 102 if (!window.__anyservConsentDefaultSet) { 103 window.__anyservConsentDefaultSet = true; 104 gtag("consent", "default", { 105 ad_storage: "denied", 106 ad_user_data: "denied", 107 ad_personalization: "denied", 108 analytics_storage: "denied", 109 functionality_storage: "granted", 110 security_storage: "granted", 111 wait_for_update: 500, 112 }); 113 } 114 gtag("js", new Date()); 115 gtag("config", "G-NG233LKNKS"); 116 </script>
116<!-- EXCEPTION: SRI not applicable - AdSense uses dynamic script URLs -->
116<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6446268738798088" crossorigin="anonymous" data-overlays="bottom"></script>
116<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><meta name="description" content="Learn about AnyServ, the free library of browser-based tools for finance, business, and health built with a privacy-first approach."><title>About AnyServ - Free Browser Tools for Everyone</title><!-- Favicon & install icons --><link rel="icon" type="image/png" href="/icons/favicon.png"><link rel="preload" href="/icons/logo.svg" as="image" type="image/svg+xml"><link rel="apple-touch-icon" sizes="800x800" href="/icons/anyserv-800x800.png"><link rel="manifest" href="/site.webmanifest"><!-- Theme inline script to prevent flash - defaults to dark -->
116<script> 117 (function () { 118 var _theme = "dark"; 119 try { 120 _theme = localStorage.getItem("theme") || "dark"; 121 } catch {} 122 document.documentElement.setAttribute("data-theme", _theme); 123 })(); 124 </script>
124<meta property="og:type" content="website"><meta property="og:site_name" content="AnyServ"><meta property="og:title" content="About AnyServ - Free Browser Tools for Everyone"><meta property="og:description" content="Learn about AnyServ, the free library of browser-based tools for finance, business, and health built with a privacy-first approach."><meta property="og:image" content="https://anyserv.eu/og-default.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:url" content="https://anyserv.eu/about/"><meta property="og:locale" content="en_US"><meta property="og:locale:alternate" content="pl_PL"><meta property="og:locale:alternate" content="de_DE"><meta property="og:locale:alternate" content="fr_FR"><meta property="og:locale:alternate" content="es_ES"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@anyserv"><meta name="twitter:title" content="About AnyServ - Free Browser Tools for Everyone"><meta name="twitter:description" content="Learn about AnyServ, the free library of browser-based tools for finance, business, and health built with a privacy-first approach."><meta name="twitter:image" content="https://anyserv.eu/og-default.png"><!-- hreflang: kody regionalne (en-US) = sitemap xhtml:link; URL EN bez /en/ --><link rel="alternate" hreflang="en-US" href="https://anyserv.eu/about/"><link rel="alternate" hreflang="pl-PL" href="https://anyserv.eu/pl/about/"><link rel="alternate" hreflang="de-DE" href="https://anyserv.eu/de/about/"><link rel="alternate" hreflang="fr-FR" href="https://anyserv.eu/fr/about/"><link rel="alternate" hreflang="es-ES" href="https://anyserv.eu/es/about/"><link rel="alternate" hreflang="x-default" href="https://anyserv.eu/about/"><link rel="prefetch" href="/pl/about/" as="document"><link rel="prefetch" href="/de/about/" as="document"><link rel="prefetch" href="/fr/about/" as="document"><link rel="prefetch" href="/es/about/" as="document"><!-- canonical = aktualny jÄzyk, bez parametrów query --><link rel="canonical" href="https://anyserv.eu/about/"><!-- llms.txt v2 (August 2026): https://llmstxt.org/ --><link rel="describedby" href="https://anyserv.eu/llms.txt"><link rel="stylesheet" href="/_astro/BaseLayout.DKREpYnM.css"> 125<style>.document-wrapper[data-astro-cid-vdrf3zw3]{max-width:720px;margin:0 auto;padding:3rem 1.5rem;color:var(--color-text)}h1[data-astro-cid-vdrf3zw3]{font-size:clamp(2rem,4vw,2.75rem);font-weight:800;margin-bottom:.5rem;letter-spacing:-.03em}p[data-astro-cid-vdrf3zw3]{font-size:1rem;line-height:1.7;color:var(--color-text-muted);margin-bottom:1.25rem}.doc-link[data-astro-cid-vdrf3zw3]{color:#6366f1;text-decoration:none;font-weight:500}.doc-link[data-astro-cid-vdrf3zw3]:hover{text-decoration:underline}.about-kofi[data-astro-cid-vdrf3zw3]{margin-top:2.75rem;padding-top:2rem;border-top:1px solid rgba(255,255,255,.1);display:flex;justify-content:center}[data-theme=light] .about-kofi[data-astro-cid-vdrf3zw3]{border-top-color:#0f172a1a}.about-kofi__link[data-astro-cid-vdrf3zw3]{display:inline-flex;border-radius:10px;transition:transform .2s ease,opacity .2s ease}.about-kofi__link[data-astro-cid-vdrf3zw3]:hover{transform:translateY(-2px);opacity:.92}.about-kofi__link[data-astro-cid-vdrf3zw3]:focus-visible{outline:2px solid #6366f1;outline-offset:4px}.about-kofi__badge[data-astro-cid-vdrf3zw3]{display:block;width:min(100%,320px);height:auto}.about-kofi__badge--on-light[data-astro-cid-vdrf3zw3],[data-theme=light] .about-kofi__badge--on-dark[data-astro-cid-vdrf3zw3]{display:none}[data-theme=light] .about-kofi__badge--on-light[data-astro-cid-vdrf3zw3]{display:block} 126</style></head> <body data-page> <a href="#main" class="skip-link">Skip to content</a> <!-- Pasek postÄpu przy przeÅÄ czaniu jÄzyka (DOM zamiast html::before â nie koliduje z overflow-x na html/body) --><div class="lang-nav-progress" aria-hidden="true"> <div class="lang-nav-progress__track"></div> <div class="lang-nav-progress__fill"></div> </div> <!-- TÅo zza szuflady (tylko gdy otwarty panel mobile) --> <div class="navbar-backdrop" id="navbarBackdrop" aria-hidden="true"></div> <!-- Floating navbar wrapper --> <div class="navbar-wrapper"> <nav class="navbar" role="navigation" aria-label="Main navigation"> <!-- Warstwa tÅa: blur tylko tutaj - inaczej .navbar z backdrop-filter tworzy 127 nowy context i position:fixed szuflady trafia wzglÄdem naw, nie ekranu --> <div class="navbar__glass" aria-hidden="true"></div> <!-- Logo --> <a href="/" class="navbar-logo" id="navbarLogoLink" aria-label="Home page" title="Go to home page"> <img src="/icons/logo.svg" alt="" id="navbarLogoImg" width="28" height="28" loading="eager" fetchpriority="high" decoding="async" class="navbar-logo-img"> <span class="navbar-wordmark">Any<span class="navbar-serv">Serv</span></span> </a> <!-- Right-side controls -->
127 <div class="navbar-controls"> <a href="/tools/" class="navbar-hub-link navbar-all-tools" id="navbarAllToolsLink">All tools</a> <a href="/apps/" class="navbar-hub-link navbar-all-extensions" id="navbarExtensionsLink">Extensions</a> <!-- Search --> <button id="search-trigger" class="navbar-search-btn" aria-label="Search tools"> <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> <span class="search-label" id="navbarSearchLabel">Search...</span> </button> <!-- Mobile: wysuwa z prawej. Desktop: w jednej linii z wyszukiwarkÄ
--> <div class="navbar-extras" id="navbarExtras"> <div class="navbar-extras__header"> <p class="navbar-extras__title" id="navbarExtrasTitle">Language & theme</p> <button type="button" class="navbar-extras__close" id="navDrawerClose" aria-label="Close menu"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"> <path d="M18 6L6 18M6 6l12 12"></path> </svg> </button> </div> <a href="/apps/" class="navbar-drawer-link navbar-all-extensions" id="navbarExtensionsDrawerLink">Extensions</a> <!-- Language switcher - FIX 1: CSS class-driven, no hidden attr --> <div class="lang-switcher" id="langSwitcher"> <button class="lang-btn" id="langBtn" aria-haspopup="listbox" aria-expanded="false"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"> <circle cx="12" cy="12" r="10"></circle> <path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path> </svg> <span id="langLabel">EN</span> <svg class="chevron" width="10" height="10" viewBox="0 0 10 10" fill="none" aria-hidden="true"> <path d="M2 3.5l3 3 3-3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </button> <div class="lang-panel" id="langPanel" role="listbox" aria-label="Select language"> <button class="lang-item" data-lang="en" data-label="EN" data-code="EN" role="option"> <span class="lang-flag">ð¬ð§</span> <span class="lang-name">English</span> </button> <button class="lang-item" data-lang="pl" data-label="PL" data-code="PL" role="option"> <span class="lang-flag">ðµð±</span> <span class="lang-name">Polski</span> </button> <button class="lang-item" data-lang="de" data-label="DE" data-code="DE" role="option"> <span class="lang-flag">ð©ðª</span> <span class="lang-name">Deutsch</span> </button> <button class="lang-item" data-lang="fr" data-label="FR" data-code="FR" role="option"> <span class="lang-flag">ð«ð·</span> <span class="lang-name">Français</span> </button> <button class="lang-item" data-lang="es" data-label="ES" data-code="ES" role="option"> <span class="lang-flag">ðªð¸</span> <span class="lang-name">Español</span> </button> </div> </div> <!-- Theme toggle --> <button type="button" id="theme-toggle" class="navbar-theme-btn" aria-label="Toggle theme"> <span class="theme-toggle__icons" aria-hidden="true"> <svg class="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path> </svg> <svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> </span> <span class="theme-toggle__label" id="themeToggleLabel">Light theme</span> <span class="theme-toggle__spacer" aria-hidden="true"></span> </button> </div> <button type="button" class="navbar-burger" id="navBurger" aria-label="Open menu" aria-controls="navbarExtras" aria-expanded="false"> <span class="navbar-burger__line" aria-hidden="true"></span> <span class="navbar-burger__line" aria-hidden="true"></span> <span class="navbar-burger__line" aria-hidden="true"></span> </button> </div> </nav> </div> <dialog id="search-modal" class="search-modal-dialog" data-search-tools="{"en":[{"id":"percentage-calculator","href":"/tools/math/percentage-calculator/","title":"Percentage Calculator","desc":"X% of Y, share as a percent, and percent change-with formulas, examples, and FAQ in your browser.","cat":"math","emoji":"ð","tags":["hot"]},{"id":"mortgage-calculator","href":"/tools/finance/mortgage-calculator/","title":"Mortgage Calculator","desc":"Estimate monthly mortgage payments, compare term and rate scenarios, and understand practical trade-offs before applying.","cat":"finance","emoji":"ð ","tags":[]},{"id":"apr-calculator","href":"/tools/finance/apr-calculator/","title":"APR Calculator","desc":"True annual cost of credit (EU RRSO / US APR): fees, commissions, grace peri
127ods and balloon payments.","cat":"finance","emoji":"ð³","tags":[]},{"id":"tax-calculator","href":"/tools/finance/vat-calculator/","title":"Tax Calculator (VAT / GST)","desc":"Universal tax calculator. Add or remove VAT, GST or Sales Tax. Automatic rates for all major countries.","cat":"finance","emoji":"ð§¾","tags":["hot"]},{"id":"salary-calculator","href":"/tools/finance/salary-calculator/","title":"Salary Calculator 2026","desc":"See 2026 take-home pay: gross to net, tax, social and health contributions, plus employer cost. Free in your browser.","cat":"finance","emoji":"ð¼","tags":[]},{"id":"currency-converter","href":"/tools/finance/currency-converter/","title":"Currency Converter","desc":"Live-style FX conversion for 30+ currencies with mid-market context for travel, transfers, and shopping.","cat":"finance","emoji":"ð±","tags":["hot"]},{"id":"invoice-generator","href":"/tools/finance/invoice-generator/","title":"Invoice Generator","desc":"Free PDF invoice in your browser: line items, VAT per row, discount, shipping, logo, bank notes. pdfmake, no signup.","cat":"finance","emoji":"ð","tags":[]},{"id":"income-tax-calculator","href":"/tools/finance/income-tax-calculator/","title":"Income Tax Calculator","desc":"Estimate income tax from gross pay, allowance, and two-rate brackets. Net income and effective rate-runs locally in your browser.","cat":"finance","emoji":"ðï¸","tags":[]},{"id":"investment-calculator","href":"/tools/finance/investment-calculator/","title":"Compound Interest Calculator","desc":"Compound interest and ROI calculator for long-term investment planning.","cat":"finance","emoji":"ð","tags":[]},{"id":"hosting-comparison","href":"/tools/business/hosting-comparison/","title":"Hosting Comparison","desc":"Compare 50+ hosting plans for free. Filter by RAM, storage and price; intro vs renewal from curated research of public sources.","cat":"business","emoji":"ð¥ï¸","tags":[]},{"id":"employee-cost-calculator","href":"/tools/business/employee-cost-calculator/","title":"Employee Cost Calculator 2026","desc":"See the full 2026 employer cost: gross pay, social contributions, payroll taxes and monthly perks. Free in your browser.","cat":"business","emoji":"ð¥","tags":[]},{"id":"bmi-calculator","href":"/tools/health/bmi-calculator/","title":"BMI & WHtR Calculator","desc":"BMI and waist-to-height ratio with WHO categories, optional Asian thresholds, metric or imperial.","cat":"health","emoji":"â¤ï¸","tags":["new"]},{"id":"calorie-calculator","href":"/tools/health/calorie-calculator/","title":"Calorie Calculator","desc":"Mifflin-St Jeor BMR and TDEE with separate NEAT and training activity factors, gender-adjusted protein/fat targets per kg, fiber estimate, and lean-bulk safety tips. Metric or imperial.","cat":"health","emoji":"ð¥","tags":["new"]},{"id":"unit-converter","href":"/tools/math/unit-converter/","title":"Unit Converter","desc":"Convert length, mass, volume, temperature, area and speed. Metric and US customary units, instant in y
127our browser.","cat":"math","emoji":"ð","tags":["new"]},{"id":"tip-calculator","href":"/tools/finance/tip-calculator/","title":"Tip Calculator","desc":"Calculate tip, tax, total and per-person split in seconds. Choose pre-tax or post-tax tip base and get instant results in your browser.","cat":"finance","emoji":"ð¤","tags":["new"]},{"id":"qr-code-generator","href":"/tools/utilities/qr-code-generator/","title":"QR Code Generator","desc":"Generate custom QR codes for URLs, WiFi, vCard, email and text. Add logo, pick colors, choose dot styles. Free, no registration, works in your browser.","cat":"utilities","emoji":"ð³","tags":["new"]},{"id":"password-generator","href":"/tools/utilities/password-generator/","title":"Password Generator","desc":"Generate strong, memorable passwords from your own words. Adjustable strength, crack-time estimates, 100% in your browser.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"discount-calculator","href":"/tools/finance/discount-calculator/","title":"Discount & Sale Price Calculator","desc":"Calculate sale price after a discount, find the discount percentage, or reverse-engineer the original price. Free, instant, in your browser.","cat":"finance","emoji":"ð·ï¸","tags":["new"]},{"id":"age-calculator","href":"/tools/utilities/age-calculator/","title":"Age & Date Calculator","desc":"Calculate exact age, the difference between two dates, or add and subtract days, weeks, months, and years. Free, instant, in your browser.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"hash-generator","href":"/tools/utilities/hash-generator/","title":"Hash Generator","desc":"Compute MD5, SHA-1, SHA-256, SHA-384, and SHA-512 from text or files.","cat":"utilities","emoji":"#ï¸â£","tags":["new"]},{"id":"time-zone-converter","href":"/tools/utilities/time-zone-converter/","title":"Time Zone Converter","desc":"Convert time across world time zones with DST-aware offsets. Compare UTC, Europe, America, Asia, and Pacific zones in one view.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"uuid-generator","href":"/tools/utilities/uuid-generator/","title":"UUID / GUID Generator","desc":"Generate UUID v4, v1, and v7 online. Batch up to 100, copy or download as TXT.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"base-converter","href":"/tools/utilities/base-converter/","title":"Binary / Hex / Dec / Oct Converter","desc":"Convert numbers between decimal, binary, hexadecimal, and octal. Signed mode, digit grouping, instant sync.","cat":"utilities","emoji":"ð¢","tags":["new"]},{"id":"markup-margin-calculator","href":"/tools/finance/markup-margin-calculator/","title":"Price Markup & Margin Calculator","desc":"Calculate markup, margin, and sale price. See the difference between markup on cost and margin on price.","cat":"finance","emoji":"ð","tags":["new"]},{"id":"sales-commission-calculator","href":"/tools/finance/sales-commission-calculator/","title":"Sales Commission Calculator","desc":"Calculate sales commission: flat rate, tiered brackets, or team split. Free, instant, in your browser.","cat":"finance","emoji":"ð°","tags":["new"]},{"id":"meeting-cost-calculator","href":"/tools/utilities/meeting-cost-calculator/","title":"Meeting Cost Calculator","desc":"See how much a meeting really costs: participants, duration, hourly rates, and a live cost clock. Free in your browser.","cat":"utilities","emoji":"â±ï¸","tags":["new"]},{"id":"running-pace-calculator","href":"/tools/health/running-pace-calculator/","title":"Running Pace & Race Time Calculator","desc":"Calculate running pace, finish time, or distance. Preset race distances, split table, km/mi toggle. Free in your browser.","cat":"health","emoji":"ð","tags":["new"]},{"id":"loan-calculator","href":"/tools/finance/loan-calculator/","title":"Loan Calculator","desc":"Calculate EMI, compare up to three loan offers, check affordability from income, analyze refinance costs, and model prepayment with Smart Summary, charts, and amortization table.","cat":"finance","emoji":"ð¦","tags":["new"]}],"pl":[{"id":"percentage-calculator","href":"/pl/tools/math/percentage-calculator/","title":"Kalkulator procentowy","desc":"X% z Y, udzial jako procent i zmiana procentowa - ze wzorami, przykladami i FAQ w przegladarce.","cat":"math","emoji":"ð","tags":["hot"]},{"id":"mortgage-calculator","href":"/pl/tools/finance/mortgage-calculator/","title":"Kalkulator hipoteczny","desc":"Oszacuj miesiÄcznÄ
ratÄ kredytu hipotecznego, porównaj warianty okresu i stóp oraz poznaj typowe kompromisy przed wizytÄ
w banku.","cat":"finance","emoji":"ð ","tags":[]},{"id":"apr-calculator","href":"/pl/tools/finance/apr-calculator/","title":"Kalkulator RRSO","desc":"
127Rzeczywisty roczny koszt kredytu (RRSO UE / APR USA): opÅaty, prowizje, karencja i rata balonowa.","cat":"finance","emoji":"ð³","tags":[]},{"id":"tax-calculator","href":"/pl/tools/finance/vat-calculator/","title":"Kalkulator VAT","desc":"Uniwersalny kalkulator podatkowy: dodaj lub wylicz VAT, GST albo podatek od sprzedaży (Sales Tax). Orientacyjne stawki dla gÅównych krajów.","cat":"finance","emoji":"ð§¾","tags":["hot"]},{"id":"salary-calculator","href":"/pl/tools/finance/salary-calculator/","title":"Kalkulator wynagrodzeÅ 2026","desc":"WypÅata na rÄkÄ za 2026: brutto na netto, podatek, ZUS, skÅadka zdrowotna i koszt pracodawcy. Od razu w przeglÄ
darce.","cat":"finance","emoji":"ð¼","tags":[]},{"id":"currency-converter","href":"/pl/tools/finance/currency-converter/","title":"Kalkulator walutowy (przelicznik walut)","desc":"Przeliczanie ponad 30 walut z kontekstem mid-market na podróże, przelewy i zakupy.","cat":"finance","emoji":"ð±","tags":["hot"]},{"id":"invoice-generator","href":"/pl/tools/finance/invoice-generator/","title":"Generator faktur","desc":"Darmowa faktura PDF w przeglÄ
darce: pozycje, VAT w wierszu, rabat, wysyÅka, logo, uwagi bankowe. pdfmake, bez konta.","cat":"finance","emoji":"ð","tags":[]},{"id":"income-tax-calculator","href":"/pl/tools/finance/income-tax-calculator/","title":"Kalkulator PIT","desc":"Szacuj PIT od brutto, kwoty wolnej i dwóch progów. Netto i stawka skuteczna - obliczenia lokalnie w przeglÄ
darce.","cat":"finance","emoji":"ðï¸","tags":[]},{"id":"investment-calculator","href":"/pl/tools/finance/investment-calculator/","title":"Kalkulator inwestycji","desc":"Procent skÅadany i ROI: projekcja kapitaÅu na lata z wpÅatami, inflacjÄ
i opÅatami.","cat":"finance","emoji":"ð","tags":[]},{"id":"hosting-comparison","href":"/pl/tools/business/hosting-comparison/","title":"Porównanie hostingu","desc":"Porównaj ponad 50 planów hostingu za darmo. Filtruj po RAM, dysku i cenie; cena wstÄpna vs odnowienie na podstawie publicznych źródeÅ.","cat":"business","emoji":"ð¥ï¸","tags":[]},{"id":"employee-cost-calculator","href":"/pl/tools/business/employee-cost-calculator/","title":"
127Kalkulator kosztów pracodawcy 2026","desc":"Policz caÅkowity koszt etatu w 2026: brutto, skÅadki pracodawcy, podatki i benefity. Wynik od razu, za darmo w przeglÄ
darce.","cat":"business","emoji":"ð¥","tags":[]},{"id":"bmi-calculator","href":"/pl/tools/health/bmi-calculator/","title":"Kalkulator BMI i WHtR","desc":"BMI i stosunek talia do wzrostu (WHtR) z kategoriami WHO, opcjonalnymi progami azjatyckimi, metrycznie lub imperialnie.","cat":"health","emoji":"â¤ï¸","tags":["new"]},{"id":"calorie-calculator","href":"/pl/tools/health/calorie-calculator/","title":"Kalkulator Kalorii","desc":"BMR i TDEE (Mifflin-St Jeor) z osobnymi wspóÅczynnikami NEAT i treningu, cele makroskÅadników per kg masy ciaÅa z uwzglÄdnieniem pÅci, szacowanie bÅonnika i wskazówki bezpieczeÅstwa. Metryczny lub imperialny.","cat":"health","emoji":"ð¥","tags":["new"]},{"id":"unit-converter","href":"/pl/tools/math/unit-converter/","title":"Przelicznik jednostek","desc":"Przelicz dÅugoÅÄ, masÄ, objÄtoÅÄ, temperaturÄ, powierzchniÄ i prÄdkoÅÄ. Metryczne i US, od razu w przeglÄ
darce.","cat":"math","emoji":"ð","tags":["new"]},{"id":"tip-calculator","href":"/pl/tools/finance/tip-calculator/","title":"Kalkulator napiwku","desc":"Oblicz napiwek, podatek, sumÄ i podziaÅ na osoby. Wybierz bazÄ przed lub po podatku - wynik od razu w przeglÄ
darce.","cat":"finance","emoji":"ð¤","tags":["new"]},{"id":"qr-code-generator","href":"/pl/tools/utilities/qr-code-generator/","title":"Generator kodów QR","desc":"Twórz kody QR dla linków, WiFi, wizytówek, e-mail i tekstu. Logo, kolory i style kropek. Za darmo, w przeglÄ
darce, bez rejestracji.","cat":"utilities","emoji":"ð³","tags":["new"]},{"id":"password-generator","href":"/pl/tools/utilities/password-generator/","title":"Generator haseÅ","desc":"Twórz silne, zapamiÄtywalne hasÅa z wÅasnych sÅów. Regulowana siÅa, szacowany czas Åamania, 100% w przeglÄ
darce.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"discount-calculator","href":"/pl/tools/finance/discount-calculator/","title":"Kalkulator rabatu","desc":"Oblicz cenÄ po rabacie, sprawdź procent zniżki lub wylicz cenÄ oryginalnÄ
. Za darmo, od razu, w przeglÄ
darce.","cat":"finance","emoji":"ð·ï¸","tags":["new"]},{"id":"age-calculator","href":"/pl/tools/utilities/age-calculator/","title":"Kalkulator wieku","desc":"Oblicz dokÅadny wiek, różnicÄ miÄdzy datami lub dodaj i odejmij dni, tygodnie, miesiÄ
ce i lata. Za darmo, od razu, w przeglÄ
darce.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"hash-generator","href":"/pl/tools/utilities/hash-generator/","title":"Generator hash","desc":"Oblicz MD5, SHA-1, SHA-256, SHA-384 i SHA-512 z tekstu lub pliku.","cat":"utilities","emoji":"#ï¸â£","tags":["new"]},{"id":"time-zone-converter","href":"/pl/tools/utilities/time-zone-converter/","title":"Kalkulator stref czasowych","desc":"Przeliczaj czas miÄdzy strefami czasowymi z uwzglÄdnieniem DST. Porównuj UTC, EuropÄ, AmerykÄ, AzjÄ i Pacyfik w jednym widoku.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"uuid-generator","href":"/pl/tools/utilities/uuid-generator/","title":"Generator UUID / GUID","desc":"Generuj UUID v4, v1 i v7 online. Batch do 100 sztuk, kopiuj lub pobierz jako TXT.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"base-converter","href":"/pl/tools/utilities/base-converter/","title":"Konwerter systemów liczbowych","desc":"Przelicz liczby miÄdzy dziesiÄtnym, binarnym, szesnastkowym i ósemkowym. Tryb signed, grupowanie, sync na żywo.","cat":"utilities","emoji":"ð¢","tags":["new"]},{"id":"markup-margin-calculator","href":"/pl/tools/finance/markup-margin-calculator/","title":"Kalkulator marży i narzutu","desc":"Oblicz marżÄ, narzut (markup) i cenÄ sprzedaży. Poznaj różnicÄ miÄdzy narzutem od kosztu a marżÄ
od ceny.","cat":"finance","emoji":"ð","tags":["new"]},{"id":"sales-commission-calculator","href":"/pl/tools/finance/sales-commission-calculator/","title":"Kalkulator prowizji","desc":"Oblicz prowizjÄ od sprzedaży: prosta stawka, progi prowizyjne, podziaÅ w zespole. Za darmo, w przeglÄ
darce.","cat":"finance","emoji":"ð°","tags":["new"]},{"id":"meeting-cost-calculator","href":"/pl/tools/utilities/meeting-cost-calculator/","title":"Kalkulator kosztu spotkania","desc":"Sprawdź, ile naprawdÄ kosztuje spotkanie: uczestnicy, czas, stawki godzinowe i zegar kosztów na żywo. Za darmo w przeglÄ
darce.","cat":"utilities","emoji":"â±ï¸","tags":["new"]},{"id":"running-pace-calculator","href":"/pl/tools/health/running-pace-calculator/","title":"Kalkulator tempa biegu","desc":"Oblicz tempo biegu, czas ukoÅczenia lub dystans. Presety tras, tabela podziaÅu, przeÅÄ
cznik km/mi. Za darmo w przeglÄ
darce.","cat":"health","emoji":"ð","tags":["new"]},{"id":"loan-calculator","href":"/pl/tools/finance/loan-calculator/","title":"Kalkulator kredytu","desc":"Oblicz ratÄ, porównaj do trzech ofert, sprawdź zdolnoÅÄ z dochodu, przeanalizuj restrukturyzacjÄ i nadpÅaty z inteligentnym podsumowaniem, wykresami i harmonogramem.","cat":"finance","emoji":"ð¦","tags":["new"]}],"de":[{"id":"percentage-calculator","href":"/de/tools/math/percentage-calculator/","title":"Prozent-Rechner","desc":"X % von Y, Anteil als Prozent und prozentuale Anderung - mit Formeln, Beispielen und FAQ im Browser.","cat":"math","emoji":"ð","tags":["hot"]},{"id":"mortgage-calculator","href":"/de/tools/finance/mortgage-calculator/","title":"Hypothekenrechner","desc":"Schätzen Sie die monatliche Hypothekenrate, vergleichen Sie Laufzeit- und Zinsszenarien und verstehe
127n Sie typische Abwägungen vor der Beantragung.","cat":"finance","emoji":"ð ","tags":[]},{"id":"apr-calculator","href":"/de/tools/finance/apr-calculator/","title":"Effektivzinsrechner","desc":"Jährliche Gesamtkreditkosten (EU-Effektivzins vs. US-APR): Gebühren, Provisionen, Karenz und Ballonrate.","cat":"finance","emoji":"ð³","tags":[]},{"id":"tax-calculator","href":"/de/tools/finance/vat-calculator/","title":"MwSt-Rechner","desc":"Universeller Steuerrechner: MwSt., GST oder Sales Tax hinzufügen oder abziehen. Orientierende Sätze für die wichtigsten Länder.","cat":"finance","emoji":"ð§¾","tags":["hot"]},{"id":"salary-calculator","href":"/de/tools/finance/salary-calculator/","title":"Gehaltsrechner 2026","desc":"Nettogehalt 2026: Brutto zu Netto, Steuer, Sozialabgaben und Arbeitgeberkosten. Sofort im Browser.","cat":"finance","emoji":"ð¼","tags":[]},{"id":"currency-converter","href":"/de/tools/finance/currency-converter/","title":"Währungsrechner","desc":"Umrechnung für über 30 Währungen mit Mittelkurs-Kontext für Reisen, Ãberweisungen und Einkäufe.","cat":"finance","emoji":"ð±","tags":["hot"]},{"id":"invoice-generator","href":"/de/tools/finance/invoice-generator/","title":"Rechnungsgenerator","desc":"Kostenlose PDF-Rechnung im Browser: Positionen, MwSt. pro Zeile, Rabatt, Versand, Logo, Bankhinweise. pdfmake, ohne Anmeldung.","cat":"finance","emoji":"ð","tags":[]},{"id":"income-tax-calculator","href":"/de/tools/finance/income-tax-calculator/","title":"Einkommensteuer-Rechner","desc":"Steuer schätzen aus Brutto, Freibetrag und zwei Steuersätzen. Netto und Effektivsatz - lokal im Browser.","cat":"finance","emoji":"ðï¸","tags":[]},{"id":"investment-calculator","href":"/de/tools/finance/investment-calculator/","title":"Zinseszinsrechner","desc":"Zinseszins und Rendite: langfristige Projektion mit Einzahlungen, Inflation und Gebühren.","cat":"finance","emoji":"ð","tags":[]},{"id":"hosting-comparison","href":"/de/tools/business/hosting-comparison/","title":"Hosting-Vergleich","desc":"Ãber 50 Hosting-Tarife kostenlos vergleichen. Nach RAM, Speicher und Preis filtern; Einführungs- vs. Verlängerungspreis aus öffentlichen Quellen.","cat":"business","emoji":"ð¥ï¸","tags":[]},{"id":"employee-cost-calculator","href":"/de/tools/business/employee-cost-calculator/","title":"Arbeitgeberkosten-Rechner","desc":"Gesamtkosten des Arbeitgebers: Sozialabgaben, Lohnnebenkosten und fixe monatliche Benefits â übersichtlich im Browser.","cat":"business","emoji":"ð¥","tags":[]},{"id":"bmi-calculator","href":"/de/tools/health/bmi-calculator/","title":"BMI- und WHtR-Rechner","desc":"BMI und Taillen-zu-GröÃe-Verhältnis mit WHO-Kategorien, optionalen asiatischen Schwellen, metrisch oder imperial.","cat":"health","emoji":"â¤ï¸","tags":["new"]},{"id":"calorie-calculator","href":"/de/tools/health/calorie-calculator/","title":"Kalorienrechner","desc":"Mifflin-St Jeor BMR und TDEE mit getrennten NEAT- und Trainingsfaktoren, geschlechtsspezifische Protein- und Fettziele pro kg, Ballaststoff-Schätzung und Lean-Bulk-Hinweise. Metrisch oder imperial.","cat":"health","emoji":"ð¥","tags":["new"]},{"id":"unit-converter","href":"/de/tools/math/unit-converter/","title":"Einheiten-Umrechner","desc":"Länge, Masse, Volumen, Temperatur, Fläche und Geschwindigkeit umrechnen. Metrisch und US, sofort im Browser.","cat":"math","emoji":"ð","tags":["new"]},{"id":"tip-calculator","href":"/de/tools/finance/tip-calculator/","title":"Trinkgeldrechner","desc":"Trinkgeld, Steuer, Gesamtsumme und Betrag pro Person berechnen. Wahlweise auf Basis vor oder nach Steuer - sofort im Browser.","cat":"finance","emoji":"ð¤","tags":["new"]},{"id":"qr-code-generator","href":"/de/tools/utilities/qr-code-generator/","title":"QR-Code-Generator","desc":"QR-Codes für URLs, WLAN, vCard, E-Mail und Text. Logo, Farben und Punktstile. Kostenlos im Browser, ohne Anmeldung.","cat":"utilities","emoji":"ð³","tags":["new"]},{"id":"password-generator","href":"/de/tools/utilities/password-generator/","title":"Passwort-Generator","desc":"Starke, merkbare Passwörter aus eigenen Wörtern. Einstellbare Stärke, Crack-Zeit-Schätzung, 100 % im Browser.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"discount-calculator","href":"/de/tools/finance/discount-calculator/","title":"Rabatt- & Aktionspreis-Rechner","desc":"Endpreis nach Rabatt berechnen, Rabattprozent ermitteln oder Originalpreis zurückrechnen. Kostenlos im Browser.","cat":"finance","emoji":"ð·ï¸","tags":["new"]},{"id":"age-calculator","href":"/de/tools/utilities/age-calculator/","title":"Altersrechner","desc":"Exaktes Alter, Datumsdifferenz oder Datum plus/minus Zeiträume berechnen. Kostenlos im Browser.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"hash-generator","href":"/de/tools/utilities/hash-generator/","title":"Hash-Generator","desc":"MD5, SHA-1, SHA-256, SHA-384 und SHA-512 aus Text oder Dateien.","cat":"utilities","emoji":"#ï¸â£","tags":["new"]},{"id":"time-zone-converter","href":"/de/tools/utilities/time-zone-converter/","title":"Zeitzonenrechner","desc":"Zeiten zwischen globalen Zeitzonen mit DST-korrekten Offsets umrechnen und in einer Ansicht vergleichen.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"uuid-generator","href":"/de/tools/utilities/uuid-generator/","title":"UUID / GUID Generator","desc":"UUID v4, v1 und v7 online generieren. Batch bis 100, kopieren oder als TXT laden.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"base-converter","href":"/de/tools/utilities/base-converter/","title":"Zahlensystem-Umrechner","desc":"Zahlen zwischen Dezimal, Binär, Hexadezimal und Oktal umrechnen. Signed-Modus, Gruppierung, sofortige Sync.","cat":"utilities","emoji":"ð¢","tags":["new"]},{"id":"markup-margin-calculator","href":"/de/tools/finance/markup-margin-calculator/","title":"Aufschlag- & Margen-Rechner","desc":"Aufschlag, Marge und Verkaufspreis berechnen. Unterschied zwischen Aufschlag auf Kosten und Marge auf Preis.","cat":"finance","emoji":"ð","tags":["new"]},{"id":"sales-commission-calculator","href":"/de/tools/finance/sales-commission-calculator/","title":"
127Verkaufsprovision-Rechner","desc":"Provision berechnen: einfacher Satz, gestaffelte Stufen oder Team-Aufteilung. Kostenlos im Browser.","cat":"finance","emoji":"ð°","tags":["new"]},{"id":"meeting-cost-calculator","href":"/de/tools/utilities/meeting-cost-calculator/","title":"Meeting-Kosten-Rechner","desc":"Berechnen Sie Meeting-Kosten: Teilnehmer, Dauer, Stundensätze und Live-Kostenuhr. Kostenlos im Browser.","cat":"utilities","emoji":"â±ï¸","tags":["new"]},{"id":"running-pace-calculator","href":"/de/tools/health/running-pace-calculator/","title":"Lauftempo & Renndauer Rechner","desc":"Lauftempo, Zielzeit oder Distanz berechnen. Preset-Strecken, Split-Tabelle, km/mi-Umschalter. Kostenlos im Browser.","cat":"health","emoji":"ð","tags":["new"]},{"id":"loan-calculator","href":"/de/tools/finance/loan-calculator/","title":"Kreditrechner","desc":"Berechnen Sie EMI, vergleichen Sie bis zu drei Angebote, prüfen Sie die Leistbarkeit aus dem Einkommen, analysieren Sie Umschuldungskosten und modellieren Sie Sondertilgungen mit intelligenter Zusammenfassung, Charts und Tilgungsplan.","cat":"finance","emoji":"ð¦","tags":["new"]}],"fr":[{"id":"percentage-calculator","href":"/fr/tools/math/percentage-calculator/","title":"Calculateur de pourcentages","desc":"X % de Y, part en pourcentage et variation en pourcentage - avec formules, exemples et FAQ dans le navigateur.","cat":"math","emoji":"ð","tags":["hot"]},{"id":"mortgage-calculator","href":"/fr/tools/finance/mortgage-calculator/","title":"Simulateur de prêt immobilier","desc":"Estimez vos mensualités, comparez durées et taux et comprenez les arbitrages pratiques avant de vous engager auprès dâun prêteur.","cat":"finance","emoji":"ð ","tags":[]},{"id":"apr-calculator","href":"/fr/tools/finance/apr-calculator/","title":"Calculateur de TAEG","desc":"Coût annuel réel du crédit (RRSO UE / APR US) : frais, commissions, différé et échéance ballon.","cat":"finance","emoji":"ð³","tags":[]},{"id":"tax-calculator","href":"/fr/tools/finance/vat-calculator/","title":"Calculateur de TVA","desc":"Calculateur fiscal universel : ajouter ou retirer la TVA, la GST ou la taxe de vente. Taux indicatifs pour les principaux pays.","cat":"finance","emoji":"ð§¾","tags":["hot"]},{"id":"salary-calculator","href":"/fr/tools/finance/salary-calculator/","title":"Simulateur de salaire 2026","desc":"Net à payer en 2026 : du brut au net, impôt, cotisations et coût employeur. Gratuit dans le navigateur.","cat":"finance","emoji":"ð¼","tags":[]},{"id":"currency-converter","href":"/fr/tools/finance/currency-converter/","title":"Convertisseur de devises","desc":"Conversion de plus de 30 devises avec contexte mid-market pour voyages, virements et achats.","cat":"finance","emoji":"ð±","tags":["hot"]},{"id":"invoice-generator","href":"/fr/tools/finance/invoice-generator/","title":"Générateur de factures","desc":"Facture PDF gratuite dans le navigateur : lignes, TVA par ligne, remise, livraison, logo, notes bancaires. pdfmake, sans compte.","cat":"finance","emoji":"ð","tags":[]},{"id":"income-tax-calculator","href":"/fr/tools/finance/income-tax-calculator/","title":"Simulateur d'impôt sur le revenu","desc":"Estimez l'impôt à partir du brut, d'un abattement et de deux tranches. Net et taux effectif - calculs locaux dans le navigateur.","cat":"finance","emoji":"ðï¸","tags":[]},{"id":"investment-calculator","href":"/fr/tools/finance/investment-calculator/","title":"Simulateur d'investissement","desc":"Intérêts composés et ROI : projection sur plusieurs années avec versements, inflation et frais.","cat":"finance","emoji":"ð","tags":[]},{"id":"hosting-comparison","href":"/fr/tools/business/hosting-comparison/","title":"Comparateur dâhébergement","desc":"Comparez plus de 50 offres dâhébergement gratuitement. Filtrez par RAM, stockage et prix ; tarif dâaccueil vs renouvellement à partir de sources publiques.","cat":"business","emoji":"ð¥ï¸","tags":[]},{"id":"employee-cost-calculator","href":"/fr/tools/business/employee-cost-calculator/","title":"Calculateur du coût employeur","desc":"Vue dâensemble du coût total employeur : charges sociales, taxes de paie et avantages fixes mensuels.","cat":"business","emoji":"ð¥","tags":[]},{"id":"bmi-calculator","href":"/fr/tools/health/bmi-calculator/","title":"Calculateur IMC et WHtR","desc":"IMC et rapport taille-hauteur avec catégories OMS, seuils asiatiques optionnels, métrique ou impérial.","cat":"health","emoji":"â¤ï¸","tags":["new"]},{"id":"calorie-calculator","href":"/fr/tools/health/calorie-calculator/","title":"Calculateur de calories","desc":"BMR et TDEE (Mifflin-St Jeor) avec NEAT et entraînement séparés, objectifs protéines et lipides par kg selon le sexe, estimation des fibres et conseils de prise maigre. Métrique ou impérial.","cat":"health","emoji":"ð¥","tags":["new"]},{"id":"unit-converter","href":"/fr/tools/math/unit-converter/","title":"Convertisseur dâunités","desc":"Convertissez longueur, masse, volume, température, surface et vitesse. Métrique et US, instantanément dans le navigateur.","cat":"math","emoji":"ð","tags":["new"]},{"id":"tip-calculator","href":"/fr/tools/finance/tip-calculator/","title":"Calculateur de pourboire","desc":"Calculez pourboire, taxe, total et part par personne. Base avant ou après taxe - résultat instantané dans le navigateur.","cat":"finance","emoji":"ð¤","tags":["new"]},{"id":"qr-code-generator","href":"/fr/tools/utilities/qr-code-generator/","title":"Générateur de QR code","desc":"Créez des QR codes pour URL, WiFi, vCard, e-mail et texte. Logo, couleurs et styles. Gratuit dans le navigateur.","cat":"utilities","emoji":"ð³","tags":["new"]},{"id":"password-generator","href":"/fr/tools/utilities/password-generator/","title":"Générateur de mot de passe","desc":"Créez des mots de passe forts et mémorables à partir de vos mots. Force réglable, estimation du temps de crack, 100 % local.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"discount-calculator","href":"/fr/tools/finance/discount-calculator/","title":"Calculateur de remise et prix soldé","desc":"Calculez le prix soldé, le pourcentage de remise ou le prix d'origine. Gratuit, instantané, dans le navigateur.","cat":"finance","emoji":"ð·ï¸","tags":["new"]},{"id":"age-calculator","href":"/fr/tools/utilities/age-calculator/","title":"Calculateur d'âge et de dates","desc":"Calculez l'âge exact, l'écart entre deux dates ou ajoutez/soustraiez des périodes. Gratuit dans le navigateur.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"hash-generator","href":"/fr/tools/utilities/hash-generator/","title":"Générateur de hash","desc":"MD5, SHA-1, SHA-256, SHA-384 et SHA-512 depuis texte ou fichiers.","cat":"utilities","emoji":"#ï¸â£","tags":["new"]},{"id":"time-zone-converter","href":"/fr/tools/utilities/time-zone-converter/","title":"Convertisseur de fuseaux horaires","desc":"Convertissez l heure entre fuseaux avec offsets DST exacts et comparez plusieurs zone
127s dans une vue unique.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"uuid-generator","href":"/fr/tools/utilities/uuid-generator/","title":"Générateur UUID / GUID","desc":"Générez des UUID v4, v1 et v7 en ligne. Lot jusqu'à 100, copie ou TXT.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"base-converter","href":"/fr/tools/utilities/base-converter/","title":"Convertisseur de bases","desc":"Convertissez entre décimal, binaire, hexadécimal et octal. Mode signé, regroupement, sync instantanée.","cat":"utilities","emoji":"ð¢","tags":["new"]},{"id":"markup-margin-calculator","href":"/fr/tools/finance/markup-margin-calculator/","title":"Calculateur de marge","desc":"Calculez markup, marge et prix de vente. Différence entre markup sur coût et marge sur prix.","cat":"finance","emoji":"ð","tags":["new"]},{"id":"sales-commission-calculator","href":"/fr/tools/finance/sales-commission-calculator/","title":"Calculateur commission ventes","desc":"Calculez la commission: taux fixe, paliers ou répartition équipe. Gratuit dans le navigateur.","cat":"finance","emoji":"ð°","tags":["new"]},{"id":"meeting-cost-calculator","href":"/fr/tools/utilities/meeting-cost-calculator/","title":"Calculateur coût réunion","desc":"Calculez le coût réel d'une réunion: participants, durée, taux horaires et horloge live. Gratuit dans le navigateur.","cat":"utilities","emoji":"â±ï¸","tags":["new"]},{"id":"running-pace-calculator","href":"/fr/tools/health/running-pace-calculator/","title":"Calculateur allure & temps course","desc":"Calculez allure, temps final ou distance. Presets, tableau splits, bascule km/mi. Gratuit dans le navigateur.","cat":"health","emoji":"ð","tags":["new"]},{"id":"loan-calculator","href":"/fr/tools/finance/loan-calculator/","title":"Calculateur de mensualités","desc":"Calculez la mensualité, comparez jusquâà trois offres, vérifiez lâaccessibilité à partir du revenu, analysez le refinancement et les remboursements anticipés avec résumé intelligent, graphiques et tableau dâamortissement.","cat":"finance","emoji":"ð¦","tags":["new"]}],"es":[{"id":"percentage-calculator","href":"/es/tools/math/percentage-calculator/","title":"Calculadora de porcentajes","desc":"X % de Y, proporcion como porcentaje y cambio porcentual, con formulas, ejemplos y FAQ en el navegador.","cat":"math","emoji":"ð","tags":["hot"]},{"id":"mortgage-calculator","href":"/es/tools/finance/mortgage-calculator/","title":"Calculadora de hipoteca","desc":"Calcula la cuota mensual, compara escenarios de plazo y tipo y entiende los compromisos prácticos antes de solicitar financiación.","cat":"finance","emoji":"ð ","tags":[]},{"id":"apr-calculator","href":"/es/tools/finance/apr-calculator/","title":"Calculadora de TAE","desc":"Coste anual real del crédito (RRSO UE / APR EE. UU.): comisiones, carencia y cuota balón.","cat":"finance","emoji":"ð³","tags":[]},{"id":"tax-calculator","href":"/es/tools/finance/vat-calculator/","title":"Calculadora de IVA","desc":"Calculadora fiscal universal: añade o extrae IVA, GST o impuesto sobre las ventas. Tasas orientativas para los principales paÃses.","cat":"finance","emoji":"ð§¾","tags":["hot"]},{"id":"salary-calculator","href":"/es/tools/finance/salary-calculator/","title":"Calculadora de salario 2026","desc":"Sueldo en mano en 2026: de bruto a neto, impuesto, cotizaciones y coste del empleador. Gratis en el navegador.","cat":"finance","emoji":"ð¼","tags":[]},{"id":"currency-converter","href":"/es/tools/finance/currency-converter/","title":"Conversor de divisas","desc":"Conversión de más de 30 divisas con contexto mid-market para viajes, transferencias y compras.","cat":"finance","emoji":"ð±","tags":["hot"]},{"id":"invoice-generator","href":"/es/tools/finance/invoice-generator/","title":"Generador de facturas","desc":"Factura PDF gratis en el navegador: lÃneas, IVA por fila, descuento, envÃo, logo, notas bancarias. pdfmake, sin registro.","cat":"finance","emoji":"ð","tags":[]},{"id":"income-tax-calculator","href":"/es/tools/finance/income-tax-calculator/","title":"Calculadora de IRPF","desc":"Estima el impuesto desde el bruto, exención y dos tramos. Neto y tipo efectivo - todo en tu navegador.","cat":"finance","emoji":"ðï¸","tags":[]},{"id":"investment-calculator","href":"/es/tools/finance/investment-calculator/","title":"Calculadora de inversión","desc":"Interés compuesto y ROI: proyección a largo plazo con aportes, inflación y comisiones.","cat":"finance","emoji":"ð","tags":[]},{"id":"hosting-comparison","href":"/es/tools/business/hosting-comparison/","title":"Comparador de hosting","desc":"Compara más de 50 planes de hosting gratis. Filtra por RAM, almacenamiento y precio; precio inicial vs renovación a partir de fuentes públicas.","cat":"business","emoji":"ð¥ï¸","tags":[]},{"id":"employee-cost-calculator","href":"/es/tools/business/employee-cost-calculator/","title":"Calculadora de coste del empleado","desc":"Desglose del coste total del empleador: cotizaciones, impuestos de nómina y beneficios fijos mensuales.","cat":"business","emoji":"ð¥","tags":[]},{"id":"bmi-calculator","href":"/es/tools/health/bmi-calculator/","title":"Calculadora de IMC y WHtR","desc":"IMC y ratio cintura-altura con categorÃas OMS, umbrales asiáticos o
127pcionales, métrico o imperial.","cat":"health","emoji":"â¤ï¸","tags":["new"]},{"id":"calorie-calculator","href":"/es/tools/health/calorie-calculator/","title":"Calculadora de calorÃas","desc":"BMR y TDEE (Mifflin-St Jeor) con NEAT y entrenamiento por separado, proteÃnas y grasas por kg según sexo, estimación de fibra y consejos de volumen limpio. Métrico o imperial.","cat":"health","emoji":"ð¥","tags":["new"]},{"id":"unit-converter","href":"/es/tools/math/unit-converter/","title":"Convertidor de unidades","desc":"Convierte longitud, masa, volumen, temperatura, área y velocidad. Métrico y US, al instante en el navegador.","cat":"math","emoji":"ð","tags":["new"]},{"id":"tip-calculator","href":"/es/tools/finance/tip-calculator/","title":"Calculadora de propina","desc":"Calcula propina, impuestos, total y reparto por persona. Base antes o después de impuestos - resultados al instante en el navegador.","cat":"finance","emoji":"ð¤","tags":["new"]},{"id":"qr-code-generator","href":"/es/tools/utilities/qr-code-generator/","title":"Generador de códigos QR","desc":"Genera códigos QR para URL, WiFi, vCard, correo y texto. Logo, colores y estilos. Gratis en el navegador.","cat":"utilities","emoji":"ð³","tags":["new"]},{"id":"password-generator","href":"/es/tools/utilities/password-generator/","title":"Generador de contraseñas","desc":"Genera contraseñas fuertes y memorables con tus propias palabras. Fuerza ajustable, estimación de crack, 100 % en el navegador.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"discount-calculator","href":"/es/tools/finance/discount-calculator/","title":"Calculadora de descuento y precio rebajado","desc":"Calcula el precio con descuento, el porcentaje de rebaja o el precio original. Gratis, al instante, en el navegador.","cat":"finance","emoji":"ð·ï¸","tags":["new"]},{"id":"age-calculator","href":"/es/tools/utilities/age-calculator/","title":"Calculadora de edad y fechas","desc":"Calcula la edad exacta, la diferencia entre fechas o suma/resta periodos. Gratis en el navegador.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"hash-generator","href":"/es/tools/utilities/hash-generator/","title":"Generador de hash","desc":"MD5, SHA-1, SHA-256, SHA-384 y SHA-512 desde texto o archivos.","cat":"utilities","emoji":"#ï¸â£","tags":["new"]},{"id":"time-zone-converter","href":"/es/tools/utilities/time-zone-converter/","title":"Convertidor de zonas horarias","desc":"Convierte hora entre zonas horarias con offsets DST correctos y compara varias regiones en una sola vista.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"uuid-generator","href":"/es/tools/utilities/uuid-generator/","title":"Generador UUID / GUID","desc":"Genera UUID v4, v1 y v7 online. Lotes de hasta 100, copiar o descargar TXT.","cat":"utilities","emoji":"ð","tags":["new"]},{"id":"base-converter","href":"/es/tools/utilities/base-converter/","title":"Conversor de bases numéricas","desc":"Convierte entre decimal, binario, hexadecimal y octal. Modo con signo, agrupación, sync al instante.","cat":"utilities","emoji":"ð¢","tags":["new"]},{"id":"markup-margin-calculator","href":"/es/tools/finance/markup-margin-calculator/","title":"Calculadora de margen","desc":"Calcula markup, margen y precio de venta. Diferencia entre markup sobre coste y margen sobre precio.","cat":"finance","emoji":"ð","tags":["new"]},{"id":"sales-commission-calculator","href":"/es/tools/finance/sales-commission-calculator/","title":"Calculadora comisión ventas","desc":"Calcula comisión de ventas: tasa fija, tramos o reparto en equipo. Gratis en el navegador.","cat":"finance","emoji":"ð°","tags":["new"]},{"id":"meeting-cost-calculator","href":"/es/tools/utilities/meeting-cost-calculator/","title":"Calculadora costo reunión","desc":"Calcula el costo real de una reunión: participantes, duración, tarifas por hora y reloj en vivo. Gratis en el navegador.","cat":"utilities","emoji":"â±ï¸","tags":["new"]},{"id":"running-pace-calculator","href":"/es/tools/health/running-pace-calculator/","title":"Calculadora ritmo y tiempo carrera","desc":"Calcula ritmo, tiempo final o distancia. Presets, tabla splits, toggle km/mi. Gratis en el navegador.","cat":"health","emoji":"ð","tags":["new"]},{"id":"loan-calculator","href":"/es/tools/finance/loan-calculator/","title":"Calculadora de cuotas","desc":"Calcula la cuota, compara hasta tres ofertas, comprueba la asequibilidad según ingresos, analiza la reestructuración y pagos anticipados con resumen inteligente, gráficos y tabla de amortización.","cat":"finance","emoji":"ð¦","tags":["new"]}]}" data-astro-cid-qk3db3zz> <div class="search-modal-container" data-astro-cid-qk3db3zz> <!-- STREFA 1 - Search bar --> <div class="search-header" data-astro-cid-qk3db3zz>
127 <svg class="search-header-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-qk3db3zz> <circle cx="11" cy="11" r="8" data-astro-cid-qk3db3zz></circle> <line x1="21" y1="21" x2="16.65" y2="16.65" data-astro-cid-qk3db3zz></line> </svg> <input id="search-input" type="text" placeholder="Search for tools..." class="search-input-field" autocomplete="off" data-astro-cid-qk3db3zz> <button id="search-close" class="search-esc-badge" data-astro-cid-qk3db3zz> 128ESC 129</button> </div> <!-- STREFA 2 - Body --> <div id="search-results" class="search-body" data-astro-cid-qk3db3zz> <!-- Empty state --> <div id="search-empty-state" class="search-empty-state" data-astro-cid-qk3db3zz> <div class="search-empty-icon" data-astro-cid-qk3db3zz> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-qk3db3zz> <circle cx="11" cy="11" r="8" data-astro-cid-qk3db3zz></circle> <line x1="21" y1="21" x2="16.65" y2="16.65" data-astro-cid-qk3db3zz></line> </svg> </div> <div id="search-empty-title" class="search-empty-title" data-astro-cid-qk3db3zz>Find any tool instantly</div> <div id="search-empty-sub" class="search-empty-sub" data-astro-cid-qk3db3zz>Type a name, category or keyword</div> <div id="search-kbd-hint-container" class="search-kbd-hint-container" data-astro-cid-qk3db3zz> <!-- Injected via JS --> </div> <div class="search-popular" data-astro-cid-qk3db3zz> <div id="search-popular-title" class="search-popular-title" data-astro-cid-qk3db3zz>Popular</div> <div class="search-results-list" data-astro-cid-qk3db3zz> <a href="/tools/finance/vat-calculator/" class="search-tile" data-astro-cid-qk3db3zz> <span class="search-tile-icon" data-astro-cid-qk3db3zz>ð§¾</span> <span id="popular-vat-name" class="search-tile-name" data-astro-cid-qk3db3zz>VAT Calculator</span> <span class="search-tile-cat" data-astro-cid-qk3db3zz>FINANCE</span> </a> <a href="/tools/health/bmi-calculator/" class="search-tile" data-astro-cid-qk3db3zz> <span class="search-tile-icon" data-astro-cid-qk3db3zz>âï¸</span> <span id="popular-bmi-name" class="search-tile-name" data-astro-cid-qk3db3zz>BMI Calculator</span> <span class="search-tile-cat" data-astro-cid-qk3db3zz>HEALTH</span> </a> <a href="/tools/math/percentage-calculator/" class="search-tile" data-astro-cid-qk3db3zz> <span class="search-tile-icon" data-astro-cid-qk3db3zz>%</span> <span id="popular-pct-name" class="search-tile-name" data-astro-cid-qk3db3zz>Percentage Calculator</span> <span class="search-tile-cat" data-astro-cid-qk3db3zz>MATH</span> </a> </div> </div> </div> <div id="search-results-list" class="search-results-list" hidden data-astro-cid-qk3db3zz></div> <p id="search-no-results" class="search-no-results" hidden data-astro-cid-qk3db3zz></p> </div> </div> </dialog>
129<script type="module" src="/_astro/SearchModal.astro_astro_type_script_index_0_lang.Cz5gMh72.js"></script>
129
129<script>(function(){const localizedToolLookup = {"/tools/finance/mortgage-calculator/":true,"/tools/finance/tip-calculator/":true,"/tools/finance/apr-calculator/":true,"/tools/finance/currency-converter/":true,"/tools/finance/invoice-generator/":true,"/tools/finance/salary-calculator/":true,"/tools/finance/vat-calculator/":true,"/tools/finance/investment-calculator/":true,"/tools/finance/income-tax-calculator/":true,"/tools/math/percentage-calculator/":true,"/tools/health/calorie-calculator/":true,"/tools/health/bmi-calculator/":true,"/tools/business/hosting-comparison/":true,"/tools/business/employee-cost-calculator/":true,"/tools/math/unit-converter/":true,"/tools/utilities/qr-code-generator/":true,"/tools/utilities/password-generator/":true,"/tools/finance/discount-calculator/":true,"/tools/utilities/age-calculator/":true,"/tools/utilities/hash-generator/":true,"/tools/utilities/time-zone-converter/":true,"/tools/utilities/uuid-generator/":true,"/tools/utilities/base-converter/":true,"/tools/finance/markup-margin-calculator/":true,"/tools/finance/sales-commission-calculator/":true,"/tools/utilities/meeting-cost-calculator/":true,"/tools/health/running-pace-calculator/":true,"/tools/finance/loan-calculator/":true}; 130const localizedAppLookup = {"/apps/devaudit/":true,"/apps/aqr/":true,"/apps/aqr/privacy/":true,"/apps/devaudit/privacy/":true}; 131const logoHomeI18n = {"en":{"logoHomeAlt":"Home page","logoHomeTitle":"Go to home page"},"pl":{"logoHomeAlt":"Strona gÅówna","logoHomeTitle":"Przejdź do strony gÅównej"},"de":{"logoHomeAlt":"Startseite","logoHomeTitle":"Zur Startseite"},"fr":{"logoHomeAlt":"Page d'accueil","logoHomeTitle":"Aller à la page d'accueil"},"es":{"logoHomeAlt":"Página de inicio","logoHomeTitle":"Ir a la página de inicio"}}; 132 133 // Navbar scroll: at top = transparent pill (no glass/border), same as landing after scroll 134 ;(function () { 135 var navbar = document.querySelector('.navbar'); 136 if (!navbar) return; 137 138 function updateNavbar() { 139 var threshold = document.body.classList.contains('nav-wide') ? 24 : 20; 140 if (window.scrollY > threshold) { 141 navbar.classList.add('is-scrolled'); 142 } else { 143 navbar.classList.remove('is-scrolled'); 144 } 145 } 146 147 window.addEventListener('scroll', updateNavbar, { passive: true }); 148 updateNavbar(); 149 })(); 150 151 // -- Theme toggle: etykieta w szufladzie mobile wg jÄzyka (en â angielski) + wyÅrodkowanie (CSS) -- 152 ;(function () { 153 var THEME_I18N = { 154 en: { nextLight: 'Light theme', nextDark: 'Dark theme' }, 155 pl: { nextLight: 'Motyw jasny', nextDark: 'Motyw ciemny' }, 156 de: { nextLight: 'Heller Modus', nextDark: 'Dunkler Modus' }, 157 fr: { nextLight: 'Thème clair', nextDark: 'Thème sombre' }, 158 es: { nextLight: 'Tema claro', nextDark: 'Tema oscuro' } 159 }; 160 function getUiLang() { 161 return document.documentElement.getAttribute('data-lang') || localStorage.getItem('lang') || 'en'; 162 } 163 function updateThemeLabel() { 164 var el = document.getElementById('themeToggleLabel'); 165 var btn = document.getElementById('theme-toggle'); 166 if (!el) return; 167 var t = document.documentElement.getAttribute('data-theme') || 'dark'; 168 var pack = THEME_I18N[getUiLang()] || THEME_I18N.en; 169 var next = t === 'dark' ? pack.nextLight : pack.nextDark; 170 el.textContent = next; 171 if (btn) btn.setAttribute('aria-label', next); 172 } 173 updateThemeLabel(); 174 document.addEventListener('langchange', updateThemeLabel); 175 var _btn = document.getElementById('theme-toggle'); 176 if (_btn) { 177 _btn.addEventListener('click', function () { 178 var _current = document.documentElement.getAttribute('data-theme') || 'dark'; 179 var _next = _current === 'dark' ? 'light' : 'dark'; 180 document.documentElement.setAttribute('data-theme', _next); 181 localStorage.setItem('theme', _next); 182 updateThemeLabel(); 183 }); 184 } 185 })(); 186 187 // -- Language switcher - FIX 1: CSS .open class, no hidden attr 188 // Na mobile: âEN â Englishâ; na desktop: krótki kod (EN) - wg szerokoÅci < 768 189 // Landing (SSR per locale): przy zmianie jÄzyka przechodzimy na /pl/, /de/ itd. 190 ;(function () { 191 var NAV_I18N = { 192 en: { allTools: 'All tools', extensions: 'Extensions', search: 'Search...', searchAria: 'Search tools' }, 193 pl: { allTools: 'Wszystkie narzedzia', extensions: 'Rozszerzenia', search: 'Szukaj...', searchAria: 'Szukaj narzedzi' }, 194 de: { allTools: 'Alle Tools', extensions: 'Erweiterungen', search: 'Suchen...', searchAria: 'Tools suchen' }, 195 fr: { allTools: 'Tous les outils', extensions: 'Extensions', search: 'Rechercher...', searchAria: 'Rechercher des outils' }, 196 es: { allTools: 'Todas las herramientas', extensions: 'Extensiones', search: 'Buscar...', searchAria: 'Buscar herramientas' } 197 }; 198 199 function getNavLang() { 200 var fromData = document.documentElement.getAttribute('data-lang'); 201 if (fromData && /^(en|pl|de|fr|es)$/.test(fromData)) return fromData; 202 var fromStorage = localStorage.getItem('lang'); 203 if (fromStorage && /^(en|pl|de|fr|es)$/.test(fromStorage)) return fromStorage; 204 return 'en'; 205 } 206 207 function updateAllToolsLabel() { 208 var link = document.getElementById('navbarAllToolsLink'); 209 if (!link) return; 210 var lang = getNavLang(); 211 var pack = NAV_I18N[lang] || NAV_I18N.en; 212 link.textContent = pack.allTools; 213 link.setAttribute('aria-label', pack.allTools); 214 } 215 216 function updateExtensionsLabel() { 217 var lang = getNavLang(); 218 var pack = NAV_I18N[lang] || NAV_I18N.en; 219 ['navbarExtensionsLink', 'navbarExtensionsDrawerLink'].forEach(function (id) { 220 var link = document.getElementById(id); 221 if (!link) return; 222 link.textContent = pack.extensions; 223 link.setAttribute('aria-label', pack.extensions); 224 }); 225 } 226 227 function updateSearchLabel() { 228 var labelEl = document.getElementById('navbarSearchLabel'); 229 var btnEl = document.getElementById('search-trigger'); 230 var lang = getNavLang(); 231 var pack = NAV_I18N[lang] || NAV_I18N.en; 232 if (labelEl) labelEl.textContent = pack.search; 233 if (btnEl) btnEl.setAttribute('aria-label', pack.searchAria); 234 } 235 236 function updateLogoAlt() { 237 var link = document.getElementById('navbarLogoLink'); 238 var lang = getNavLang(); 239 var pack = logoHomeI18n[lang] || logoHomeI18n.en; 240 if (link) { 241 link.setAttribute('aria-label', pack.logoHomeAlt); 242 link.setAttribute('title', pack.logoHomeTitle); 243 } 244 } 245 246 updateAllToolsLabel(); 247 updateExtensionsLabel(); 248 updateSearchLabel(); 249 updateLogoAlt(); 250 document.addEventListener('langchange', updateAllToolsLabel); 251 document.addEventListener('langchange', updateExtensionsLabel); 252 document.addEventListener('langchange', updateSearchLabel); 253 document.addEventListener('langchange', updateLogoAlt); 254 255 var HOME_LANGS = ['en', 'pl', 'de', 'fr', 'es']; 256 257 function isHomePath(pathname) { 258 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 259 if (path === '/') return true;
260 var seg = path.split('/').filter(Boolean); 261 return seg.length === 1 && HOME_LANGS.indexOf(seg[0]) >= 0; 262 } 263 264 function getHomePageLang(pathname) { 265 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 266 if (path === '/') return 'en'; 267 var seg = path.split('/').filter(Boolean); 268 if (seg.length === 1 && HOME_LANGS.indexOf(seg[0]) >= 0) return seg[0]; 269 return 'en'; 270 } 271 272 function homeUrlForLang(lang) { 273 if (lang === 'en') return '/'; 274 return '/' + lang + '/'; 275 } 276 277 function isToolsHubPath(pathname) { 278 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 279 if (path === '/tools') return true; 280 var seg = path.split('/').filter(Boolean); 281 return seg.length === 2 && HOME_LANGS.indexOf(seg[0]) >= 0 && seg[1] === 'tools'; 282 } 283 284 function getToolsHubPageLang(pathname) { 285 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 286 if (path === '/tools') return 'en'; 287 var seg = path.split('/').filter(Boolean); 288 if (seg.length === 2 && seg[1] === 'tools' && HOME_LANGS.indexOf(seg[0]) >= 0) return seg[0]; 289 return 'en'; 290 } 291 292 function toolsHubUrlForLang(lang) { 293 if (lang === 'en') return '/tools/'; 294 return '/' + lang + '/tools/'; 295 } 296 297 function isAppsHubPath(pathname) { 298 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 299 if (path === '/apps') return true; 300 var seg = path.split('/').filter(Boolean); 301 return seg.length === 2 && HOME_LANGS.indexOf(seg[0]) >= 0 && seg[1] === 'apps'; 302 } 303 304 function isAppsPath(pathname) { 305 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 306 if (path === '/apps') return true; 307 var parts = path.split('/').filter(Boolean); 308 if (parts.length >= 1 && parts[0] === 'apps') return true; 309 if (parts.length >= 2 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'apps') return true; 310 return false; 311 } 312 313 function getAppsHubPageLang(pathname) { 314 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 315 if (path === '/apps') return 'en'; 316 var seg = path.split('/').filter(Boolean); 317 if (seg.length === 2 && seg[1] === 'apps' && HOME_LANGS.indexOf(seg[0]) >= 0) return seg[0]; 318 return 'en'; 319 } 320 321 function appsHubUrlForLang(lang) { 322 if (lang === 'en') return '/apps/'; 323 return '/' + lang + '/apps/'; 324 } 325 326 /** JÄzyk z URL rozszerzenia: /apps/.../ (en) lub /pl/apps/.../ */ 327 function getAppsPageLang(pathname) { 328 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 329 var parts = path.split('/').filter(Boolean); 330 if (parts.length >= 2 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'apps') { 331 return parts[0]; 332 } 333 if (parts.length >= 1 && parts[0] === 'apps') return 'en'; 334 return 'en'; 335 } 336 337 /** Fizyczna Åcieżka rozszerzenia: zawsze /apps/.../ */ 338 function physicalAppsPath(pathname) { 339 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 340 var parts = path.split('/').filter(Boolean); 341 if (parts.length >= 3 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'apps') { 342 return '/' + parts.slice(1).join('/') + '/'; 343 } 344 if (parts.length >= 2 && parts[0] === 'apps') { 345 return '/' + parts.join('/') + '/'; 346 } 347 return null; 348 } 349 350 function appPageUrlForLang(pathname, lang) { 351 var phys = physicalAppsPath(pathname); 352 if (!phys) return null; 353 var core = phys.replace(/\/+$/, ''); 354 if (lang === 'en') return core + '/'; 355 return '/' + lang + core + '/'; 356 } 357 358 function updateHubLinkActiveState() { 359 var pathname = window.location.pathname; 360 var toolsLink = document.getElementById('navbarAllToolsLink'); 361 var appsLink = document.getElementById('navbarExtensionsLink'); 362 if (toolsLink) { 363 toolsLink.classList.toggle('is-active', isToolsHubPath(pathname) || (physicalToolsPath(pathname) !== null)); 364 } 365 if (appsLink) { 366 appsLink.classList.toggle('is-active', isAppsPath(pathname)); 367 } 368 var appsDrawer = document.getElementById('navbarExtensionsDrawerLink'); 369 if (appsDrawer) { 370 appsDrawer.classList.toggle('is-active', isAppsPath(pathname)); 371 } 372 } 373 374 var switcher = document.getElementById('langSwitcher'); 375 var btn = document.getElementById('langBtn'); 376 var panel = document.getElementById('langPanel'); 377 var label = document.getElementById('langLabel'); 378 if (!switcher || !btn || !panel || !label) return; 379 380 function isMobileLang() { 381 return window.innerWidth < 768; 382 } 383 function setLangButtonText() { 384 var act = panel.querySelector('.lang-item.active'); 385 if (!act) return; 386 var code = act.getAttribute('data-code') || act.dataset.label; 387 var nm = act.querySelector('.lang-name'); 388 var name = nm ? nm.textContent.replace(/\s+/g, ' ').trim() : ''; 389 if (isMobileLang() && name) { 390 label.textContent = code + ' \u2013 ' + name; 391 } else { 392 label.textContent = act.dataset.label || code; 393 } 394 } 395 396 // Na landing URL jest źródÅem prawdy; na podstronach zostaje localStorage z kalkulatorów 397 if (isHomePath(window.location.pathname)) { 398 var pathLang = getHomePageLang(window.location.pathname); 399 localStorage.setItem('lang', pathLang); 400 document.documentElement.lang = pathLang; 401 document.documentElement.setAttribute('data-lang', pathLang); 402 } 403 404 if (isToolsHubPath(window.location.pathname)) { 405 var thLang = getToolsHubPageLang(window.location.pathname); 406 localStorage.setItem('lang', thLang); 407 document.documentElement.lang = thLang; 408 document.documentElement.setAttribute('data-lang', thLang); 409 } 410 411 if (isAppsPath(window.location.pathname)) { 412 var ahLang = getAppsPageLang(window.location.pathname); 413 localStorage.setItem('lang', ahLang); 414 document.documentElement.lang = ahLang; 415 document.documentElement.setAttribute('data-lang', ahLang); 416 } 417 418 /** JÄzyk z prefiksu URL (/pl/tools/...) - musi nadpisaÄ localStorage na tej stronie */ 419 function getToolSubpageLangFromUrl(pathname) { 420 var path = (pathname || '/').replace(/\/+$/, '') || '/';
421 var parts = path.split('/').filter(Boolean); 422 if (parts.length >= 2 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'tools') { 423 return parts[0]; 424 } 425 return null; 426 } 427 428 /** Fizyczna Åcieżka narzÄdzia: zawsze /tools/.../ */ 429 function physicalToolsPath(pathname) { 430 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 431 var parts = path.split('/').filter(Boolean); 432 if (parts.length >= 2 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'tools') { 433 return '/' + parts.slice(1).join('/') + '/'; 434 } 435 if (parts.length >= 1 && parts[0] === 'tools') { 436 return '/' + parts.join('/') + '/'; 437 } 438 return null; 439 } 440 441 function toolPageUrlForLang(pathname, lang) { 442 var phys = physicalToolsPath(pathname); 443 if (!phys) return null; 444 var core = phys.replace(/\/+$/, ''); 445 if (lang === 'en') return core + '/'; 446 return '/' + lang + core + '/'; 447 } 448 449 /** Strony statyczne z buildem /{lang}/slug/ (EN bez prefiksu /en/) */ 450 var STATIC_LOCALIZED_SLUGS = ['about', 'contact', 'security', 'privacy', 'terms', 'cookies', 'advertise', 'blog']; 451 452 function staticPageCore(pathname) { 453 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 454 var parts = path.split('/').filter(Boolean); 455 if (parts.length === 0) return null; 456 var first = parts[0]; 457 if (HOME_LANGS.indexOf(first) >= 0) parts = parts.slice(1); 458 if (parts.length !== 1) return null; 459 var slug = parts[0]; 460 if (STATIC_LOCALIZED_SLUGS.indexOf(slug) < 0) return null; 461 return '/' + slug + '/'; 462 } 463 464 /** JÄzyk z URL bloga: /blog/ (en) lub /pl/blog/ */ 465 function getBlogPageLangFromUrl(pathname) { 466 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 467 var parts = path.split('/').filter(Boolean); 468 if (parts.length === 1 && parts[0] === 'blog') return 'en'; 469 if (parts.length === 2 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'blog') { 470 return parts[0]; 471 } 472 return null; 473 } 474 475 /** Fizyczna Åcieżka wpisu: /blog/slug/ (bez prefiksu jÄzyka) */ 476 function physicalBlogPostPath(pathname) { 477 var path = (pathname || '/').replace(/\/+$/, '') || '/'; 478 var parts = path.split('/').filter(Boolean); 479 if (parts.length >= 3 && HOME_LANGS.indexOf(parts[0]) >= 0 && parts[1] === 'blog') { 480 return '/' + parts.slice(1).join('/') + '/'; 481 } 482 if (parts.length >= 2 && parts[0] === 'blog') { 483 return '/' + parts.join('/') + '/'; 484 } 485 return null; 486 } 487 488 function blogPostUrlForLang(pathname, lang) { 489 var phys = physicalBlogPostPath(pathname); 490 if (!phys) return null; 491 var core = phys.replace(/\/+$/, ''); 492 if (lang === 'en') return core + '/'; 493 return '/' + lang + core + '/'; 494 } 495 496 function staticPageSlugFromCore(core) { 497 return (core || '').replace(/^\/+|\/+$/g, ''); 498 } 499 500 function staticPageUrlForLang(pathname, lang) { 501 var core = staticPageCore(pathname); 502 if (!core) return null; 503 var slug = staticPageSlugFromCore(core); 504 if (STATIC_LOCALIZED_SLUGS.indexOf(slug) < 0) return core; 505 if (lang === 'en') return core; 506 return '/' + lang + core; 507 } 508 509 var urlToolLang = getToolSubpageLangFromUrl(window.location.pathname); 510 var urlBlogLang = getBlogPageLangFromUrl(window.location.pathname); 511 if (urlToolLang !== null) { 512 localStorage.setItem('lang', urlToolLang); 513 document.documentElement.lang = urlToolLang; 514 document.documentElement.setAttribute('data-lang', urlToolLang); 515 } else if (urlBlogLang !== null) { 516 localStorage.setItem('lang', urlBlogLang); 517 document.documentElement.lang = urlBlogLang; 518 document.documentElement.setAttribute('data-lang', urlBlogLang); 519 } else if (!isHomePath(window.location.pathname) && !isToolsHubPath(window.location.pathname)) { 520 var memLang = localStorage.getItem('lang'); 521 if (memLang && HOME_LANGS.indexOf(memLang) >= 0) { 522 document.documentElement.lang = memLang; 523 document.documentElement.setAttribute('data-lang', memLang); 524 } 525 } 526 527 var saved = localStorage.getItem('lang') || 528 document.documentElement.getAttribute('data-lang') || 'en';
529 var savedItem = panel.querySelector('[data-lang="' + saved + '"]'); 530 if (savedItem) { 531 savedItem.classList.add('active'); 532 } else { 533 var first = panel.querySelector('.lang-item'); 534 if (first) first.classList.add('active'); 535 } 536 setLangButtonText(); 537 538 // Logo â strona gÅówna w aktualnym jÄzyku (landing lub preferencja z localStorage) 539 var logo = document.querySelector('a.navbar-logo'); 540 if (logo) { 541 var hl = isHomePath(window.location.pathname) 542 ? getHomePageLang(window.location.pathname) 543 : isToolsHubPath(window.location.pathname) 544 ? getToolsHubPageLang(window.location.pathname) 545 : isAppsPath(window.location.pathname) 546 ? getAppsPageLang(window.location.pathname) 547 : (localStorage.getItem('lang') || 'en'); 548 if (HOME_LANGS.indexOf(hl) < 0) hl = 'en'; 549 logo.setAttribute('href', homeUrlForLang(hl)); 550 } 551 552 var allTools = document.querySelector('a.navbar-all-tools'); 553 if (allTools) { 554 var atl; 555 if (isHomePath(window.location.pathname)) { 556 atl = getHomePageLang(window.location.pathname); 557 } else if (isToolsHubPath(window.location.pathname)) { 558 atl = getToolsHubPageLang(window.location.pathname); 559 } else if (isAppsPath(window.location.pathname)) { 560 atl = getAppsPageLang(window.location.pathname); 561 } else { 562 atl = localStorage.getItem('lang') || 'en'; 563 } 564 if (HOME_LANGS.indexOf(atl) < 0) atl = 'en'; 565 allTools.setAttribute('href', toolsHubUrlForLang(atl)); 566 } 567 568 document.querySelectorAll('a.navbar-all-extensions').forEach(function (allExtensions) { 569 var ael; 570 if (isHomePath(window.location.pathname)) { 571 ael = getHomePageLang(window.location.pathname); 572 } else if (isAppsPath(window.location.pathname)) { 573 ael = getAppsPageLang(window.location.pathname); 574 } else if (isToolsHubPath(window.location.pathname)) { 575 ael = getToolsHubPageLang(window.location.pathname); 576 } else { 577 ael = localStorage.getItem('lang') || 'en'; 578 } 579 if (HOME_LANGS.indexOf(ael) < 0) ael = 'en'; 580 allExtensions.setAttribute('href', appsHubUrlForLang(ael)); 581 }); 582 583 updateHubLinkActiveState(); 584 585 function openPanel() { 586 switcher.classList.add('open'); 587 btn.setAttribute('aria-expanded', 'true'); 588 } 589 function closePanel() { 590 switcher.classList.remove('open'); 591 btn.setAttribute('aria-expanded', 'false'); 592 } 593 594 btn.addEventListener('click', function (e) { 595 e.stopPropagation(); 596 var willOpen = !switcher.classList.contains('open'); 597 switcher.classList.contains('open') ? closePanel() : openPanel(); 598 if (willOpen) prefetchLangAlternates(); 599 }); 600 601 // Close on outside click 602 document.addEventListener('click', function () { 603 closePanel(); 604 }); 605 606 // Close on Escape 607 document.addEventListener('keydown', function (e) { 608 if (e.key === 'Escape') closePanel(); 609 }); 610 611 window.addEventListener('resize', function () { setLangButtonText(); }, { passive: true }); 612 613 function normPath(p) { 614 var x = (p || '/').replace(/\/+$/, '') || '/'; 615 return x + '/'; 616 } 617 618 var prefetchedLangUrls = Object.create(null); 619 620 function prefetchLangUrl(url) { 621 if (!url || prefetchedLangUrls[url]) return; 622 prefetchedLangUrls[url] = true; 623 try { 624 var link = document.createElement('link'); 625 link.rel = 'prefetch'; 626 link.href = url; 627 link.as = 'document'; 628 document.head.appendChild(link); 629 } catch (e) {} 630 } 631 632 function prefetchLangAlternates() { 633 var pathname = window.location.pathname; 634 panel.querySelectorAll('.lang-item').forEach(function (item) { 635 var lang = item.dataset.lang || 'en'; 636 var target = resolveLangNavigationTarget(pathname, lang); 637 if (target && normPath(target) !== normPath(pathname)) { 638 prefetchLangUrl(target); 639 } 640 }); 641 } 642 643 /** Wymusza malowanie paska zanim startuje nawigacja (inaczej prefetch = instant reload). */ 644 function beginLangNavigation(url, lang) { 645 localStorage.setItem('lang', lang); 646 document.documentElement.classList.add('lang-nav-pending'); 647 var started = Date.now(); 648 var minVisibleMs = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : 320; 649 650 function go() { 651 window.location.assign(url); 652 } 653 654 requestAnimationFrame(function () { 655 requestAnimationFrame(function () { 656 var wait = minVisibleMs - (Date.now() - started); 657 if (wait > 0) setTimeout(go, wait); 658 else go(); 659 }); 660 }); 661 } 662 663 /** Gdy zwraca URL â peÅna nawigacja SSR; nie wolno wtedy langchange / applyTranslations (migotanie UI). */ 664 function resolveLangNavigationTarget(pathname, lang) { 665 if (isHomePath(pathname)) { 666 var cur = getHomePageLang(pathname); 667 if (cur !== lang) return homeUrlForLang(lang); 668 return null; 669 } 670 if (isToolsHubPath(pathname)) { 671 var curT = getToolsHubPageLang(pathname); 672 if (curT !== lang) return toolsHubUrlForLang(lang); 673 return null; 674 } 675 if (isAppsHubPath(pathname)) { 676 var curA = getAppsHubPageLang(pathname); 677 if (curA !== lang) return appsHubUrlForLang(lang); 678 return null; 679 } 680 681 var toolTarget = toolPageUrlForLang(pathname, lang); 682 if (toolTarget && normPath(toolTarget) !== normPath(pathname)) { 683 var phys = physicalToolsPath(pathname); 684 var normPhys = phys ? normPath(phys) : ''; 685 var hasLocalizedBuild = 686 localizedToolLookup && localizedToolLookup[normPhys] === true; 687 if (lang === 'en' || hasLocalizedBuild) return toolTarget; 688 } 689 690 var appTarget = appPageUrlForLang(pathname, lang); 691 if (appTarget && normPath(appTarget) !== normPath(pathname)) {
692 var appPhys = physicalAppsPath(pathname); 693 var normAppPhys = appPhys ? normPath(appPhys) : ''; 694 var hasLocalizedAppBuild = 695 localizedAppLookup && localizedAppLookup[normAppPhys] === true; 696 if (!hasLocalizedAppBuild && appPhys) { 697 var appPhysNorm = normPath(appPhys); 698 for (var appKey in localizedAppLookup) { 699 if (!localizedAppLookup[appKey]) continue; 700 var appPrefix = normPath(appKey).replace(/\/+$/, ''); 701 if (appPhysNorm === normPath(appKey) || appPhysNorm.indexOf(appPrefix + '/') === 0) { 702 hasLocalizedAppBuild = true; 703 break; 704 } 705 } 706 } 707 if (lang === 'en' || hasLocalizedAppBuild) return appTarget; 708 } 709 710 var blogPostTarget = blogPostUrlForLang(pathname, lang); 711 if (blogPostTarget && normPath(blogPostTarget) !== normPath(pathname)) { 712 return blogPostTarget; 713 } 714 715 var staticTarget = staticPageUrlForLang(pathname, lang); 716 if (staticTarget && normPath(staticTarget) !== normPath(pathname)) { 717 return staticTarget; 718 } 719 720 return null; 721 } 722 723 // Option selection 724 panel.querySelectorAll('.lang-item').forEach(function (item) { 725 item.addEventListener('mouseenter', function () { 726 var lang = item.dataset.lang || 'en'; 727 var target = resolveLangNavigationTarget(window.location.pathname, lang); 728 if (target) prefetchLangUrl(target); 729 }, { passive: true }); 730 731 item.addEventListener('click', function (e) { 732 e.stopPropagation(); 733 var lang = item.dataset.lang || 'en'; 734 var pathname = window.location.pathname; 735 var navigateTo = resolveLangNavigationTarget(pathname, lang); 736 737 if (navigateTo) { 738 beginLangNavigation(navigateTo, lang); 739 return; 740 } 741 742 // Strony bez osobnego buildu per jÄzyk: przeÅÄ cz tylko po stronie klienta 743 panel.querySelectorAll('.lang-item').forEach(function (i) { 744 i.classList.remove('active'); 745 }); 746 item.classList.add('active'); 747 setLangButtonText(); 748 closePanel(); 749 750 localStorage.setItem('lang', lang); 751 document.documentElement.lang = lang; 752 document.documentElement.setAttribute('data-lang', lang); 753 754 if (window.i18n && typeof window.i18n.applyTranslations === 'function') { 755 window.i18n.applyTranslations(lang); 756 } 757 758 document.dispatchEvent(new CustomEvent('langchange', { detail: { lang: lang } })); 759 }); 760 }); 761 762 prefetchLangAlternates(); 763 })(); 764 765 // -- Mobile: szuflada (jÄzyk + motyw), All tools + search zawsze w pasku -- 766 ;(function () { 767 function mql() { 768 return window.matchMedia('(max-width: 768px)').matches; 769 } 770 771 function getMobileNavEls() { 772 return { 773 burger: document.getElementById('navBurger'), 774 extras: document.getElementById('navbarExtras'), 775 backdrop: document.getElementById('navbarBackdrop'), 776 closeBtn: document.getElementById('navDrawerClose'), 777 }; 778 } 779 780 function releaseDrawerFocus() { 781 var els = getMobileNavEls(); 782 if (!els.extras || !els.burger) return; 783 784 var active = document.activeElement; 785 if (!(active instanceof HTMLElement) || !els.extras.contains(active)) return; 786 787 els.burger.classList.remove('is-open'); 788 els.burger.focus({ preventScroll: true }); 789 790 if (document.activeElement === active) { 791 active.blur(); 792 } 793 } 794 795 function syncDrawerA11yState() { 796 var els = getMobileNavEls(); 797 if (!els.extras) return; 798 799 if (!mql()) { 800 els.extras.removeAttribute('inert'); 801 els.extras.removeAttribute('aria-hidden'); 802 return; 803 } 804 805 if (document.body.classList.contains('nav-mobile-open')) { 806 els.extras.removeAttribute('inert'); 807 els.extras.removeAttribute('aria-hidden'); 808 } else { 809 releaseDrawerFocus(); 810 els.extras.setAttribute('inert', ''); 811 els.extras.removeAttribute('aria-hidden'); 812 } 813 } 814 815 function setOpen(open) { 816 var els = getMobileNavEls(); 817 if (!els.burger || !els.extras || !els.backdrop) return; 818 819 if (open) { 820 document.body.classList.add('nav-mobile-open'); 821 els.extras.classList.add('is-open'); 822 els.burger.classList.add('is-open'); 823 els.burger.setAttribute('aria-expanded', 'true'); 824 els.burger.setAttribute('aria-label', 'Close menu'); 825 els.backdrop.setAttribute('aria-hidden', 'false'); 826 syncDrawerA11yState(); 827 requestAnimationFrame(function () { 828 if (els.closeBtn) els.closeBtn.focus({ preventScroll: true }); 829 }); 830 } else { 831 document.body.classList.remove('nav-mobile-open'); 832 els.extras.classList.remove('is-open'); 833 els.burger.classList.remove('is-open'); 834 els.burger.setAttribute('aria-expanded', 'false'); 835 els.burger.setAttribute('aria-label', 'Open menu'); 836 els.backdrop.setAttribute('aria-hidden', 'true'); 837 syncDrawerA11yState(); 838 var langSwitcher = document.getElementById('langSwitcher'); 839 if (langSwitcher) langSwitcher.classList.remove('open'); 840 } 841 } 842 843 function closeMobileMenu() { 844 if (mql() && document.body.classList.contains('nav-mobile-open')) { 845 setOpen(false); 846 } 847 } 848 849 function onBackdropDismiss(e) { 850 e.preventDefault(); 851 closeMobileMenu(); 852 } 853 854 function initMobileNavDrawer() { 855 var els = getMobileNavEls(); 856 if (!els.burger || !els.extras || !els.backdrop || els.burger.dataset.navDrawerBound === '1') return; 857 858 els.burger.addEventListener('click', function (e) { 859 e.stopPropagation(); 860 if (!mql()) return; 861 els.burger.classList.remove('is-pressing'); 862 void els.burger.offsetWidth; 863 els.burger.classList.add('is-pressing'); 864 window.setTimeout(function () { els.burger.classList.remove('is-pressing'); }, 280); 865 setOpen(!document.body.classList.contains('nav-mobile-open')); 866 }); 867 868 if (els.closeBtn) { 869 els.closeBtn.addEventListener('click', function (e) { 870 e.stopPropagation(); 871 if (!document.body.classList.contains('nav-mobile-open')) return; 872 var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 873 els.closeBtn.classList.remove('is-pressing'); 874 void els.closeBtn.offsetWidth; 875 els.closeBtn.classList.add('is-pressing'); 876 window.setTimeout(function () { 877 els.closeBtn.classList.remove('is-pressing'); 878 closeMobileMenu(); 879 }, reduce ? 0 : 160); 880 }); 881 } 882 883 els.backdrop.addEventListener('click', closeMobileMenu); 884 els.backdrop.addEventListener('touchend', onBackdropDismiss, { passive: false }); 885 886 var searchBtn = document.getElementById('search-trigger'); 887 if (searchBtn) { 888 searchBtn.addEventListener('click', closeMobileMenu); 889 } 890 891 els.burger.dataset.navDrawerBound = '1'; 892 } 893 894 if (!document.documentElement.dataset.navMobileDocBound) { 895 document.documentElement.dataset.navMobileDocBound = '1'; 896 897 document.addEventListener('click', function (e) { 898 if (!document.body.classList.contains('nav-mobile-open') || !mql()) return; 899 var target = e.target; 900 if (!(target instanceof Node)) return; 901 var els = getMobileNavEls(); 902 if (!els.extras || !els.burger) return; 903 if (els.extras.contains(target) || els.burger.contains(target)) return; 904 closeMobileMenu(); 905 }); 906 907 window.addEventListener('resize', function () { 908 if (!mql()) setOpen(false); 909 syncDrawerA11yState(); 910 }); 911 912 document.addEventListener('keydown', function (e) { 913 if (e.key === 'Escape' && document.body.classList.contains('nav-mobile-open')) { 914 setOpen(false); 915 } 916 }); 917 918 document.addEventListener('astro:page-load', closeMobileMenu); 919 } 920 921 initMobileNavDrawer(); 922 syncDrawerA11yState(); 923 document.addEventListener('astro:page-load', initMobileNavDrawer); 924 document.addEventListener('astro:page-load', syncDrawerA11yState); 925 })(); 926})();</script>
926 <main id="main"> <section class="document-wrapper" data-astro-cid-vdrf3zw3> <h1 data-astro-cid-vdrf3zw3>About AnyServ</h1> <p data-astro-cid-vdrf3zw3>Who we are, what we build, and why privacy comes first.</p> <p data-astro-cid-vdrf3zw3>AnyServ was built on a simple belief: useful tools should be free, fast, and private.</p> <p data-astro-cid-vdrf3zw3>We don't ask you to create an account. We don't sell your data. We don't track what you calculate, what you convert, or what you plan. The numbers you enter stay in your browser - and that's exactly where they belong.</p> <p data-astro-cid-vdrf3zw3>Our goal is straightforward: build a growing library of tools that genuinely help people in their daily lives and work. Not just finance professionals or business owners - everyone. Whether you're a student checking your GPA, a parent planning a family budget, a freelancer generating an invoice, or just someone curious about how compound interest works - there's something here for you. 15+ free tools, always 0 Dollar $, available in 5 languages (EN, PL, DE, FR, ES).</p> <p data-astro-cid-vdrf3zw3>We collect only what's technically necessary to keep the site running: your language preference, your theme choice, and a cached exchange rate. We use Google Analytics to measure traffic - you control this through our cookie settings. No profiles, no advertising fingerprints beyond what you explicitly consent to.</p> <p data-astro-cid-vdrf3zw3>AnyServ stays independent thanks to you - through ads you choose not to block, and partnerships we're selectively building with services we genuinely trust. Every calculator you use, every result you copy, every tool that saves you time - that's what keeps AnyServ growing and free for everyone. We're grateful for your trust and support.</p> <p data-astro-cid-vdrf3zw3>We're just getting started. If there's a tool you'd like to see, write to us at <a href="mailto:[email protected]" class="doc-link" data-astro-cid-vdrf3zw3>[email protected]</a>.</p> <div class="about-kofi" aria-label="Support AnyServ on Ko-fi" data-astro-cid-vdrf3zw3> <a class="about-kofi__link" href="https://ko-fi.com/anyserv" target="_blank" rel="noopener noreferrer" data-astro-cid-vdrf3zw3> <img class="about-kofi__badge about-kofi__badge--on-dark" src="/images/support_me_on_kofi_white.png" alt="Support AnyServ on Ko-fi" width="320" height="92" loading="lazy" decoding="async" data-astro-cid-vdrf3zw3> <img class="about-kofi__badge about-kofi__badge--on-light" src="/images/support_me_on_kofi_dark.png" alt="Support AnyServ on Ko-fi" width="320" height="92" loading="lazy" decoding="async" data-astro-cid-vdrf3zw3> </a> </div> </section> </main> <footer class="anyserv-footer" data-astro-cid-sz7xmlte> <div class="footer-inner" data-astro-cid-sz7xmlte> <div class="footer-grid" data-astro-cid-sz7xmlte> <!-- Col 1: Brand --> <div class="footer-brand" data-astro-cid-sz7xmlte> <a href="/" class="footer-logo" id="footerLogoLink" aria-label="Home page" title="Go to home page" data-astro-cid-sz7xmlte> <img src="/icons/logo.svg" alt="" id="footerLogoImg" width="28" height="28" loading="lazy" decoding="async" class="footer-logo-img" data-astro-cid-sz7xmlte> <span class="footer-wordmark" data-astro-cid-sz7xmlte>Any<span class="footer-serv" data-astro-cid-sz7xmlte>Serv</span></span> </a> <p class="footer-tagline" data-astro-cid-sz7xmlte>Any service, instantly in your browser.</p> </div> <!-- Col 2: Top Tools --> <nav class="footer-col" aria-labelledby="footer-col-top-tools" data-astro-cid-sz7xmlte> <p id="footer-col-top-tools" class="footer-col-title" data-astro-cid-sz7xmlte>Top Tools</p> <ul class="footer-links" data-astro-cid-sz7xmlte> <li data-astro-cid-sz7xmlte> <a href="/tools/math/percentage-calculator/" class="footer-link" data-astro-cid-sz7xmlte> Percentage Calculator </a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/finance/mortgage-calculator/" class="footer-link" data-astro-cid-sz7xmlte> Mortgage Calculator </a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/finance/vat-calculator/" class="footer-link" data-astro-cid-sz7xmlte> Tax Calculator (VAT / GST) </a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/finance/salary-calculator/" class="footer-link" data-astro-cid-sz7xmlte> Salary Calculator 2026 </a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/finance/currency-converter/" class="footer-link" data-astro-cid-sz7xmlte> Currency Converter </a> </li> </ul> </nav> <!-- Col 3: Categories --> <nav class="footer-col" aria-labelledby="footer-col-categories" data-astro-cid-sz7xmlte> <p id="footer-col-categories" class="footer-col-title" data-astro-cid-sz7xmlte>Categories</p> <ul class="footer-links" data-astro-cid-sz7xmlte> <li data-astro-cid-sz7xmlte> <a href="/tools/?category=math" class="footer-link" data-astro-cid-sz7xmlte>Math & Numbers</a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/?category=finance" class="footer-link" data-astro-cid-sz7xmlte>Finance & Money</a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/?category=business" class="footer-link" data-astro-cid-sz7xmlte>Business & Work</a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/?category=health" class="footer-link" data-astro-cid-sz7xmlte>Health & Wellness</a> </li><li data-astro-cid-sz7xmlte> <a href="/tools/?category=utilities" class="footer-link" data-astro-cid-sz7xmlte>Web Utilities</a> </li> <li data-astro-cid-sz7xmlte> <a href="/tools/" class="footer-link footer-link--accent" data-astro-cid-sz7xmlte>All tools -></a> </li> </ul> </nav>
926 <!-- Col 4: AnyServ --> <nav class="footer-col" aria-labelledby="footer-col-anyserv" data-astro-cid-sz7xmlte> <p id="footer-col-anyserv" class="footer-col-title" data-astro-cid-sz7xmlte>AnyServ</p> <div class="footer-anyserv-split" data-astro-cid-sz7xmlte> <ul class="footer-links" data-astro-cid-sz7xmlte> <li data-astro-cid-sz7xmlte><a href="/about/" class="footer-link" data-astro-cid-sz7xmlte>About</a></li> <li data-astro-cid-sz7xmlte><a href="/featured-on/" class="footer-link" id="footer-featured-on-link" data-astro-cid-sz7xmlte>Featured On</a></li> <li data-astro-cid-sz7xmlte><a href="/contact/" class="footer-link" data-astro-cid-sz7xmlte>Contact</a></li> <li data-astro-cid-sz7xmlte><a href="/security/" class="footer-link" data-astro-cid-sz7xmlte>Security</a></li> <li data-astro-cid-sz7xmlte><a href="https://status.anyserv.eu" target="_blank" rel="noopener noreferrer" class="footer-link" data-astro-cid-sz7xmlte>Status</a></li> <li data-astro-cid-sz7xmlte><a href="https://games.anyserv.eu" target="_blank" rel="noopener noreferrer" class="footer-link" id="footer-games-link" data-astro-cid-sz7xmlte>Games</a></li> </ul> <ul class="footer-links" data-astro-cid-sz7xmlte> <li data-astro-cid-sz7xmlte><a href="/blog/" class="footer-link" data-astro-cid-sz7xmlte>Blog</a></li> <li data-astro-cid-sz7xmlte><a href="/advertise/" class="footer-link" data-astro-cid-sz7xmlte>Advertisers</a></li> <li data-astro-cid-sz7xmlte><a href="/privacy/" class="footer-link" data-astro-cid-sz7xmlte>Privacy Policy</a></li> <li data-astro-cid-sz7xmlte><a href="/terms/" class="footer-link" data-astro-cid-sz7xmlte>Terms of Use</a></li> <li data-astro-cid-sz7xmlte><a href="/cookies/" class="footer-link" data-astro-cid-sz7xmlte>Cookie Policy</a></li> <li data-astro-cid-sz7xmlte> <button class="footer-link footer-cookie-btn" onclick="if(window.acceptrics&&typeof window.acceptrics.showBanner==='function'){window.acceptrics.showBanner();}else if(window.Acceptrics&&typeof window.Acceptrics.openPreferences==='function'){window.Acceptrics.openPreferences();}else if(window.AnyservCookieConsent&&typeof window.AnyservCookieConsent.openPreferences==='function'){window.AnyservCookieConsent.openPreferences();}" data-astro-cid-sz7xmlte> Cookie Settings </button> </li> </ul> </div> </nav> </div> <!-- Bottom bar --> <div class="footer-bottom" data-astro-cid-sz7xmlte> <p class="footer-copy" data-astro-cid-sz7xmlte>© 2026 AnyServ. Digital precision for everyone.</p> </div> </div> </footer> <!-- Subtle noise texture for premium feel --> <div class="noise-overlay" aria-hidden="true"></div> <!-- AnyServ Dropdown System -->
926<script src="/_astro/DropdownSystem.DTPHm4RA.js" defer></script>
926 <!-- PWA: registerSW.js z vite-plugin-pwa (injectRegister: script) â bez data: URI (CSP) -->
926<script src="/registerSW.js" defer></script>
926 </body> </html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.