1<!DOCTYPE html> 2<html lang="es"> 3 <head> 4 <meta charset="utf-8" /> 5 <link rel="icon" href="/favicon.svg" type="image/svg+xml" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 <meta name="theme-color" content="#000000" /> 8 <meta name="description" content="Tigrenator es la calculadora de precios para freelancers de Latinoamérica y España. Calcula cuánto cobrar por tus servicios de diseño, desarrollo, marketing y más, ajustado a tu paÃs, experiencia y tipo de cliente. Empieza gratis, sin tarjeta." /> 9 <meta name="keywords" content="calculadora freelance, cuánto cobrar freelance, precios freelance latinoamérica, tarifas diseñador, tarifas desarrollador, presupuesto freelance, freelance venezuela, freelance argentina, freelance mexico, freelance colombia" /> 10 <!-- IMPORTANT: el orden de estos 4 meta tags importa. 11 api/index.js los reemplaza in-bulk usando un regex que matchea 12 desde og:title hasta twitter:card. Si agregás más meta tags entre 13 medio, ajustá también el regex en api/index.js â app.get('/u/:handle'). --> 14 <meta property="og:title" content="Tigrenator â Calculadora de precios para freelancers" /> 15 <meta property="og:description" content="Calcula cuánto cobrar por tus servicios freelance ajustado a tu paÃs, experiencia y tipo de cliente." /> 16 <meta property="og:url" content="https://tigrenator.com" /> 17 <meta name="twitter:card" content="summary" /> 18 <link rel="apple-touch-icon" href="/logo192.png" /> 19 <link rel="manifest" href="/manifest.json" /> 20 <title>Tigrenator â Cuánto cobrar como freelancer en LATAM y España</title> 21 <!-- El tema se pone ANTES de pintar (espejo de src/utils/tema.js): si lo 22 pusiera React, la página abrirÃa oscura y saltarÃa a clara. --> 23
23<script> 24 try { 25 if (localStorage.getItem('tigrenator_tema') === 'claro') { 26 document.documentElement.dataset.tema = 'claro'; 27 document.documentElement.style.colorScheme = 'light'; 28 } 29 } catch (e) {} 30 </script>
30 31 <link rel="preconnect" href="https://fonts.googleapis.com" /> 32 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 33 <!-- Las dos familias del kit (src/kit/kit2d.css): Syne solo en el 34 logotipo escrito, Rubik en todo lo demás (cuerpo 400, interfaz y 35 datos 500â700). --> 36 <link href="https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700&family=Syne:wght@400;600&display=swap" rel="stylesheet" /> 37<!-- ANALÃTICA: no se carga acá a propósito. 38 Google Analytics y Microsoft Clarity los inyecta `src/utils/analytics.js` 39 DESPUÃS de resolver el consentimiento (ver src/utils/consent.js). 40 41 Por qué no van hardcodeados como antes: el RGPD exige consentimiento 42 PREVIO, y un
42<script> en el HTML ya cargó y ya envió antes de que el 43 usuario pueda opinar. Un banner encima de eso no cumple: informa de algo 44 que ya pasó. La única forma de que el consentimiento sea previo de verdad 45 es no tener el script en el documento. 46 47 Si algún dÃa vuelve un script de terceros a este archivo, va DESPUÃS de la 48 hoja de fuentes y nunca entre las lÃneas del bloque og:* â api/index.js 49 reemplaza ese bloque con un regex y un script en medio rompe /u/:handle. --> 50
50<script type="module" crossorigin src="/assets/index-BYkMTzsZ.js"></script>
50 51 <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-C2ZqOKBi.js"> 52 <link rel="modulepreload" crossorigin href="/assets/useTranslation-CVsc-7Nx.js"> 53 <link rel="modulepreload" crossorigin href="/assets/chunk-KS7C4IRE-DkWJIb2K.js"> 54 <link rel="modulepreload" crossorigin href="/assets/firebase-BwG6h_hD.js"> 55 <link rel="modulepreload" crossorigin href="/assets/AuthContext-OOP_QDjz.js"> 56 <link rel="modulepreload" crossorigin href="/assets/axios-By6YYWBT.js"> 57 <link rel="modulepreload" crossorigin href="/assets/exchangeRate-CIwF9CFN.js"> 58 <link rel="modulepreload" crossorigin href="/assets/serviceI18n-ClgLW286.js"> 59 <link rel="modulepreload" crossorigin href="/assets/encargo-YCoU5BLR.js"> 60 <link rel="modulepreload" crossorigin href="/assets/QuoteContext-Da8WoxGD.js"> 61 <link rel="modulepreload" crossorigin href="/assets/util-Bi0ZEjD9.js"> 62 <link rel="modulepreload" crossorigin href="/assets/Bento-CplHpb-b.js"> 63 <link rel="modulepreload" crossorigin href="/assets/Dialogo-wgc0TNDN.js"> 64 <link rel="modulepreload" crossorigin href="/assets/profileTheme-JCNxCvc1.js"> 65 <link rel="modulepreload" crossorigin href="/assets/useServiceCatalog-Ck8ziHvW.js"> 66 <link rel="modulepreload" crossorigin href="/assets/usd-8dP4YqJ3.js"> 67 <link rel="modulepreload" crossorigin href="/assets/ForumCategoryBadge-CyoPWOvy.js"> 68 <link rel="stylesheet" crossorigin href="/assets/kit2d-CJocbZj9.css"> 69 <link rel="stylesheet" crossorigin href="/assets/index-Df55tVns.css"> 70 </head> 71 <body> 72 <noscript>You need to enable JavaScript to run this app.</noscript> 73 <!-- EL SPLASH (2026-10-04). La palabra Tigrenator en Syne, la letra del 74 logotipo, de borde a borde de la pantalla: el contorno se llena de 75 izquierda a derecha mientras carga la app. Vive acá y no en React para 76 verse en el primer pintado; src/utils/splash.js lo retira al montar. 77 Si el JavaScript no llega, se va solo a los 3 s (la animación `sale`): 78 nunca puede tapar la página. Va FUERA de #root a propósito: el 79 servidor reemplaza `<div id="root"></div>` con el HTML de cada ruta. --> 80 <div id="k-splash" aria-hidden="true"> 81 <svg viewBox="0 0 1000 170" preserveAspectRatio="none"> 82 <text class="contorno" x="0" y="140" textLength="1000" lengthAdjust="spacingAndGlyphs">Tigrenator</text> 83 <text class="relleno" x="0" y="140" textLength="1000" lengthAdjust="spacingAndGlyphs">Tigrenator</text> 84 </svg> 85 </div> 86 <style>#k-splash{z-index:2147483000;background:#0b0f1a;align-items:center;transition:opacity .35s ease-out,visibility .35s;animation:.35s ease-out 3s forwards k-splash-sale;display:flex;position:fixed;inset:0}#k-splash svg{width:100vw;height:auto;display:block;overflow:visible}#k-splash text{font-family:Syne,Rubik,system-ui,sans-serif;font-size:168px;font-weight:600}#k-splash .contorno{fill:none;stroke:#fdaa6359;stroke-width:1.5px}#k-splash .relleno{fill:#fdaa63;clip-path:inset(0 100% 0 0);animation:1.1s cubic-bezier(.6,0,.2,1) .1s forwards k-splash-llena}#k-splash[data-estado=sale]{opacity:0;visibility:hidden}:root[data-tema=claro] #k-splash{background:#ededea}@keyframes k-splash-llena{to{clip-path:inset(0)}}@keyframes k-splash-sale{to{opacity:0;visibility:hidden}}@media (prefers-reduced-motion:reduce){#k-splash .relleno{clip-path:none;animation:none}#k-splash{transition:none}}</style> 87 <div id="root"></div> 88 </body> 89</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.