1<!DOCTYPE html> 2<html lang="ru"> 3<head> 4<meta charset="UTF-8" /> 5<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 6<title>Ðа ÑколÑко вам Ñ Ð²Ð°ÑÐ¸Ñ Ð¿Ð¾Ð´ÑÑки â CoinKeeper</title> 7<meta name="description" content="ÐведиÑе Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑаÑÑ Ð¾Ð´Ñ Ð² меÑÑÑ â ÑзнайÑе, на ÑколÑко дней Ð²Ð°Ñ Ñ Ð²Ð°ÑÐ¸Ñ Ð±ÐµÐ· Ð´Ð¾Ñ Ð¾Ð´Ð° и в какÑÑ Ð´Ð°ÑÑ Ð·Ð°ÐºÐ¾Ð½ÑаÑÑÑ Ð´ÐµÐ½Ñги." /> 8 9<meta property="og:title" content="Ðа ÑколÑко Ð²Ð°Ñ Ñ Ð²Ð°ÑиÑ, еÑли завÑÑа пÑопадÑÑ Ð´Ð¾Ñ Ð¾Ð´" /> 10<meta property="og:description" content="ÐведиÑе Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑаÑÑ Ð¾Ð´Ñ â ÑзнайÑе Ñвой Ð·Ð°Ð¿Ð°Ñ Ð¿ÑоÑноÑÑи в днÑÑ Ð¸ даÑÑ, когда конÑаÑÑÑ Ð´ÐµÐ½Ñги." /> 11<meta property="og:type" content="website" /> 12<meta property="og:image" content="https://calc.coinkeeper.me/og/emergency-fund" /> 13<link rel="canonical" href="https://coinkeeper.me/calc/emergency-fund.html" /> 14<meta property="og:url" content="https://coinkeeper.me/calc/emergency-fund.html" /> 15<meta name="twitter:card" content="summary_large_image" /> 16 17<link rel="icon" type="image/png" href="logo.png" /> 18<link rel="apple-touch-icon" href="logo.png" /> 19<link rel="preconnect" href="https://fonts.googleapis.com" /> 20<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 21<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800;900&family=DM+Serif+Display:ital@0;1&display=swap" rel="stylesheet" /> 22<link href="cta.css" rel="stylesheet" />
23<script src="analytics.js?v=1"></script>
23 24 25<style> 26 :root { 27 --bg: #FFF4E6; 28 --bg-2: #FFE5B8; 29 --card: #ffffff; 30 --line: #F4E8D4; 31 --line-2: #F6EFE2; 32 --ink: #1E2857; 33 --ink-2: #273572; 34 --ink-3: #4A557F; 35 --muted: #8B6F4E; 36 --muted-2: #B89572; 37 --orange: #FF791F; 38 --orange-dark: #DB5900; 39 --orange-soft: #FFE8CC; 40 --green: #20C997; --green-dark: #199E77; --green-soft: #B0F2DF; 41 --yellow: #FFB433; --yellow-soft: #FFE5B8; 42 --red: #F95050; --red-soft: #FFC9C9; 43 --shadow: 0 6px 24px rgba(139, 90, 30, .06); 44 --radius: 22px; 45 } 46 * { box-sizing: border-box; margin: 0; padding: 0; } 47 html { -webkit-font-smoothing: antialiased; } 48 body { 49 color: var(--ink); 50 font-family: 'Nunito', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; 51 background: 52 radial-gradient(1100px 700px at 0% 0%, #FFFEFA 0%, transparent 60%), 53 radial-gradient(900px 500px at 100% 15%, #FFF1DE 0%, transparent 55%), 54 radial-gradient(700px 500px at 80% 90%, #FFEFD8 0%, transparent 60%), 55 linear-gradient(180deg, #FFFBF3 0%, #FFF1DC 100%); 56 min-height: 100vh; 57 padding: 24px 16px 80px; 58 } 59 60 .page { max-width: 560px; margin: 0 auto; } 61 62 header { text-align: center; margin: 16px 0 28px; } 63 .brand { display: inline-block; margin-bottom: 16px; } 64 .brand img { height: 30px; width: auto; display: block; } 65 h1 { font-size: 30px; font-weight: 800; line-height: 1.1; letter-spacing: -0.02em; color: var(--ink); } 66 h1 .accent { font-family: 'DM Serif Display', Georgia, serif; font-style: italic; font-weight: 400; color: var(--orange-dark); letter-spacing: -0.01em; } 67 .subtitle { color: var(--muted); font-size: 16px; font-weight: 500; margin-top: 10px; line-height: 1.5; } 68 69 .card { background: var(--card); border-radius: var(--radius); padding: 24px; box-shadow: var(--shadow); border: 1px solid var(--line); margin-bottom: 16px; } 70 71 .input-row label { display: block; font-size: 12px; font-weight: 800; color: var(--muted); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.1em; } 72 .input-row + .input-row { margin-top: 18px; } 73 .input-wrap { position: relative; display: flex; align-items: center; } 74 .input-wrap input { width: 100%; font-family: inherit; font-size: 28px; font-weight: 800; padding: 14px 56px 14px 16px; border: 1.5px solid var(--line); border-radius: 14px; background: #fff; color: var(--ink); outline: none; transition: border-color 0.15s ease, box-shadow 0.15s ease; -moz-appearance: textfield; } 75 .input-wrap input::-webkit-outer-spin-button, .input-wrap input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } 76 .input-wrap input:focus { border-color: var(--orange); box-shadow: 0 0 0 3px var(--orange-soft); } 77 .input-wrap .suffix { position: absolute; right: 18px; font-size: 22px; font-weight: 800; color: var(--muted-2); pointer-events: none; } 78 .quick-amounts { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; } 79 .quick-amounts button { font-family: inherit; font-size: 13px; font-weight: 700; padding: 8px 14px; border: 1.5px solid var(--line); background: #fff; color: var(--ink-3); border-radius: 999px; cursor: pointer; transition: all 0.15s ease; } 80 .quick-amounts button:hover { border-color: var(--orange); color: var(--orange-dark); } 81 .quick-amounts button:focus-visible { outline: 2px solid var(--orange); outline-offset: 2px; } 82 83 .result-card { 84 color: #fff; padding: 32px 24px; text-align: center; border-color: transparent; 85 background: 86 radial-gradient(500px 300px at 100% 0%, rgba(255,121,31,.28) 0%, transparent 60%), 87 linear-gradient(135deg, var(--ink) 0%, var(--ink-2) 100%); 88 box-shadow: 0 14px 36px rgba(30, 40, 87, .28); 89 } 90 .result-label { font-size: 12px; font-weight: 800; color: rgba(255,255,255,0.6); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 12px; } 91 .result-value { font-size: 56px; font-weight: 900; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; line-height: 1; } 92 .result-value .num { color: var(--yellow); } 93 .result-unit { font-size: 16px; color: rgba(255,255,255,0.75); margin-top: 12px; font-weight: 600; } 94 .result-until { margin-top: 24px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,0.12); } 95 .result-until-label { font-size: 12px; color: rgba(255,255,255,0.55); margin-bottom: 6px; font-weight: 600; } 96 .result-until-value { font-size: 26px; font-weight: 800; } 97 98 .gauge { margin-top: 22px; } 99 .gauge-track { height: 12px; border-radius: 999px; background: rgba(255,255,255,0.14); overflow: hidden; } 100 .gauge-fill { height: 100%; border-radius: 999px; background: var(--red); width: 0%; transition: width .4s ease, background .4s ease; } 101 .gauge-scale { display: flex; justify-content: space-between; font-size: 11px; color: rgba(255,255,255,0.5); margin-top: 6px; font-weight: 700; } 102 103 .breakdown { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; } 104 .breakdown-item { background: var(--card); border: 1px solid var(--line); border-radius: 16px; padding: 18px; box-shadow: var(--shadow); } 105 .breakdown-label { font-size: 12px; font-weight: 700; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px; } 106 .breakdown-value { font-size: 22px; font-weight: 800; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; color: var(--ink); } 107 .breakdown-hint { font-size: 12px; color: var(--muted-2); margin-top: 4px; font-weight: 500; } 108 .breakdown-item.highlight { background: var(--orange-soft); border-color: var(--orange); } 109 .breakdown-item.highlight .breakdown-value { color: var(--orange-dark); } 110 111 .fact-card { background: var(--orange-soft); border: 1px solid #FFD8A8; border-radius: var(--radius); padding: 20px 24px; margin-bottom: 16px; } 112 .fact-card .fact-emoji { font-size: 24px; margin-bottom: 8px; } 113 .fact-card .fact-text { font-size: 15px; line-height: 1.55; color: var(--ink); font-weight: 500; } 114 .fact-card .fact-text strong { font-weight: 800; color: var(--orange-dark); } 115 116 footer { text-align: center; margin-top: 32px; font-size: 13px; color: var(--muted); line-height: 1.6; font-weight: 500; } 117 footer a { color: var(--orange-dark); text-decoration: none; border-bottom: 1px solid var(--orange-soft); font-weight: 700; } 118 footer a:hover { color: var(--orange); } 119 120 @media (min-width: 560px) { 121 h1 { font-size: 38px; } 122 .result-value { font-size: 72px; } 123 } 124 125 @media (prefers-reduced-motion: reduce) { 126 *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; } 127 } 128</style> 129</head> 130<body> 131 <div class="page"> 132 <header> 133 <a class="brand" href="https://coinkeeper.me/3?utm_source=viral&utm_medium=logo&utm_campaign=emergency-fund" target="_blank" rel="noopener"><img src="logoname.png" alt="CoinKeeper" /></a> 134 <h1>Ðа ÑколÑко Ð²Ð°Ñ Ñ Ð²Ð°ÑиÑ, еÑли <span class="accent">завÑÑа пÑопадÑÑ Ð´Ð¾Ñ Ð¾Ð´</span></h1> 135 <p class="subtitle">ÐÐ°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑаÑÑ Ð¾Ð´Ñ Ð² меÑÑÑ â и Ð²Ñ ÑзнаеÑе Ñвой Ð·Ð°Ð¿Ð°Ñ Ð¿ÑоÑноÑÑи в днÑÑ .</p> 136 </header> 137 138 <div class="card"> 139 <div class="input-row"> 140 <label for="savings">
140СколÑко Ñ Ð²Ð°Ñ Ð¾Ñложено</label> 141 <div class="input-wrap"> 142 <input type="text" inputmode="numeric" id="savings" value="200 000" autocomplete="off" /> 143 <span class="suffix">â½</span> 144 </div> 145 <div class="quick-amounts"> 146 <button data-target="savings" data-amount="50000">50 000</button> 147 <button data-target="savings" data-amount="100000">100 000</button> 148 <button data-target="savings" data-amount="300000">300 000</button> 149 <button data-target="savings" data-amount="500000">500 000</button> 150 <button data-target="savings" data-amount="1000000">1 млн</button> 151 </div> 152 </div> 153 <div class="input-row"> 154 <label for="expenses">РаÑÑ Ð¾Ð´Ñ Ð² меÑÑÑ</label> 155 <div class="input-wrap"> 156 <input type="text" inputmode="numeric" id="expenses" value="80 000" autocomplete="off" /> 157 <span class="suffix">â½</span> 158 </div> 159 <div class="quick-amounts"> 160 <button data-target="expenses" data-amount="40000">40 000</button> 161 <button data-target="expenses" data-amount="60000">60 000</button> 162 <button data-target="expenses" data-amount="80000">80 000</button> 163 <button data-target="expenses" data-amount="120000">120 000</button> 164 <button data-target="expenses" data-amount="200000">200 000</button> 165 </div> 166 </div> 167 </div> 168 169 <div class="card result-card"> 170 <div class="result-label">ÐÐ°Ñ Ð·Ð°Ð¿Ð°Ñ Ð¿ÑоÑноÑÑи</div> 171 <div class="result-value"><span class="num" id="days-num">â</span></div> 172 <div class="result-unit" id="days-unit">дней без Ð´Ð¾Ñ Ð¾Ð´Ð°</div> 173 174 <div class="gauge"> 175 <div class="gauge-track"><div class="gauge-fill" id="gauge-fill"></div></div> 176 <div class="gauge-scale"><span>0</span><span>3 меÑ</span><span>6 Ð¼ÐµÑ Ð¸ болÑÑе</span></div> 177 </div> 178 179 <div class="result-until"> 180 <div class="result-until-label">ÐÑли Ð´Ð¾Ñ Ð¾Ð´ иÑÑÐµÐ·Ð½ÐµÑ ÑегоднÑ, денÑги конÑаÑÑÑ</div> 181 <div class="result-until-value" id="until-date">â</div> 182 </div> 183 </div> 184 185 <div class="breakdown"> 186 <div class="breakdown-item"> 187 <div class="breakdown-label">ÐÑо меÑÑÑев</div> 188 <div class="breakdown-value" id="months">â</div> 189 </div> 190 <div class="breakdown-item"> 191 <div class="breakdown-label">РаÑÑ Ð¾Ð´Ñ Ð² денÑ</div> 192 <div class="breakdown-value" id="per-day">â</div> 193 </div> 194 <div class="breakdown-item highlight"> 195 <div class="breakdown-label">Ðо подÑÑки 6 меÑÑÑев</div> 196 <div class="breakdown-value" id="gap">â</div> 197 <div class="breakdown-hint">ÑÑолÑко оÑÑалоÑÑ Ð´Ð¾Ð»Ð¾Ð¶Ð¸ÑÑ</div> 198 </div> 199 <div class="breakdown-item"> 200 <div class="breakdown-label">ÐодÑÑка 6 меÑÑÑев ÑÑо</div> 201 <div class="breakdown-value" id="target6">â</div> 202 </div> 203 </div> 204 205 <div class="fact-card" id="fact"></div> 206 207 <div id="cta-root"></div> 208 209 <footer> 210 <p>CoinKeeper ÑÑиÑÐ°ÐµÑ Ð²Ð°Ñи ÑаÑÑ Ð¾Ð´Ñ Ð°Ð²ÑомаÑиÑеÑки â подÑÑÐºÑ Ð½Ðµ пÑидÑÑÑÑ Ð¿ÑикидÑваÑÑ Ð½Ð° глаз. <a href="https://coinkeeper.me/3?utm_source=viral&utm_medium=footer&utm_campaign=emergency-fund" target="_blank" rel="noopener">ÐопÑобÑйÑе</a>.</p> 211 </footer> 212 </div> 213
214<script> 215(function() { 216 const savingsInput = document.getElementById('savings'); 217 const expensesInput = document.getElementById('expenses'); 218 const daysNum = document.getElementById('days-num'); 219 const daysUnit = document.getElementById('days-unit'); 220 const untilDate = document.getElementById('until-date'); 221 const gaugeFill = document.getElementById('gauge-fill'); 222 const monthsEl = document.getElementById('months'); 223 const perDayEl = document.getElementById('per-day'); 224 const gapEl = document.getElementById('gap'); 225 const target6El = document.getElementById('target6'); 226 const factEl = document.getElementById('fact'); 227 228 let savings = 200000; 229 let expenses = 80000; 230 let days = 0; 231 let endDate = null; 232 233 const fmt = (n, decimals = 0) => n.toLocaleString('ru-RU', { minimumFractionDigits: decimals, maximumFractionDigits: decimals }); 234 const fmtCompact = (n) => { 235 if (n >= 1_000_000) return fmt(n / 1_000_000, 1).replace(/[.,]0$/, '') + ' млн â½'; 236 if (n >= 1_000) return fmt(Math.round(n / 1000) * 1000, 0) + ' â½'; 237 return fmt(n, 0) + ' â½'; 238 }; 239 const MONTHS_GEN = ['ÑнваÑÑ','ÑевÑалÑ','маÑÑа','апÑелÑ','маÑ','иÑнÑ','иÑлÑ','авгÑÑÑа','ÑенÑÑбÑÑ','окÑÑбÑÑ','ноÑбÑÑ','декабÑÑ']; 240 function fmtDate(d) { return d.getDate() + ' ' + MONTHS_GEN[d.getMonth()] + ' ' + d.getFullYear(); } 241 242 // 1 Ð´ÐµÐ½Ñ / 2-4 Ð´Ð½Ñ / 5+ дней (Ñ ÑÑÑÑом 11-14) 243 function plural(n, one, few, many) { 244 const m10 = n % 10, m100 = n % 100; 245 if (m10 === 1 && m100 !== 11) return one; 246 if (m10 >= 2 && m10 <= 4 && (m100 < 12 || m100 > 14)) return few; 247 return many; 248 } 249 250 function parseNum(str) { 251 const n = parseInt(String(str).replace(/\D/g, ''), 10); 252 return isNaN(n) ? 0 : n; 253 } 254 function formatInput(n) { return n.toLocaleString('ru-RU').replace(/,/g, ' '); } 255 256 function recalc() { 257 const perDay = expenses / 30; 258 days = perDay > 0 ? Math.floor(savings / perDay) : 0; 259 const months = perDay > 0 ? savings / expenses : 0; 260 261 if (perDay <= 0 || savings <= 0) { 262 daysNum.textContent = '0'; 263 daysUnit.textContent = 'дней без Ð´Ð¾Ñ Ð¾Ð´Ð°'; 264 untilDate.textContent = 'â'; 265 gaugeFill.style.width = '0%'; 266 endDate = null; 267 } else { 268 daysNum.textContent = fmt(days); 269 daysUnit.textContent = plural(days, 'Ð´ÐµÐ½Ñ Ð±ÐµÐ· Ð´Ð¾Ñ Ð¾Ð´Ð°', 'Ð´Ð½Ñ Ð±ÐµÐ· Ð´Ð¾Ñ Ð¾Ð´Ð°', 'дней без Ð´Ð¾Ñ Ð¾Ð´Ð°'); 270 endDate = new Date(); 271 endDate.setDate(endDate.getDate() + days); 272 untilDate.textContent = fmtDate(endDate); 273 // Ñкала: 6 меÑÑÑев (180 дней) = 100% 274 const pct = Math.min(100, days / 180 * 100); 275 gaugeFill.style.width = pct + '%'; 276 gaugeFill.style.background = days < 30 ? 'var(--red)' : days < 90 ? 'var(--yellow)' : 'var(--green)'; 277 } 278 279 monthsEl.textContent = months >= 0.1 ? fmt(months, 1).replace(/[.,]0$/, '') : '0'; 280 perDayEl.textContent = fmt(Math.round(expenses / 30)) + ' â½'; 281 const target6 = expenses * 6; 282 target6El.textContent = fmtCompact(target6); 283 const gap = Math.max(0, target6 - savings); 284 gapEl.textContent = gap === 0 ? 'ÐоÑово â' : fmtCompact(gap); 285 286 updateFact(months); 287 if (window.CTA) { window.CTA.refresh(); } 288 } 289 290 function updateFact(months) { 291 let text; 292 if (savings <= 0 || expenses <= 0) { 293 text = 'ÐведиÑе Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑаÑÑ Ð¾Ð´Ñ â поÑÑиÑаем, на ÑколÑко Ð²Ð°Ñ Ñ Ð²Ð°ÑиÑ.'; 294 } else if (months < 1) { 295 text = `ÐаÑа подÑÑка â <strong>менÑÑе меÑÑÑа</strong>. ÐÑÐ±Ð°Ñ Ð²Ð½ÐµÐ·Ð°Ð¿Ð½Ð¾ÑÑÑ (ÑволÑнение, болезнÑ, поломка) ÑÑÐ°Ð·Ñ ÑÑÐ°Ð½ÐµÑ Ð´Ð¾Ð»Ð³Ð¾Ð¼. ÐеÑÐ²Ð°Ñ ÑÐµÐ»Ñ â оÑложиÑÑ Ñ Ð¾ÑÑ Ð±Ñ <strong>${fmtCompact(expenses)}</strong>, ÑÑо один меÑÑÑ Ð¶Ð¸Ð·Ð½Ð¸.`; 296 } else if (months < 3) { 297 text = `У Ð²Ð°Ñ <strong>${fmt(months, 1).replace(/[.,]0$/, '')} меÑ.</strong> запаÑа. ÐÑо Ñже не нолÑ, но поиÑк новой ÑабоÑÑ Ð² ÑÑеднем Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ 3â4 меÑÑÑа. Ðо ÑпокойнÑÑ 6 меÑÑÑев не Ñ Ð²Ð°ÑÐ°ÐµÑ <strong>${fmtCompact(Math.max(0, expenses * 6 - savings))}</strong>.`; 298 } else if (months < 6) { 299 text = `<strong>${fmt(months, 1).replace(/[.,]0$/, '')} меÑÑÑа запаÑа</strong> â кÑепкий ÑезÑлÑÑаÑ, лÑÑÑе, Ñем Ñ Ð±Ð¾Ð»ÑÑинÑÑва. ÐоÑÑниÑе до 6 меÑÑÑев (еÑÑ <strong>${fmtCompact(Math.max(0, expenses * 6 - savings))}</strong>) â и ÑможеÑе менÑÑÑ ÑабоÑÑ Ð±ÐµÐ· паники.`; 300 } else if (months < 12) { 301 text = `<strong>${fmt(months, 1).replace(/[.,]0$/, '')} меÑÑÑев запаÑа</strong> â ÑÑо полноÑÐµÐ½Ð½Ð°Ñ ÑинанÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´ÑÑка. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пеÑежиÑÑ ÑволÑнение, пеÑеезд или долгÑÑ Ð±Ð¾Ð»ÐµÐ·Ð½Ñ, не Ð·Ð°Ð»ÐµÐ·Ð°Ñ Ð² долги.`; 302 } else { 303 text = `ÐÐ°Ð¿Ð°Ñ Ð½Ð° <strong>${fmt(months, 0)} меÑÑÑев</strong> â ÑÑÐ¾Ð²ÐµÐ½Ñ ÑинанÑовой неÑÑзвимоÑÑи. Ðозможно, ÑаÑÑи ÑÑÐ¸Ñ Ð´ÐµÐ½ÐµÐ³ поÑа ÑабоÑаÑÑ: подÑÑке Ñ Ð²Ð°ÑÐ¸Ñ 6 меÑÑÑев ÑаÑÑ Ð¾Ð´Ð¾Ð², оÑÑалÑное Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиноÑиÑÑ Ð´Ð¾Ñ Ð¾Ð´.`; 304 } 305 factEl.innerHTML = `<div class="fact-emoji">ð</div><div class="fact-text">${text}</div>`; 306 } 307 308 function bindMoneyInput(input, setter) { 309 input.addEventListener('input', (e) => { 310 const raw = parseNum(e.target.value); 311 setter(raw); 312 const formatted = formatInput(raw);
313 const cursorPos = e.target.selectionStart; 314 const diff = formatted.length - e.target.value.length; 315 e.target.value = formatted; 316 try { e.target.setSelectionRange(cursorPos + diff, cursorPos + diff); } catch (err) {} 317 recalc(); 318 }); 319 } 320 bindMoneyInput(savingsInput, v => savings = v); 321 bindMoneyInput(expensesInput, v => expenses = v); 322 323 document.querySelectorAll('.quick-amounts button').forEach(btn => { 324 btn.addEventListener('click', () => { 325 const amount = parseInt(btn.dataset.amount, 10); 326 if (btn.dataset.target === 'savings') { savings = amount; savingsInput.value = formatInput(amount); } 327 else { expenses = amount; expensesInput.value = formatInput(amount); } 328 recalc(); 329 }); 330 }); 331 332 // --- ÐонÑиг Ð´Ð»Ñ Ð¾Ð±Ñего CTA-модÑÐ»Ñ (cta.js) --- 333 window.CALC_CONFIG = { 334 id: 'emergency-fund', 335 course: 'finplan', 336 getInstallReason: () => 337 `ÐÐ°Ñ Ð·Ð°Ð¿Ð°Ñ Ð¿ÑоÑноÑÑи â <strong>${fmt(days)} ${plural(days, 'денÑ', 'днÑ', 'дней')}</strong>. CoinKeeper ÑÑиÑÐ°ÐµÑ ÑаÑÑ Ð¾Ð´Ñ Ð°Ð²ÑомаÑиÑеÑки, Ñак ÑÑо ÑиÑÑа вÑегда бÑÐ´ÐµÑ ÑеÑÑной, а не «на глаз».`, 338 getShareCard: () => ({ 339 eyebrow: 'Ðой Ð·Ð°Ð¿Ð°Ñ Ð¿ÑоÑноÑÑи', 340 currency: '', 341 big: fmt(days), 342 unit: plural(days, 'Ð´ÐµÐ½Ñ Ð±ÐµÐ· Ð´Ð¾Ñ Ð¾Ð´Ð°', 'Ð´Ð½Ñ Ð±ÐµÐ· Ð´Ð¾Ñ Ð¾Ð´Ð°', 'дней без Ð´Ð¾Ñ Ð¾Ð´Ð°'), 343 sub: endDate ? 'денÑги конÑаÑÑÑ ' + fmtDate(endDate) : '', 344 hook: 'Рна ÑколÑко Ñ Ð²Ð°ÑÐ¸Ñ ÑебÑ?' 345 }), 346 getShareText: () => 347 `ÐÑли завÑÑа пÑопадÑÑ Ð´Ð¾Ñ Ð¾Ð´, Ð¼ÐµÐ½Ñ Ñ Ð²Ð°ÑÐ¸Ñ Ð½Ð° ${fmt(days)} ${plural(days, 'денÑ', 'днÑ', 'дней')} ð ÐоÑÑиÑай Ñвой Ð·Ð°Ð¿Ð°Ñ Ð¿ÑоÑноÑÑи â`, 348 related: [
349 { id: 'subscriptions', href: 'subscriptions-calculator.html', icon: 'ð§¾', 350 title: 'СколÑко ÑÑедаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки', hook: 'СÑмма за год Ð²Ð°Ñ ÑдивиÑ' }, 351 { id: 'financial-freedom', href: 'financial-freedom.html', icon: 'ðï¸', 352 title: 'ÐаÑа ÑинанÑовой ÑвободÑ', hook: 'Ðогда ÑможеÑе не ÑабоÑаÑÑ â по пÑÐ°Ð²Ð¸Ð»Ñ 4%' }, 353 { id: 'earnings-counter', href: 'earnings-counter.html', icon: 'â±ï¸', 354 title: 'ÐÐ¾Ñ Ð¾Ð´ в ÑеалÑном вÑемени', hook: 'СколÑко Ð²Ñ Ð·Ð°ÑабаÑÑваеÑе каждÑÑ ÑекÑндÑ' } 355 ] 356 }; 357 358 recalc(); 359})(); 360</script>
vendor: 1 bytes, line 360
360
361<script src="cta.js"></script>
361 362</body> 363</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.