НУЖНА КОНСУЛЬТАЦИЯ
ГАЙД: СТРАХОВКА 2026
БЛОГ
КОНТАКТЫ
О НАС
КОНСУЛЬТАЦИИ
СТРАХОВАНИЕ
УСЛУГИ
ИПОТЕКИ
Страхование
Консультации
Ипотеки
Регистрация фирмы
Языковые курсы
ZDP
Ипотека в Чехии
Консультация по ипотеке
Ипотечный калькулятор
Предварительное одобрение
Рефинансирование ипотеки
Подача заявки
Калькулятор цен на страховку
Гайд "Страховка для визы 2026"
Комплексная страховка
Страховка для ВНЖ
Страховка для студентов
Страховка при хронических заболеваниях
Студенты
Рабочие
Предприниматели
Воссоединение
ПМЖ
Гражданство
Отказ в визе
ZDP для украинцев
ZDP - Українська версія
Услуги
Страхование
Консультации
Регистрация фирмы
Языковые курсы
ZDP для украинцев
ZDP Українська версія
Страхование
Калькулятор цен на страховку
Гайд "Страховка для визы 2026"
Комплексная страховка
Страховка для ВНЖ
Страховка для студентов
Страховка при хронических заболеваниях
Консультации
Студенты
Рабочие
Предприниматели
Воссоединение
ПМЖ
Гражданство
Отказ в визе
ZDP для украинцев
ZDP Українська версія
Ипотеки
Ипотека в Чехии
Консультация по ипотеке
Ипотечный калькулятор
Предварительное одобрение
Рефинансирование ипотеки
Подача заявки
О нас
Контакты
Блог
Партнеры
ГАЙД: Страховка 2026
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> html,body{margin:0;padding:0;background:#fff;} .c1-bank-funds-page { --c1-bg: #f7f4ff; --c1-bg-2: #fff; --c1-panel: #ffffff; --c1-panel-soft: #fbf9ff; --c1-panel-lilac: #f1ebff; --c1-text: #151125; --c1-muted: #5e586e; --c1-soft: #8a829b; --c1-primary: #6236d9; --c1-primary-2: #7c3aed; --c1-primary-ink: #3e1b9b; --c1-primary-soft: #eee7ff; --c1-line: #e4dcf2; --c1-line-strong: #d3c4ee; --c1-danger: #a8324e; --c1-warning: #8a5400; --c1-success: #146c59; --c1-radius-xs: 12px; --c1-radius-sm: 16px; --c1-radius-md: 22px; --c1-radius-lg: 30px; --c1-shadow-sm: 0 10px 24px rgba(44, 30, 80, 0.06); --c1-shadow-md: 0 22px 54px rgba(44, 30, 80, 0.10); --c1-shadow-focus: 0 0 0 4px rgba(47, 123, 234, 0.20); background: radial-gradient(circle at 15% 0%, rgba(124, 58, 237, 0.10), transparent 30rem), radial-gradient(circle at 100% 10%, rgba(98, 54, 217, 0.12), transparent 34rem), linear-gradient(180deg, #fff 0%, var(--c1-bg) 38rem, #fff 100%); color: var(--c1-text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; line-height: 1.55; margin: 0; min-width: 320px; overflow-x: hidden; text-rendering: optimizeLegibility; } .c1-bank-funds-page, .c1-bank-funds-page * { box-sizing: border-box; } .c1-bank-funds-page [hidden] { display: none !important; } .c1-bank-funds-page a { color: inherit; } .c1-bank-funds-page button, .c1-bank-funds-page input, .c1-bank-funds-page select, .c1-bank-funds-page textarea { font: inherit; } .c1-bank-funds-page button, .c1-bank-funds-page summary, .c1-bank-funds-page label, .c1-bank-funds-page select { cursor: pointer; } .c1-bank-funds-page :focus-visible { box-shadow: var(--c1-shadow-focus); outline: 3px solid #2f7bea; outline-offset: 3px; } .c1-bf-container { margin-inline: auto; max-width: 1184px; padding-inline: 24px; width: 100%; } .c1-bf-reading-width { max-width: 900px; } .c1-bf-skip-link { background: var(--c1-text); border-radius: 999px; color: #fff !important; font-weight: 800; left: 18px; padding: 10px 16px; position: fixed; text-decoration: none; top: -88px; z-index: 1000; } .c1-bf-skip-link:focus { top: 18px; } .c1-bf-site-header { backdrop-filter: blur(18px); background: rgba(255, 255, 255, 0.88); border-bottom: 1px solid rgba(98, 54, 217, 0.10); position: sticky; top: 0; z-index: 40; } .c1-bf-site-header__inner { align-items: center; display: flex; gap: 26px; min-height: 72px; } .c1-bf-brand { align-items: center; display: inline-flex; flex: 0 0 auto; font-size: 15px; font-weight: 900; gap: 10px; letter-spacing: 0.04em; text-decoration: none; } .c1-bf-brand__mark { align-items: center; background: linear-gradient(145deg, var(--c1-primary-ink), var(--c1-primary-2)); border-radius: 12px; color: #fff; display: inline-flex; font-size: 18px; font-weight: 950; height: 40px; justify-content: center; width: 40px; } .c1-bf-site-nav { align-items: center; display: flex; gap: 24px; margin-left: auto; } .c1-bf-site-nav a { align-items: center; border-radius: 999px; color: var(--c1-muted); display: inline-flex; font-size: 14px; font-weight: 760; min-height: 40px; min-width: 44px; padding: 0 6px; text-decoration: none; } .c1-bf-site-nav a:hover, .c1-bf-site-nav a:focus-visible { background: rgba(98, 54, 217, 0.08); color: var(--c1-primary); } .c1-bf-header-cta { align-items: center; background: var(--c1-primary-soft); border: 1px solid rgba(98, 54, 217, 0.12); border-radius: 999px; color: var(--c1-primary-ink) !important; display: inline-flex; flex: 0 0 auto; font-size: 14px; font-weight: 850; min-height: 42px; padding: 10px 17px; text-decoration: none; } .c1-bf-header-cta:hover { background: #e5dcff; } .c1-bf-hero { background: linear-gradient(90deg, rgba(98, 54, 217, 0.055) 1px, transparent 1px), linear-gradient(180deg, rgba(98, 54, 217, 0.055) 1px, transparent 1px), radial-gradient(circle at 78% 26%, rgba(124, 58, 237, 0.14), transparent 24rem), linear-gradient(135deg, #fff 0%, #fbf9ff 52%, #f1ebff 100%); background-size: 48px 48px, 48px 48px, auto, auto; border-bottom: 1px solid rgba(98, 54, 217, 0.09); overflow: hidden; padding: clamp(58px, 8vw, 92px) 0 clamp(44px, 6vw, 72px); } .c1-bf-hero__grid { align-items: center; display: grid; gap: clamp(36px, 6vw, 72px); grid-template-columns: minmax(0, 1.05fr) minmax(360px, 0.95fr); } .c1-bf-hero__content { max-width: 700px; } .c1-bf-eyebrow, .c1-bf-kicker { color: var(--c1-primary-ink); font-size: 13px; font-weight: 850; letter-spacing: 0.02em; margin: 0 0 14px; } .c1-bf-eyebrow { background: rgba(255, 255, 255, 0.82); border: 1px solid var(--c1-line); border-radius: 999px; display: inline-flex; padding: 8px 14px; } .c1-bf-hero h1 { color: var(--c1-text); font-size: clamp(42px, 5.2vw, 66px); letter-spacing: -0.055em; line-height: 1.01; margin: 0; } .c1-bf-hero__lead { color: #4d465d; font-size: clamp(18px, 2vw, 21px); line-height: 1.55; margin: 24px 0 0; max-width: 660px; } .c1-bf-hero-proof { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 24px; } .c1-bf-hero-proof span { align-items: center; background: rgba(255, 255, 255, 0.82); border: 1px solid var(--c1-line); border-radius: 999px; color: var(--c1-muted); display: inline-flex; font-size: 13px; gap: 7px; min-height: 38px; padding: 8px 13px; } .c1-bf-hero-proof b { color: var(--c1-primary-ink); font-weight: 900; } .c1-bf-hero__actions { align-items: center; display: flex; flex-wrap: wrap; gap: 14px; margin-top: 32px; } .c1-bf-button { align-items: center; border: 0; border-radius: 18px; display: inline-flex; font-weight: 850; gap: 10px; justify-content: center; min-height: 54px; padding: 14px 24px; position: relative; text-align: center; text-decoration: none; touch-action: manipulation; transition: background-color 170ms ease, border-color 170ms ease, box-shadow 170ms ease, color 170ms ease, transform 170ms ease; } .c1-bf-button:active, .c1-bf-header-cta:active, .c1-bf-service-card button:active, .c1-bf-service-card a:active { transform: translateY(1px); } .c1-bf-button--primary { background: linear-gradient(135deg, var(--c1-primary-ink), var(--c1-primary-2)); box-shadow: 0 18px 38px rgba(98, 54, 217, 0.26), inset 0 1px 0 rgba(255, 255, 255, 0.22); color: #fff !important; } .c1-bf-button--primary:hover { box-shadow: 0 22px 46px rgba(98, 54, 217, 0.32); transform: translateY(-1px); } .c1-bf-button--secondary { background: linear-gradient(180deg, #f3edff, #e9ddff); border: 1px solid rgba(98, 54, 217, 0.14); color: var(--c1-primary-ink); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.84); } .c1-bf-button--light { background: linear-gradient(135deg, #ffffff, #f5efff); border: 1px solid rgba(255, 255, 255, 0.72); box-shadow: 0 18px 38px rgba(0, 0, 0, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.9); color: #351286 !important; text-shadow: none; } .c1-bf-button--light:hover { transform: translateY(-1px); } .c1-bf-button--text { background: rgba(98, 54, 217, 0.06); border: 1px solid transparent; color: var(--c1-primary-ink); min-height: 44px; padding-inline: 16px; } .c1-bf-button--text:hover { background: rgba(98, 54, 217, 0.10); color: var(--c1-primary); } .c1-bf-hero__visual { min-width: 0; } .c1-bf-app-preview { background: linear-gradient(#fff, #fff) padding-box, linear-gradient(145deg, rgba(98, 54, 217, 0.35), rgba(98, 54, 217, 0.08)) border-box; border: 1px solid transparent; border-radius: 30px; box-shadow: var(--c1-shadow-md); margin-left: auto; max-width: 452px; overflow: hidden; position: relative; } .c1-bf-app-preview--premium { isolation: isolate; perspective: none; transform: none; } .c1-bf-app-preview--premium::before, .c1-bf-app-preview--premium::after, .c1-bf-app-preview__glow, .c1-bf-preview-orbit { display: none !important; } .c1-bf-app-preview__top { align-items: center; background: #f7f3ff; border-bottom: 1px solid var(--c1-line); display: flex; gap: 8px; padding: 17px 20px; } .c1-bf-app-preview__top span { background: #d8c9fb; border-radius: 50%; height: 10px; width: 10px; } .c1-bf-app-preview__top b { color: #7a718d; font-size: 11px; font-weight: 900; letter-spacing: 0.10em; margin-left: auto; text-transform: uppercase; } .c1-bf-app-preview__body { padding: clamp(24px, 4vw, 34px); } .c1-bf-preview-result { background: linear-gradient(180deg, #fff, #fbf9ff); border: 1px solid var(--c1-line); border-radius: 24px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9); padding: 20px; } .c1-bf-app-preview small { color: var(--c1-muted); display: block; font-size: 13px; font-weight: 850; margin-bottom: 8px; } .c1-bf-app-preview strong { color: var(--c1-primary-ink); display: block; font-size: clamp(40px, 4.6vw, 56px); font-variant-numeric: tabular-nums; font-weight: 940; letter-spacing: -0.06em; line-height: 1; } .c1-bf-preview-result p { color: var(--c1-muted); font-size: 13px; margin: 10px 0 0; } .c1-bf-preview-stack { display: grid; gap: 12px; margin: 28px 0; } .c1-bf-preview-stack span { background: #eee8fa; border-radius: 999px; display: block; height: 12px; overflow: hidden; } .c1-bf-preview-stack span::before { background: linear-gradient(90deg, var(--c1-primary), var(--c1-primary-2)); border-radius: inherit; content: ""; display: block; height: 100%; width: var(--bar); } .c1-bf-app-preview dl { display: grid; gap: 12px; margin: 0; } .c1-bf-app-preview dl div { align-items: center; background: #fbf9ff; border: 1px solid var(--c1-line); border-radius: 17px; display: flex; gap: 16px; justify-content: space-between; padding: 14px 16px; } .c1-bf-app-preview dt, .c1-bf-app-preview dd { margin: 0; } .c1-bf-app-preview dt { color: var(--c1-muted); } .c1-bf-app-preview dd { font-variant-numeric: tabular-nums; font-weight: 900; text-align: right; } .c1-bf-trust-band { background: #fff; border-bottom: 1px solid rgba(98, 54, 217, 0.09); } .c1-bf-trust-strip { display: grid; gap: 14px; grid-template-columns: repeat(4, minmax(0, 1fr)); padding-block: 22px; } .c1-bf-trust-strip div, .c1-bf-expert-strip div, .c1-bf-law-grid article, .c1-bf-info-card, .c1-bf-service-card, .c1-bf-content-grid article, .c1-bf-faq details { background: #fff; border: 1px solid var(--c1-line); border-radius: var(--c1-radius-md); box-shadow: var(--c1-shadow-sm); } .c1-bf-trust-strip div { min-width: 0; padding: 16px; } .c1-bf-icon, .c1-bf-choice-icon, .c1-bf-service-icon { align-items: center; background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.95), transparent 1.15rem), linear-gradient(145deg, #f7f2ff, #e9ddff); border: 1px solid rgba(98, 54, 217, 0.18); border-radius: 16px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9), 0 10px 22px rgba(98, 54, 217, 0.12); color: var(--c1-primary-ink); display: inline-flex; flex: 0 0 auto; font-weight: 950; justify-content: center; position: relative; } .c1-bf-icon { height: 42px; margin-bottom: 12px; width: 42px; } .c1-bf-trust-strip strong, .c1-bf-trust-strip small, .c1-bf-expert-strip strong, .c1-bf-expert-strip small { display: block; } .c1-bf-trust-strip strong { font-size: 14px; line-height: 1.25; } .c1-bf-trust-strip small, .c1-bf-expert-strip small { color: var(--c1-muted); font-size: 12px; line-height: 1.35; margin-top: 4px; } .c1-bf-calculator-section { background: linear-gradient(180deg, #fff 0%, #fbf9ff 46%, #f4efff 100%); padding: clamp(58px, 8vw, 96px) 0; } .c1-bf-calculator-shell { background: var(--c1-panel); border: 1px solid rgba(98, 54, 217, 0.14); border-radius: var(--c1-radius-lg); box-shadow: var(--c1-shadow-md); overflow: hidden; } .c1-bf-calculator-intro { align-items: start; background: radial-gradient(circle at 100% 0%, rgba(98, 54, 217, 0.10), transparent 18rem), #fff; border-bottom: 1px solid var(--c1-line); display: grid; gap: 28px; grid-template-columns: minmax(0, 1fr) auto; padding: clamp(26px, 4vw, 40px); } .c1-bf-calculator-intro h2, .c1-bf-result-card h2, .c1-bf-result-side h2, .c1-bf-section-heading h2, .c1-bf-final-cta h2 { letter-spacing: -0.04em; line-height: 1.06; margin: 0; } .c1-bf-calculator-intro h2 { font-size: clamp(30px, 3.6vw, 46px); } .c1-bf-calculator-intro p:not(.c1-bf-kicker) { color: var(--c1-muted); margin: 14px 0 0; max-width: 760px; } .c1-bf-mini-steps { display: grid; gap: 10px; list-style: none; margin: 0; min-width: 230px; padding: 0; } .c1-bf-mini-steps li { align-items: center; background: var(--c1-panel-soft); border: 1px solid var(--c1-line); border-radius: 999px; display: flex; font-size: 14px; font-weight: 820; gap: 10px; min-height: 42px; padding: 6px 12px 6px 7px; } .c1-bf-mini-steps span, .c1-bf-step legend > span, .c1-bf-step h3 > span, .c1-bf-info-card > span { align-items: center; background: var(--c1-primary-soft); border-radius: 999px; color: var(--c1-primary-ink); display: inline-flex; flex: 0 0 auto; font-size: 14px; font-weight: 900; height: 30px; justify-content: center; width: 30px; } .c1-bf-calculator-form { display: grid; gap: 22px; padding: clamp(20px, 4vw, 40px); } .c1-bf-validation-summary { background: #fff1f4; border: 1px solid rgba(168, 50, 78, 0.28); border-radius: var(--c1-radius-sm); color: #7c2038; padding: 16px 18px; } .c1-bf-validation-summary ul { margin: 8px 0 0; padding-left: 22px; } .c1-bf-step { background: var(--c1-panel); border: 1px solid var(--c1-line); border-radius: var(--c1-radius-md); box-shadow: var(--c1-shadow-sm); margin: 0; min-width: 0; padding: clamp(20px, 3vw, 28px); } .c1-bf-step[aria-invalid="true"] { border-color: rgba(168, 50, 78, 0.62); } .c1-bf-step legend, .c1-bf-step h3 { align-items: center; color: var(--c1-text); display: flex; font-size: clamp(20px, 2vw, 24px); font-weight: 880; gap: 10px; line-height: 1.2; margin: 0; padding: 0 8px; } .c1-bf-step h3 { padding: 0; } .c1-bf-field-help { color: var(--c1-muted); font-size: 14px; margin: 10px 0 20px; max-width: 920px; } .c1-bf-application-grid, .c1-bf-mode-grid, .c1-bf-law-grid { display: grid; gap: 14px; } .c1-bf-application-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .c1-bf-application-grid--four { grid-template-columns: repeat(4, minmax(0, 1fr)); } .c1-bf-mode-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .c1-bf-choice { background: #fff; border: 1px solid var(--c1-line); border-radius: 18px; display: flex; flex-direction: column; min-height: 136px; min-width: 0; padding: 18px; position: relative; transition: background-color 170ms ease, border-color 170ms ease, box-shadow 170ms ease, transform 170ms ease; } .c1-bf-choice:hover { border-color: rgba(98, 54, 217, 0.36); transform: translateY(-1px); } .c1-bf-choice.is-selected, .c1-bf-choice:has(input:checked) { background: linear-gradient(180deg, #fff, #f8f5ff); border-color: rgba(98, 54, 217, 0.72); box-shadow: 0 14px 34px rgba(98, 54, 217, 0.10); } .c1-bf-choice:has(input:focus-visible) { box-shadow: var(--c1-shadow-focus); outline: 3px solid #2f7bea; outline-offset: 3px; } .c1-bf-choice input { height: 1px; opacity: 0; position: absolute; width: 1px; } .c1-bf-choice-icon { height: 42px; margin-bottom: 14px; width: 42px; } .c1-bf-choice strong { font-size: 16px; line-height: 1.22; } .c1-bf-choice small { color: var(--c1-muted); font-size: 13px; line-height: 1.38; margin-top: 8px; } .c1-bf-choice__badge { align-self: flex-start; background: var(--c1-primary); border-radius: 999px; color: #fff; display: inline-flex; font-size: 12px; font-weight: 850; line-height: 1.2; padding: 5px 11px; width: max-content; } .c1-bf-choice__badge--soft { background: var(--c1-primary-soft); color: var(--c1-primary-ink); } .c1-bf-context-note, .c1-bf-guidance { background: var(--c1-panel-soft); border: 1px solid var(--c1-line); border-left: 4px solid var(--c1-primary); border-radius: 16px; color: #514765; display: grid; font-size: 14px; gap: 5px; margin: 16px 0 0; padding: 13px 14px; } .c1-bf-context-note strong, .c1-bf-context-note span, .c1-bf-context-note small { display: block; } .c1-bf-context-note strong { color: var(--c1-text); } .c1-bf-context-note small { color: var(--c1-muted); } .c1-bf-entrepreneur-note { background: radial-gradient(circle at 100% 0%, rgba(245, 158, 11, 0.12), transparent 15rem), linear-gradient(145deg, #fffdf7, #f7f0ff); border: 1px solid rgba(180, 130, 45, 0.28); border-left: 4px solid #c8841f; border-radius: 18px; box-shadow: 0 16px 36px rgba(56, 40, 96, 0.08); color: #463d55; display: grid; gap: 8px; margin: 16px 0 0; padding: 16px; } .c1-bf-entrepreneur-note[hidden] { display: none; } .c1-bf-entrepreneur-note span { color: #6d3c00; font-size: 12px; font-weight: 900; letter-spacing: 0.08em; text-transform: uppercase; } .c1-bf-entrepreneur-note strong { color: var(--c1-text); font-size: 16px; } .c1-bf-entrepreneur-note p { color: #514765; font-size: 14px; line-height: 1.48; margin: 0; } .c1-bf-entrepreneur-note b { color: var(--c1-primary-ink); } .c1-bf-how-card { background: radial-gradient(circle at 100% 0%, rgba(98, 54, 217, 0.08), transparent 18rem), #fff; border: 1px solid var(--c1-line); border-radius: var(--c1-radius-md); box-shadow: var(--c1-shadow-sm); margin-top: 18px; padding: clamp(20px, 3vw, 28px); } .c1-bf-how-card h3 { color: var(--c1-text); font-size: clamp(24px, 2.6vw, 34px); letter-spacing: -0.035em; margin: 0; } .c1-bf-law-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); margin-top: 20px; } .c1-bf-law-grid article { padding: 18px; } .c1-bf-law-grid h4 { font-size: 17px; margin: 0 0 8px; } .c1-bf-law-grid p { color: var(--c1-muted); font-size: 14px; margin: 0; } .c1-bf-input-panel { animation: c1-enter 180ms ease both; } .c1-bf-form-grid { display: grid; gap: 18px; grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 20px; } .c1-bf-field { border: 0; margin: 0; min-width: 0; padding: 0; } .c1-bf-field--full { grid-column: 1 / -1; } .c1-bf-field > label, .c1-bf-field > legend { color: var(--c1-text); display: block; font-size: 14px; font-weight: 820; line-height: 1.25; margin-bottom: 8px; padding: 0; } .c1-bf-field input[type="date"], .c1-bf-field select { appearance: none; background: #fff; border: 1px solid #d8cde9; border-radius: 16px; color: var(--c1-text); min-height: 54px; padding: 12px 14px; width: 100%; } .c1-bf-field input:focus, .c1-bf-field select:focus { border-color: var(--c1-primary); } .c1-bf-field small { color: var(--c1-muted); display: block; font-size: 12px; line-height: 1.35; margin-top: 6px; } .c1-bf-inline-options, .c1-bf-buffer-options { display: flex; flex-wrap: wrap; gap: 10px; } .c1-bf-inline-options label, .c1-bf-buffer-options label { align-items: center; background: #fff; border: 1px solid var(--c1-line); border-radius: 999px; display: inline-flex; font-size: 14px; gap: 8px; min-height: 46px; padding: 9px 14px; } .c1-bf-inline-options label:has(input:checked), .c1-bf-buffer-options label:has(input:checked) { background: var(--c1-primary-soft); border-color: rgba(98, 54, 217, 0.55); color: var(--c1-primary-ink); } .c1-bf-inline-options input, .c1-bf-buffer-options input { accent-color: var(--c1-primary); height: 17px; width: 17px; } .c1-bf-buffer-options em { background: var(--c1-primary); border-radius: 999px; color: #fff; font-size: 10px; font-style: normal; font-weight: 850; padding: 3px 7px; } .c1-bf-field-error { color: var(--c1-danger); font-size: 13px; font-weight: 780; margin: 7px 0 0; } .c1-bf-form-submit { align-items: center; background: var(--c1-panel-soft); border: 1px solid var(--c1-line); border-radius: 22px; display: flex; gap: 18px; justify-content: space-between; padding: 16px; } .c1-bf-form-submit p { color: var(--c1-muted); font-size: 13px; margin: 0; max-width: 460px; } .c1-bf-result-layout { align-items: start; animation: c1-enter 220ms ease both; display: grid; gap: 24px; grid-template-columns: minmax(0, 1.05fr) minmax(300px, 0.95fr); margin-top: 30px; } .c1-bf-result-layout > *, .c1-bf-result-side { min-width: 0; } .c1-bf-result-card, .c1-bf-warnings, .c1-bf-personal-cta { background: #fff; border: 1px solid var(--c1-line); border-radius: var(--c1-radius-md); min-width: 0; padding: clamp(22px, 3vw, 30px); } .c1-bf-result-card { background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(251, 249, 255, 0.96)), radial-gradient(circle at 100% 0%, rgba(98, 54, 217, 0.10), transparent 14rem), #fff; box-shadow: var(--c1-shadow-md); } .c1-bf-result-card[data-result-tone="income"] { background: radial-gradient(circle at 100% 0%, rgba(168, 50, 78, 0.10), transparent 14rem), #fff; } .c1-bf-result-card__eyebrow { color: var(--c1-primary-ink); font-size: 13px; font-weight: 850; margin: 0 0 8px; } .c1-bf-result-card h2 { font-size: clamp(28px, 3vw, 40px); max-width: 14ch; overflow-wrap: break-word; } .c1-bf-result-context { background: #fff8ec; border: 1px solid #edd7ad; border-radius: 16px; color: #684100; font-size: 14px; font-weight: 720; margin: 14px 0 0; padding: 12px 14px; } .c1-bf-result-card__amount { color: var(--c1-primary-ink); font-size: clamp(42px, 5vw, 64px); font-variant-numeric: tabular-nums; font-weight: 930; letter-spacing: -0.065em; line-height: 1; margin: 22px 0 8px; overflow-wrap: anywhere; } .c1-bf-result-card__buffer { color: var(--c1-muted); margin: 0 0 20px; } .c1-bf-result-stats { display: grid; gap: 10px; margin: 0 0 20px; } .c1-bf-result-stats > div { align-items: start; background: rgba(251, 249, 255, 0.92); border: 1px solid var(--c1-line); border-radius: 18px; display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) minmax(120px, auto); padding: 13px 16px; } .c1-bf-result-stats dt { color: var(--c1-muted); font-size: 14px; min-width: 0; overflow-wrap: break-word; } .c1-bf-result-stats dd { font-variant-numeric: tabular-nums; font-weight: 880; margin: 0; min-width: 0; overflow-wrap: break-word; text-align: right; } .c1-bf-formula-details { background: var(--c1-panel-soft); border: 1px solid var(--c1-line); border-radius: 18px; margin-bottom: 18px; padding: 0 18px; } .c1-bf-formula-details summary { color: var(--c1-primary-ink); font-weight: 850; padding: 15px 0; } .c1-bf-formula-details > div { border-top: 1px solid var(--c1-line); color: var(--c1-muted); font-size: 14px; padding: 13px 0 18px; } .c1-bf-formula-details__lead { margin-top: 0; } .c1-bf-formula-details ul { margin: 0 0 12px; padding-left: 20px; } .c1-bf-result-side { display: grid; gap: 20px; } .c1-bf-result-side h2 { font-size: clamp(26px, 3vw, 36px); } .c1-bank-funds-page #warnings-list { display: grid; gap: 12px; } .c1-bf-warning-card { background: #fffaf1; border: 1px solid #efd8b1; border-left: 6px solid #d28a20; border-radius: 18px; box-shadow: var(--c1-shadow-sm); padding: 18px; } .c1-bf-warning-card[data-tone="important"] { background: #fff4f7; border-color: #f0c6d0; border-left-color: var(--c1-danger); } .c1-bf-warning-card[data-tone="special"] { background: #f7f2ff; border-color: var(--c1-line-strong); border-left-color: var(--c1-primary); } .c1-bf-warning-card h3 { font-size: 16px; margin: 0 0 6px; } .c1-bf-warning-card p { color: var(--c1-muted); font-size: 13px; margin: 0 0 9px; } .c1-bf-warning-card button { align-items: center; background: rgba(98, 54, 217, 0.08); border: 1px solid rgba(98, 54, 217, 0.10); border-radius: 999px; color: var(--c1-primary-ink); display: inline-flex; font-weight: 850; gap: 8px; min-height: 38px; max-width: 100%; padding: 8px 12px; text-align: left; white-space: normal; } .c1-bf-warning-card button::after { content: "→"; } .c1-bf-personal-cta { background: radial-gradient(circle at 100% 0%, rgba(255, 255, 255, 0.16), transparent 11rem), radial-gradient(circle at 0% 100%, rgba(124, 58, 237, 0.28), transparent 12rem), linear-gradient(145deg, #22113d, var(--c1-primary-ink)); border: 0; box-shadow: 0 24px 54px rgba(44, 22, 94, 0.24); color: #fff; overflow: hidden; position: relative; } .c1-bf-personal-cta::before { background: linear-gradient(90deg, rgba(255, 255, 255, 0.28), rgba(255, 255, 255, 0.08)), linear-gradient(90deg, transparent 0 18%, rgba(255, 255, 255, 0.14) 18% 72%, transparent 72%); border-radius: 999px; content: ""; height: 8px; left: 30px; opacity: 0.65; position: absolute; right: 30px; top: 18px; } .c1-bf-personal-cta .c1-bf-kicker, .c1-bf-personal-cta p:not(.c1-bf-action-status) { color: rgba(255, 255, 255, 0.84); } .c1-bf-personal-cta .c1-bf-button--primary { background: linear-gradient(135deg, #ffffff, #efe7ff); border: 1px solid rgba(255, 255, 255, 0.42); box-shadow: 0 14px 32px rgba(0, 0, 0, 0.18); color: var(--c1-primary-ink) !important; margin-top: 18px; width: 100%; } .c1-bf-personal-cta .c1-bf-button--text { background: rgba(255, 255, 255, 0.10); border: 1px solid rgba(255, 255, 255, 0.18); color: #fff; margin-top: 10px; width: 100%; } .c1-bf-personal-cta .c1-bf-button--text:hover { background: rgba(255, 255, 255, 0.16); color: #fff; } .c1-bf-action-status { font-size: 13px; font-weight: 750; margin: 12px 0 0; min-height: 1.5em; } .c1-bf-section { background: #fff; padding: clamp(60px, 8vw, 96px) 0; } .c1-bf-section--tinted { background: radial-gradient(circle at 90% 20%, rgba(98, 54, 217, 0.08), transparent 20rem), var(--c1-bg); } .c1-bf-section-heading { margin-bottom: 28px; max-width: 780px; } .c1-bf-section-heading h2, .c1-bf-final-cta h2 { font-size: clamp(34px, 4vw, 54px); } .c1-bf-section-heading p { color: var(--c1-muted); font-size: 17px; margin: 14px 0 0; } .c1-bf-card-grid { display: grid; gap: 18px; } .c1-bf-card-grid--three { grid-template-columns: repeat(3, minmax(0, 1fr)); } .c1-bf-card-grid--services { align-items: stretch; grid-template-columns: repeat(2, minmax(0, 1fr)); } .c1-bf-info-card, .c1-bf-service-card, .c1-bf-content-grid article { min-width: 0; padding: 24px; } .c1-bf-info-card h3, .c1-bf-service-card h3, .c1-bf-content-grid h3 { color: var(--c1-text); font-size: clamp(21px, 2.2vw, 28px); letter-spacing: -0.035em; line-height: 1.1; margin: 0 0 10px; } .c1-bf-info-card > span { margin-bottom: 18px; } .c1-bf-info-card p, .c1-bf-service-card p, .c1-bf-content-grid p { color: var(--c1-muted); margin: 0; } .c1-bf-disclaimer { background: var(--c1-panel-soft); border: 1px solid var(--c1-line); border-radius: 18px; color: var(--c1-muted); margin: 18px 0 0; padding: 15px 18px; } .c1-bf-expert-strip { display: grid; gap: 14px; grid-template-columns: repeat(3, minmax(0, 1fr)); margin: 0 0 22px; } .c1-bf-expert-strip div { padding: 18px; } .c1-bf-service-card { display: flex; flex-direction: column; gap: 16px; min-height: 100%; padding: clamp(24px, 3vw, 30px); position: relative; transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease; } .c1-bf-service-card:hover { border-color: rgba(98, 54, 217, 0.24); box-shadow: 0 18px 42px rgba(44, 30, 80, 0.10); transform: translateY(-2px); } .c1-bf-service-icon { color: transparent; font-size: 0; height: 56px; letter-spacing: 0; margin-bottom: 2px; overflow: hidden; width: 56px; } .c1-bf-service-icon::before, .c1-bf-service-icon::after { content: ""; display: block; position: absolute; } .c1-bf-service-card:nth-child(1) .c1-bf-service-icon::before { background: linear-gradient(90deg, var(--c1-primary-ink) 0 55%, transparent 55%), linear-gradient(90deg, var(--c1-primary-ink) 0 72%, transparent 72%), linear-gradient(90deg, var(--c1-primary-ink) 0 48%, transparent 48%); background-position: 0 4px, 0 12px, 0 20px; background-repeat: no-repeat; background-size: 22px 2px, 22px 2px, 22px 2px; border: 2px solid var(--c1-primary-ink); border-radius: 5px; height: 28px; left: 17px; top: 14px; width: 22px; } .c1-bf-service-card:nth-child(1) .c1-bf-service-icon::after { border-bottom: 7px solid rgba(98, 54, 217, 0.28); border-left: 7px solid transparent; height: 0; left: 32px; top: 16px; width: 0; } .c1-bf-service-card:nth-child(2) .c1-bf-service-icon::before { background: linear-gradient(180deg, transparent 45%, var(--c1-primary-ink) 45%), linear-gradient(180deg, transparent 25%, var(--c1-primary-ink) 25%), linear-gradient(180deg, transparent 8%, var(--c1-primary-ink) 8%); background-position: 0 0, 10px 0, 20px 0; background-repeat: no-repeat; background-size: 6px 28px; height: 28px; left: 15px; top: 14px; width: 28px; } .c1-bf-service-card:nth-child(2) .c1-bf-service-icon::after { background: rgba(98, 54, 217, 0.35); border-radius: 999px; height: 2px; left: 14px; top: 42px; width: 30px; } .c1-bf-service-card:nth-child(3) .c1-bf-service-icon::before { border-bottom: 9px solid var(--c1-primary-ink); border-left: 16px solid transparent; border-right: 16px solid transparent; height: 0; left: 12px; top: 13px; width: 0; } .c1-bf-service-card:nth-child(3) .c1-bf-service-icon::after { background: linear-gradient(90deg, var(--c1-primary-ink) 0 4px, transparent 4px 8px, var(--c1-primary-ink) 8px 12px, transparent 12px 16px, var(--c1-primary-ink) 16px 20px), linear-gradient(var(--c1-primary-ink), var(--c1-primary-ink)); background-position: 0 0, 0 20px; background-repeat: no-repeat; background-size: 20px 18px, 30px 3px; height: 25px; left: 18px; top: 23px; width: 30px; } .c1-bf-service-card:nth-child(4) .c1-bf-service-icon::before { background: var(--c1-primary-ink); clip-path: polygon(50% 0, 83% 12%, 83% 46%, 50% 88%, 17% 46%, 17% 12%); height: 32px; left: 12px; top: 12px; width: 32px; } .c1-bf-service-card:nth-child(4) .c1-bf-service-icon::after { border: 2px solid #fff; border-left: 0; border-top: 0; height: 13px; left: 25px; top: 19px; transform: rotate(45deg); width: 7px; } .c1-bf-icon, .c1-bf-choice-icon, .c1-bf-service-icon { color: transparent; overflow: hidden; padding: 7px; } .c1-bf-icon { border-radius: 18px; height: 48px; width: 48px; } .c1-bf-choice-icon { border-radius: 20px; height: 54px; margin-bottom: 16px; padding: 8px; width: 54px; } .c1-bf-service-icon { background: radial-gradient(circle at 28% 18%, rgba(255, 255, 255, 0.95), transparent 1.6rem), linear-gradient(145deg, #ffffff 0%, #f4efff 46%, #e8dcff 100%); border-radius: 24px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.95), 0 18px 34px rgba(98, 54, 217, 0.16); height: 72px; margin-bottom: 18px; padding: 10px; width: 72px; } .c1-bf-icon img, .c1-bf-choice-icon img, .c1-bf-service-icon img { display: block; filter: drop-shadow(0 10px 14px rgba(63, 28, 135, 0.18)); height: 100%; object-fit: contain; width: 100%; } .c1-bf-service-icon::before, .c1-bf-service-icon::after { content: none !important; } .c1-bf-service-card button, .c1-bf-service-card a { align-items: center; align-self: stretch; background: linear-gradient(135deg, var(--c1-primary-ink), var(--c1-primary-2)); border: 0; border-radius: 16px; box-shadow: 0 12px 26px rgba(98, 54, 217, 0.20), inset 0 1px 0 rgba(255, 255, 255, 0.20); color: #fff; display: inline-flex; font-weight: 850; justify-content: space-between; margin-top: auto; min-height: 52px; padding: 13px 16px; text-align: left; text-decoration: none; touch-action: manipulation; transition: box-shadow 170ms ease, transform 170ms ease, background 170ms ease; } .c1-bf-service-card button::after, .c1-bf-service-card a::after { align-items: center; background: rgba(255, 255, 255, 0.18); border-radius: 999px; content: "→"; display: inline-flex; flex: 0 0 auto; height: 28px; justify-content: center; margin-left: 12px; width: 28px; } .c1-bf-service-card button:hover, .c1-bf-service-card a:hover { box-shadow: 0 16px 34px rgba(98, 54, 217, 0.26), inset 0 1px 0 rgba(255, 255, 255, 0.22); transform: translateY(-1px); } .c1-bf-content-grid { display: grid; gap: 18px; grid-template-columns: repeat(2, minmax(0, 1fr)); } .c1-bf-content-grid article { min-height: 170px; } .c1-bf-faq details { margin-bottom: 12px; } .c1-bf-faq summary { color: var(--c1-text); font-size: 18px; font-weight: 850; list-style: none; padding: 19px 54px 19px 20px; position: relative; } .c1-bf-faq summary::-webkit-details-marker { display: none; } .c1-bf-faq summary::after { align-items: center; background: var(--c1-primary-soft); border-radius: 999px; color: var(--c1-primary-ink); content: "+"; display: inline-flex; font-size: 22px; font-weight: 700; height: 30px; justify-content: center; position: absolute; right: 16px; top: 16px; width: 30px; } .c1-bf-faq details[open] summary::after { content: "−"; } .c1-bf-faq details p { border-top: 1px solid var(--c1-line); color: var(--c1-muted); margin: 0; padding: 16px 20px 20px; } .c1-bf-final-cta { background: radial-gradient(circle at 14% 18%, rgba(255, 255, 255, 0.18), transparent 16rem), radial-gradient(circle at 86% 72%, rgba(255, 255, 255, 0.14), transparent 18rem), linear-gradient(145deg, #1d1034 0%, var(--c1-primary-ink) 52%, #5b21b6 100%); color: #fff; overflow: hidden; padding: clamp(64px, 8vw, 92px) 0; position: relative; } .c1-bf-final-cta::before { background: linear-gradient(90deg, rgba(255, 255, 255, 0.09) 1px, transparent 1px), linear-gradient(180deg, rgba(255, 255, 255, 0.09) 1px, transparent 1px); background-size: 46px 46px; content: ""; inset: 0; opacity: 0.35; position: absolute; } .c1-bf-final-cta > .c1-bf-container { position: relative; z-index: 1; } .c1-bf-final-cta__inner { align-items: center; display: grid; gap: clamp(28px, 5vw, 58px); grid-template-columns: minmax(0, 1fr) minmax(320px, 430px); } .c1-bf-final-cta .c1-bf-kicker, .c1-bf-final-cta p { color: rgba(255, 255, 255, 0.84); } .c1-bf-final-cta p { margin: 12px 0 0; max-width: 680px; } .c1-bf-final-cta__copy h2 { max-width: 880px; } .c1-bf-final-cta__checks { display: flex; flex-wrap: wrap; gap: 10px; list-style: none; margin: 24px 0 0; padding: 0; } .c1-bf-final-cta__checks li { align-items: center; background: rgba(255, 255, 255, 0.10); border: 1px solid rgba(255, 255, 255, 0.16); border-radius: 999px; color: rgba(255, 255, 255, 0.92); display: inline-flex; font-size: 14px; font-weight: 760; gap: 8px; min-height: 38px; padding: 8px 13px; } .c1-bf-final-cta__checks li::before { background: #fff; border-radius: 999px; color: var(--c1-primary-ink); content: "✓"; display: inline-flex; flex: 0 0 auto; font-size: 11px; font-weight: 950; height: 20px; justify-content: center; line-height: 20px; width: 20px; } .c1-bf-final-cta__panel { background: radial-gradient(circle at 100% 0%, rgba(255, 255, 255, 0.20), transparent 8rem), rgba(255, 255, 255, 0.12); border: 1px solid rgba(255, 255, 255, 0.22); border-radius: 28px; box-shadow: 0 28px 70px rgba(0, 0, 0, 0.24), inset 0 1px 0 rgba(255, 255, 255, 0.20); padding: clamp(22px, 3vw, 30px); } .c1-bf-final-cta__panel span { color: rgba(255, 255, 255, 0.72); display: block; font-size: 13px; font-weight: 850; margin-bottom: 10px; text-transform: uppercase; } .c1-bf-final-cta__panel strong { color: #fff; display: block; font-size: clamp(26px, 3vw, 34px); letter-spacing: -0.035em; line-height: 1.06; } .c1-bf-final-cta .c1-bf-button--primary { background: linear-gradient(135deg, #fff, #efe7ff); box-shadow: 0 18px 38px rgba(0, 0, 0, 0.22); color: var(--c1-primary-ink) !important; margin-top: 22px; width: 100%; } .c1-bf-footer { background: #130d20; color: #ddd5e9; padding: 32px 0; } .c1-bf-footer .c1-bf-container { align-items: center; display: flex; gap: 28px; justify-content: space-between; } .c1-bf-footer strong { color: #fff; letter-spacing: 0.06em; } .c1-bf-footer p { color: #c9c1d8; font-size: 12px; margin: 0; max-width: 760px; text-align: right; } .c1-bf-footer-consult { align-items: stretch !important; background: radial-gradient(circle at 14% 0%, rgba(139, 92, 246, 0.32), transparent 16rem), radial-gradient(circle at 90% 100%, rgba(255, 255, 255, 0.10), transparent 18rem), linear-gradient(145deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03)); border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 30px; display: grid !important; gap: clamp(22px, 4vw, 46px) !important; grid-template-columns: minmax(0, 0.96fr) minmax(320px, 1.04fr); margin-top: 28px; padding: clamp(22px, 4vw, 34px); } .c1-bf-footer-consult__copy { display: flex; flex-direction: column; justify-content: center; } .c1-bf-footer-consult__copy span { color: #cdbbff; font-size: 13px; font-weight: 900; letter-spacing: 0.08em; margin-bottom: 12px; text-transform: uppercase; } .c1-bf-footer-consult__copy h2 { color: #fff; font-size: clamp(28px, 4vw, 46px); letter-spacing: -0.045em; line-height: 0.98; margin: 0; max-width: 560px; } .c1-bf-footer-consult__copy p { color: #d9d1e8; font-size: 15px; line-height: 1.55; margin-top: 18px; max-width: 560px; text-align: left; } .c1-bf-footer-consult__checks { display: flex; flex-wrap: wrap; gap: 10px; list-style: none; margin: 22px 0 0; padding: 0; } .c1-bf-footer-consult__checks li { align-items: center; background: rgba(255, 255, 255, 0.10); border: 1px solid rgba(255, 255, 255, 0.16); border-radius: 999px; color: rgba(255, 255, 255, 0.92); display: inline-flex; font-size: 13px; font-weight: 800; gap: 8px; min-height: 36px; padding: 7px 12px; } .c1-bf-footer-consult__checks li::before { background: #fff; border-radius: 999px; color: var(--c1-primary-ink); content: "✓"; display: inline-flex; flex: 0 0 auto; font-size: 11px; font-weight: 950; height: 19px; justify-content: center; line-height: 19px; width: 19px; } .c1-bf-footer-consult__copy .c1-bf-button { margin-top: 24px; width: max-content; } .c1-bf-consult-form { background: rgba(255, 255, 255, 0.96); border: 1px solid rgba(255, 255, 255, 0.45); border-radius: 26px; box-shadow: 0 28px 62px rgba(0, 0, 0, 0.26); display: grid; gap: 14px; grid-template-columns: repeat(2, minmax(0, 1fr)); padding: clamp(18px, 3vw, 26px); } .c1-bf-consult-form label { display: grid; gap: 8px; } .c1-bf-consult-form label span { color: var(--c1-text); font-size: 13px; font-weight: 850; } .c1-bf-consult-form input, .c1-bf-consult-form textarea { background: #fbf9ff; border: 1px solid #ded4f4; border-radius: 16px; color: var(--c1-text); font: inherit; min-height: 48px; outline: 0; padding: 13px 14px; resize: vertical; transition: border-color 180ms ease, box-shadow 180ms ease, background 180ms ease; width: 100%; } .c1-bf-consult-form input:focus, .c1-bf-consult-form textarea:focus { background: #fff; border-color: rgba(98, 54, 217, 0.72); box-shadow: var(--c1-shadow-focus); } .c1-bf-consult-form__wide, .c1-bf-consult-form button, .c1-bf-consult-form .c1-bf-action-status { grid-column: 1 / -1; } .c1-bf-consult-form .c1-bf-button { justify-content: center; width: 100%; } .c1-bf-consult-form .c1-bf-action-status { color: var(--c1-muted); font-size: 13px; margin: 0; max-width: none; text-align: left; } .c1-bf-noscript { background: #fff3cd; border: 1px solid #e2c56e; border-radius: 14px; bottom: 10px; left: 10px; padding: 14px; position: fixed; right: 10px; z-index: 99; } @keyframes c1-enter { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 1020px) { .c1-bf-site-nav { display: none; } .c1-bf-header-cta { margin-left: auto; } .c1-bf-hero__grid, .c1-bf-calculator-intro, .c1-bf-result-layout, .c1-bf-card-grid--three, .c1-bf-card-grid--services, .c1-bf-content-grid, .c1-bf-footer-consult, .c1-bf-final-cta__inner { grid-template-columns: 1fr; } .c1-bf-app-preview { margin-inline: 0; max-width: 520px; } .c1-bf-trust-strip, .c1-bf-expert-strip, .c1-bf-application-grid, .c1-bf-application-grid--four, .c1-bf-law-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .c1-bf-mini-steps { grid-template-columns: repeat(3, minmax(0, 1fr)); min-width: 0; } } @media (max-width: 720px) { .c1-bf-container { padding-inline: 16px; } .c1-bf-site-header__inner { gap: 12px; min-height: 64px; } .c1-bf-brand { font-size: 14px; } .c1-bf-brand__mark { border-radius: 10px; height: 34px; width: 34px; } .c1-bf-header-cta { font-size: 12px; min-height: 38px; padding: 8px 12px; } .c1-bf-hero { background-size: 34px 34px, 34px 34px, auto, auto; padding: 42px 0 34px; } .c1-bf-hero h1 { font-size: clamp(36px, 10vw, 46px); line-height: 1.04; } .c1-bf-hero__lead { font-size: 17px; } .c1-bf-hero-proof, .c1-bf-hero__actions, .c1-bf-form-submit, .c1-bf-final-cta__inner, .c1-bf-footer .c1-bf-container { align-items: stretch; flex-direction: column; } .c1-bf-hero-proof span { justify-content: center; } .c1-bf-hero__actions .c1-bf-button, .c1-bf-form-submit .c1-bf-button, .c1-bf-final-cta .c1-bf-button { width: 100%; } .c1-bf-app-preview { border-radius: 26px; } .c1-bf-app-preview__body { padding: 22px; } .c1-bf-app-preview strong { font-size: clamp(36px, 11vw, 46px); } .c1-bf-app-preview dl div { align-items: flex-start; flex-direction: column; gap: 3px; } .c1-bf-app-preview dd { text-align: left; } .c1-bf-trust-strip, .c1-bf-expert-strip, .c1-bf-application-grid, .c1-bf-application-grid--four, .c1-bf-mode-grid, .c1-bf-form-grid, .c1-bf-consult-form, .c1-bf-mini-steps, .c1-bf-law-grid { grid-template-columns: 1fr; } .c1-bf-footer-consult { border-radius: 24px; margin-top: 22px; padding: 18px; } .c1-bf-footer-consult__copy h2 { font-size: clamp(28px, 10vw, 38px); } .c1-bf-footer-consult__copy p, .c1-bf-footer p { text-align: left; } .c1-bf-footer-consult__copy .c1-bf-button { width: 100%; } .c1-bf-calculator-section, .c1-bf-section { padding: 52px 0; } .c1-bf-calculator-shell { border-radius: 24px; margin-inline: -4px; } .c1-bf-calculator-form { padding: 16px; } .c1-bf-step { padding: 18px; } .c1-bf-step legend, .c1-bf-step h3 { font-size: 20px; padding-inline: 0; } .c1-bf-choice { min-height: 0; } .c1-bf-result-card h2 { max-width: none; } .c1-bf-result-card__amount { font-size: clamp(38px, 12vw, 52px); } .c1-bf-result-stats > div { grid-template-columns: 1fr; gap: 5px; } .c1-bf-result-stats dd { text-align: left; } .c1-bf-inline-options, .c1-bf-buffer-options { align-items: stretch; flex-direction: column; } .c1-bf-inline-options label, .c1-bf-buffer-options label { border-radius: 14px; width: 100%; } .c1-bf-field input[type="date"], .c1-bf-field select { font-size: 16px; min-height: 54px; } .c1-bf-result-stats > div { align-items: flex-start; flex-direction: column; gap: 4px; } .c1-bf-result-stats dd { text-align: left; } .c1-bf-service-card button, .c1-bf-service-card a { align-self: stretch; } .c1-bf-section-heading h2, .c1-bf-final-cta h2 { font-size: clamp(30px, 9vw, 42px); } .c1-bf-final-cta__checks { flex-direction: column; } .c1-bf-final-cta__checks li { border-radius: 16px; } .c1-bf-faq summary { font-size: 16px; } .c1-bf-footer p { text-align: left; } } @media (prefers-reduced-motion: reduce) { .c1-bank-funds-page *, .c1-bank-funds-page *::before, .c1-bank-funds-page *::after { animation: none !important; scroll-behavior: auto !important; transition-duration: 0.01ms !important; } } /* Tilda compact self-contained SVG icons */ .c1-bf-icon svg, .c1-bf-choice-icon svg, .c1-bf-service-icon svg { display: block; height: 100%; width: 100%; } .c1-bf-icon, .c1-bf-choice-icon, .c1-bf-service-icon { color: var(--c1-primary-ink); } </style> </head> <body> <div class="c1-bank-funds-page" data-c1-bank-funds-calculator="single-tilda-block"> <main id="main-content"> <section class="c1-bf-hero" id="top"> <div class="c1-bf-container c1-bf-hero__grid"> <div class="c1-bf-hero__content"> <p class="c1-bf-eyebrow">Калькулятор банковской справки для Чехии</p> <h1>Сколько денег показать на счёте для визы или ВНЖ</h1> <p class="c1-bf-hero__lead"> Посчитайте ориентир по формуле МВД: период подачи, даты запрашиваемого пребывания, возраст заявителя и разумный запас. Без регистрации и без отправки данных. </p> <div class="c1-bf-hero__actions"> <a class="c1-bf-button c1-bf-button--primary" href="#calculator"> Рассчитать по датам <span aria-hidden="true">→</span> </a> <a class="c1-bf-button c1-bf-button--text" href="#how-it-works"> Как работает формула? </a> </div> </div> <div class="c1-bf-hero__visual" aria-hidden="true"> <div class="c1-bf-app-preview c1-bf-app-preview--premium"> <div class="c1-bf-app-preview__glow"></div> <div class="c1-bf-app-preview__top"> <span></span> <span></span> <span></span> <b>bank proof check</b> </div> <div class="c1-bf-app-preview__body"> <div class="c1-bf-preview-result"> <small>Рекомендуемая сумма</small> <strong>127 391 Kč</strong> <p>С запасом для спокойной подготовки документов</p> </div> <div class="c1-bf-preview-stack" aria-hidden="true"> <span style="--bar: 64%"></span> <span style="--bar: 82%"></span> <span style="--bar: 96%"></span> </div> <dl> <div><dt>Минимум МВД</dt><dd>115 810 Kč</dd></div> <div><dt>Запас CENTR1</dt><dd>+10%</dd></div> <div><dt>Период</dt><dd>12 мес.</dd></div> </dl> </div> <div class="c1-bf-preview-orbit c1-bf-preview-orbit--one"><span>§</span><small>формула</small></div> <div class="c1-bf-preview-orbit c1-bf-preview-orbit--two"><span>Kč</span><small>сумма</small></div> <div class="c1-bf-preview-orbit c1-bf-preview-orbit--three"><span>18</span><small>возраст</small></div> </div> </div> </div> </section> <section class="c1-bf-trust-band" aria-label="Преимущества калькулятора"> <div class="c1-bf-container c1-bf-trust-strip"> <div><span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><path d="M8 18h32L24 8 8 18Z" fill="currentColor" opacity=".18"/><path d="M12 20h24M15 23v13M24 23v13M33 23v13M10 38h28" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 8 8 18h32L24 8Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span><strong>Формула понятна</strong><small>показываем минимум МВД и расчёт CENTR1 отдельно</small></div> <div><span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="11" y="7" width="26" height="34" rx="7" fill="currentColor" opacity=".14"/><rect x="11" y="7" width="26" height="34" rx="7" fill="none" stroke="currentColor" stroke-width="3"/><path d="M17 15h14M17 24h.1M24 24h.1M31 24h.1M17 31h.1M24 31h.1M31 31h.1" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/></svg></span><strong>Сумма сразу</strong><small>результат видно без формы, звонка и регистрации</small></div> <div><span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="10" y="9" width="24" height="30" rx="5" fill="currentColor" opacity=".14"/><path d="M14 17h14M14 24h10M14 31h8" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M34 11l5 5-14 14-7 2 2-7 14-14Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span><strong>Возраст учтён</strong><small>ставка меняется для заявителей до и после 18 лет</small></div> <div><span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="14" y="6" width="20" height="36" rx="6" fill="currentColor" opacity=".14"/><rect x="14" y="6" width="20" height="36" rx="6" fill="none" stroke="currentColor" stroke-width="3"/><path d="M20 15h8M20 31h8M20 22h5" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M31 25c3 0 5 2 5 5s-2 5-5 5-5-2-5-5 2-5 5-5Z" fill="#fff"/><path d="m28.5 30 1.8 1.8 3.4-4" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg></span><strong>Без отправки данных</strong><small>расчёт работает локально в браузере</small></div> </div> </section> <section class="c1-bf-calculator-section" id="calculator" aria-labelledby="calculator-title"> <div class="c1-bf-container"> <div class="c1-bf-calculator-shell"> <div class="c1-bf-calculator-intro"> <div> <p class="c1-bf-kicker">Точный сценарий</p> <h2 id="calculator-title">Расчёт по датам подачи и пребывания</h2> <p>Сначала отделяем формат подачи от цели пребывания. Затем считаем сумму по датам: когда подаёте документы, на какой период просите визу или ВНЖ и сколько лет заявителю.</p> </div> <ol class="c1-bf-mini-steps" aria-label="Этапы расчёта"> <li><span>1</span> Тип пребывания</li> <li><span>2</span> Цель подачи</li> <li><span>3</span> Даты и возраст</li> </ol> </div> <form class="c1-bf-calculator-form" id="bank-funds-form" novalidate> <div class="c1-bf-validation-summary" id="validation-summary" role="alert" tabindex="-1" hidden> <strong>Проверьте данные</strong> <ul></ul> </div> <fieldset class="c1-bf-step" data-field="stayType"> <legend><span>1</span> Выберите тип пребывания для подачи заявления</legend> <p class="c1-bf-field-help">Это юридический формат подачи: долгосрочная виза, новое ВНЖ или продление уже имеющегося ВНЖ. От него зависит, как осторожно стоит проверять финансовые документы.</p> <div class="c1-bf-application-grid c1-bf-application-grid--three"> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--stay"> <input type="radio" name="stayType" value="long_term_visa" checked> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="10" y="9" width="24" height="30" rx="5" fill="currentColor" opacity=".14"/><path d="M14 17h14M14 24h10M14 31h8" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M34 11l5 5-14 14-7 2 2-7 14-14Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <strong>Долгосрочная виза</strong> <small>Первая подача на визу больше 90 дней.</small> </label> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--stay"> <input type="radio" name="stayType" value="long_term_residence"> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><circle cx="24" cy="24" r="16" fill="currentColor" opacity=".14"/><path d="m16 24 5 5 12-13" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 6v5M24 37v5M6 24h5M37 24h5" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/></svg></span> <strong>ВНЖ</strong> <small>Новая подача на долгосрочное пребывание в Чехии.</small> </label> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--stay"> <input type="radio" name="stayType" value="residence_extension"> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><path d="M8 18h32L24 8 8 18Z" fill="currentColor" opacity=".18"/><path d="M12 20h24M15 23v13M24 23v13M33 23v13M10 38h28" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 8 8 18h32L24 8Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <strong>Продление ВНЖ</strong> <small>Продление, где МВД может дополнительно смотреть доходы.</small> </label> </div> <p class="c1-bf-field-error" data-error-for="stayType"></p> </fieldset> <fieldset class="c1-bf-step" data-field="purposeType"> <legend><span>2</span> Выберите цель пребывания в новом заявлении</legend> <p class="c1-bf-field-help">Цель не равна процессу подачи. Например, можно подаваться на ВНЖ, а цель будет рабочая карта или воссоединение. Поэтому мы вынесли эти вещи отдельно.</p> <div class="c1-bf-application-grid c1-bf-application-grid--four"> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--purpose"> <input type="radio" name="purposeType" value="study" checked> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="10" y="9" width="24" height="30" rx="5" fill="currentColor" opacity=".14"/><path d="M14 17h14M14 24h10M14 31h8" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M34 11l5 5-14 14-7 2 2-7 14-14Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <strong>Студенческий</strong> <small>Учёба, стипендия, грант или оплаченное жильё.</small> </label> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--purpose"> <input type="radio" name="purposeType" value="entrepreneurship"> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><path d="M8 18h32L24 8 8 18Z" fill="currentColor" opacity=".18"/><path d="M12 20h24M15 23v13M24 23v13M33 23v13M10 38h28" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 8 8 18h32L24 8Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <strong>Предпринимательство</strong> <small>Бизнес-виза считается фиксированной суммой; для ВНЖ предпринимателя отдельно проверяют доходы.</small> </label> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--purpose"> <input type="radio" name="purposeType" value="family"> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><circle cx="24" cy="24" r="16" fill="currentColor" opacity=".14"/><path d="m16 24 5 5 12-13" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 6v5M24 37v5M6 24h5M37 24h5" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/></svg></span> <strong>Воссоединение</strong> <small>Семья, совместно оцениваемые лица и доходы.</small> </label> <label class="c1-bf-choice c1-bf-choice--application c1-bf-choice--purpose"> <input type="radio" name="purposeType" value="employee_card"> <span class="c1-bf-choice-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="14" y="6" width="20" height="36" rx="6" fill="currentColor" opacity=".14"/><rect x="14" y="6" width="20" height="36" rx="6" fill="none" stroke="currentColor" stroke-width="3"/><path d="M20 15h8M20 31h8M20 22h5" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M31 25c3 0 5 2 5 5s-2 5-5 5-5-2-5-5 2-5 5-5Z" fill="#fff"/><path d="m28.5 30 1.8 1.8 3.4-4" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg></span> <strong>Рабочая карта</strong> <small>Работа, договор, зарплата и срок пребывания.</small> </label> </div> <p class="c1-bf-context-note" id="application-note"></p> <div class="c1-bf-entrepreneur-note" id="entrepreneurship-rule-note" hidden> <span>Важно для предпринимателей</span> <strong>Расчёт зависит от того, что именно вы подаёте.</strong> <p><b>Долгосрочная бизнес-виза:</b> калькулятор применяет отдельную фиксированную сумму 156 500 Kč — это 50 × 3 130 Kč.</p> <p><b>ВНЖ или продление как предприниматель:</b> банковская справка может быть только частью картины. Часто нужно отдельно проверять регулярный доход и комплект документов.</p> </div> <p class="c1-bf-field-error" data-error-for="purposeType"></p> </fieldset> <input type="radio" name="calculationMode" value="dates" checked hidden> <div class="c1-bf-step c1-bf-input-panel" id="dates-panel" data-mode-panel="dates"> <h3><span>3</span> Даты, возраст и запас</h3> <p class="c1-bf-field-help">Заполните даты так, как они будут выглядеть в реальной подаче: дата заявления, начало и конец запрашиваемого периода, дата рождения заявителя.</p> <div class="c1-bf-form-grid">
<div class="c1-bf-field" data-field="applicationDate"> <label for="application-date">Дата подачи</label> <input id="application-date" name="applicationDate" type="date"> <small>Когда подаёте или уже подали заявление.</small> <p class="c1-bf-field-error" data-error-for="applicationDate"></p> </div> <div class="c1-bf-field" data-field="requestedStartDate"> <label for="requested-start-date">Начало визы или ВНЖ</label> <input id="requested-start-date" name="requestedStartDate" type="date"> <small>Дата, с которой просите выдать визу или ВНЖ.</small> <p class="c1-bf-field-error" data-error-for="requestedStartDate"></p> </div> <div class="c1-bf-field" data-field="requestedEndDate"> <label for="requested-end-date">Конец визы или ВНЖ</label> <input id="requested-end-date" name="requestedEndDate" type="date"> <small>Дата окончания запрашиваемого периода.</small> <p class="c1-bf-field-error" data-error-for="requestedEndDate"></p> </div> <div class="c1-bf-field" data-field="dateOfBirth"> <label for="date-of-birth">Дата рождения</label> <input id="date-of-birth" name="dateOfBirth" type="date"> <small>Нужна, чтобы корректно учесть ставку до и после 18 лет.</small> <p class="c1-bf-field-error" data-error-for="dateOfBirth"></p> </div> <fieldset class="c1-bf-field c1-bf-field--full" data-field="safetyBufferPercent"> <legend>Запас к сумме</legend> <div class="c1-bf-buffer-options"> <label><input type="radio" name="dateSafetyBuffer" value="0"> Без запаса</label> <label><input type="radio" name="dateSafetyBuffer" value="10" checked> +10% <em>рекомендуем</em></label> <label><input type="radio" name="dateSafetyBuffer" value="15"> +15%</label> </div> <p class="c1-bf-field-error" data-error-for="safetyBufferPercent"></p> </fieldset> </div> </div> <div class="c1-bf-form-submit"> <button class="c1-bf-button c1-bf-button--primary" type="submit"> Рассчитать сумму </button> <p>Данные не отправляются на сервер. Расчёт выполняется локально в браузере.</p> </div> </form> <section class="c1-bf-how-card" aria-labelledby="exact-calculation-title"> <h3 id="exact-calculation-title">Как считается точный расчёт</h3> <p class="c1-bf-field-help">Калькулятор использует точный режим по датам. Перед подачей важны не абстрактные 12 месяцев, а конкретные даты заявления и запрашиваемого периода.</p> <div class="c1-bf-law-grid"> <article> <span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><path d="M8 18h32L24 8 8 18Z" fill="currentColor" opacity=".18"/><path d="M12 20h24M15 23v13M24 23v13M33 23v13M10 38h28" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 8 8 18h32L24 8Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <h4>Основа формулы</h4> <p>Ориентируемся на правила подтверждения средств к пребыванию: первый месяц считается как 15× базовой величины, каждый следующий месяц как 2×.</p> </article> <article> <span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="10" y="9" width="24" height="30" rx="5" fill="currentColor" opacity=".14"/><path d="M14 17h14M14 24h10M14 31h8" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M34 11l5 5-14 14-7 2 2-7 14-14Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <h4>Возраст заявителя</h4> <p>Для заявителя младше 18 лет сумма уменьшается вдвое. Если 18 лет исполняется внутри периода, месяцы разделяются по возрасту.</p> </article> <article> <span class="c1-bf-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="11" y="7" width="26" height="34" rx="7" fill="currentColor" opacity=".14"/><rect x="11" y="7" width="26" height="34" rx="7" fill="none" stroke="currentColor" stroke-width="3"/><path d="M17 15h14M17 24h.1M24 24h.1M31 24h.1M17 31h.1M24 31h.1M31 31h.1" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/></svg></span> <h4>Период ожидания</h4> <p>Если подача раньше начала визы или ВНЖ, CENTR1 показывает осторожный вариант с месяцами ожидания, чтобы не занизить сумму.</p> </article> </div> <p class="c1-bf-disclaimer">Это не юридическая гарантия решения МВД. Это расчётный ориентир для подготовки банковской справки и проверки документов.</p> </section> <section class="c1-bf-result-layout" id="calculation-output" hidden> <article class="c1-bf-result-card" id="result-card" aria-labelledby="result-title"> <p class="c1-bf-result-card__eyebrow">Ваш расчёт</p> <h2 id="result-title" tabindex="-1">Рекомендуемая сумма на счёте</h2> <p class="c1-bf-result-context" id="result-context-note" hidden></p> <p class="c1-bf-result-card__amount" id="recommended-amount">0 Kč</p> <p class="c1-bf-result-card__buffer" id="buffer-label"></p> <dl class="c1-bf-result-stats"> <div> <dt>Минимум МВД</dt> <dd id="official-amount">0 Kč</dd> </div> <div> <dt>Осторожный расчёт CENTR1</dt> <dd id="conservative-amount">0 Kč</dd> </div> <div> <dt>Запрашиваемый период</dt> <dd id="months-summary">0 мес.</dd> </div> </dl> <details class="c1-bf-formula-details"> <summary>Как мы это посчитали</summary> <div> <p class="c1-bf-formula-details__lead">Показываем минимум, осторожный расчёт CENTR1 и выбранный запас отдельно, чтобы было понятно, почему суммы отличаются.</p> <ul id="formula-explanation"></ul> <div id="counted-months"></div> <p>Базовая величина: 3 130 Kč. Проверено 24.06.2026.</p> </div> </details> <button class="c1-bf-button c1-bf-button--secondary" id="edit-inputs" type="button">Изменить данные</button> </article> <div class="c1-bf-result-side"> <section class="c1-bf-warnings" id="warnings-block" aria-labelledby="warnings-title" hidden> <p class="c1-bf-kicker">На что обратить внимание</p> <h2 id="warnings-title">Нюансы вашей ситуации</h2> <div id="warnings-list"></div> </section> <section class="c1-bf-personal-cta" id="personal-cta" aria-labelledby="personal-cta-title"> <p class="c1-bf-kicker">Что лучше проверить перед подачей?</p> <h2 id="personal-cta-title">Проверить документы</h2> <p id="personal-cta-message"></p> <button class="c1-bf-button c1-bf-button--primary" id="personal-cta-button" type="button"></button> <button class="c1-bf-button c1-bf-button--text" id="personal-cta-secondary" type="button"></button> <p class="c1-bf-action-status" id="planned-action-status" role="status"></p> </section> </div> </section> </div> </div> </section> <section class="c1-bf-section" id="how-it-works"> <div class="c1-bf-container"> <div class="c1-bf-section-heading"> <h2>Как правильно сделать расчёт</h2> <p>Не начинайте с вопроса «сколько месяцев указать». Начните с реальных дат подачи и периода, который просите. Именно они определяют, какие месяцы попадут в расчёт.</p> </div> <div class="c1-bf-card-grid c1-bf-card-grid--three"> <article class="c1-bf-info-card"><span>1</span><h3>Укажите дату подачи</h3><p>Если подача раньше начала визы или ВНЖ, появляется период ожидания. Его лучше учитывать заранее.</p></article> <article class="c1-bf-info-card"><span>2</span><h3>Укажите начало и конец периода</h3><p>Система считает календарные месяцы запрашиваемого пребывания и показывает официальный минимум.</p></article> <article class="c1-bf-info-card"><span>3</span><h3>Проверьте возраст и цель</h3><p>Возраст до 18 лет, учёба, предпринимательство, семья или рабочая карта могут менять документы и риски.</p></article> </div> <p class="c1-bf-disclaimer">Формула основана на публичных правилах подтверждения средств для долгосрочных виз и пребывания. Для сложных случаев нужно проверять комплект документов индивидуально.</p> </div> </section> <section class="c1-bf-section c1-bf-section--tinted" id="services"> <div class="c1-bf-container"> <div class="c1-bf-section-heading"> <h2>Что можно проверить с CENTR1</h2> <p>Калькулятор даёт цифру. Но в реальной подаче важны ещё формат справки, цель пребывания, доходы, жильё, страховка и сроки документов.</p> </div> <div class="c1-bf-card-grid c1-bf-card-grid--services"> <article class="c1-bf-service-card"> <span class="c1-bf-service-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><circle cx="24" cy="24" r="16" fill="currentColor" opacity=".14"/><path d="m16 24 5 5 12-13" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 6v5M24 37v5M6 24h5M37 24h5" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/></svg></span> <h3>Проверка документов перед подачей</h3> <p>Сверим сумму, справку из банка и комплект документов до визита или отправки.</p> <button type="button" data-planned-action="document_check">Проверить справку и документы</button> </article> <article class="c1-bf-service-card"> <span class="c1-bf-service-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="11" y="7" width="26" height="34" rx="7" fill="currentColor" opacity=".14"/><rect x="11" y="7" width="26" height="34" rx="7" fill="none" stroke="currentColor" stroke-width="3"/><path d="M17 15h14M17 24h.1M24 24h.1M31 24h.1M17 31h.1M24 31h.1M31 31h.1" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/></svg></span> <h3>Проверка доходов для ВНЖ, семьи и продления</h3> <p>Разберём, может ли МВД смотреть регулярный доход, а не только остаток на счёте.</p> <button type="button" data-planned-action="income_check">Проверить документы и доходы</button> </article> <article class="c1-bf-service-card"> <span class="c1-bf-service-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="10" y="9" width="24" height="30" rx="5" fill="currentColor" opacity=".14"/><path d="M14 17h14M14 24h10M14 31h8" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M34 11l5 5-14 14-7 2 2-7 14-14Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <h3>Инструкция по справке из банка</h3> <p>Подскажем, что должно быть видно в справке или выписке, чтобы снизить риск вопросов.</p> <button type="button" data-planned-action="bank_statement_guide">Получить инструкцию</button> </article> <article class="c1-bf-service-card"> <span class="c1-bf-service-icon" aria-hidden="true"><svg viewBox="0 0 48 48" aria-hidden="true"><path d="M8 18h32L24 8 8 18Z" fill="currentColor" opacity=".18"/><path d="M12 20h24M15 23v13M24 23v13M33 23v13M10 38h28" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 8 8 18h32L24 8Z" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/></svg></span> <h3>Страховка для МВД</h3> <p>Если сумма уже понятна, можно отдельно рассчитать медицинскую страховку для подачи.</p> <a href="https://centr1.cz/insurance-calculator">Посчитать страховку</a> </article> </div> <p class="c1-bf-action-status" id="services-action-status" role="status"></p> </div> </section> <section class="c1-bf-section c1-bf-content-section"> <div class="c1-bf-container"> <div class="c1-bf-section-heading"> <h2>Что важно знать перед подачей</h2> <p>Банковская справка работает только тогда, когда сумма, даты и формат документа понятны для проверки.</p> </div> <div class="c1-bf-content-grid"> <article><h3>Что показывает справка</h3><p>В документе должны быть владелец счёта, доступный остаток, актуальная дата и возможность пользоваться средствами в Чехии.</p></article> <article><h3>Почему суммы отличаются</h3><p>Минимум МВД показывает базовую формулу. Расчёт CENTR1 добавляет осторожный сценарий, если есть ожидание до начала периода.</p></article> <article><h3>Когда нужен доход</h3><p id="income-explainer">Для семьи, предпринимательства, рабочей карты, ПМЖ и некоторых продлений МВД может смотреть регулярный доход.</p></article> <article><h3>Что проверить дополнительно</h3><p>Тип подачи, цель пребывания, даты, возраст, сумму, формат справки, жильё, страховку и актуальность каждого документа.</p></article> </div> </div> </section> <section class="c1-bf-section c1-bf-faq" id="faq"> <div class="c1-bf-container c1-bf-reading-width"> <div class="c1-bf-section-heading"> <h2>Частые вопросы</h2> <p>Короткие ответы по сумме, справке и ситуациям, где одного остатка на счёте может быть мало.</p> </div> <details><summary>Сколько денег нужно показать на визу в Чехии?</summary><p>Зависит от срока, возраста и цели пребывания. Для обычной долгосрочной визы ориентир считается от базовой величины: первый месяц выше, последующие месяцы ниже.</p></details> <details><summary>Почему лучше считать по датам, а не по количеству месяцев?</summary><p>Потому что между подачей и началом запрашиваемого периода может быть ожидание. Если его не учесть, справка может выглядеть слабее.</p></details> <details><summary>Для продления ВНЖ достаточно справки из банка?</summary><p>Не всегда. В ряде сценариев МВД может оценивать регулярный доход, поэтому калькулятор показывает предупреждение.</p></details> <details><summary>Можно ли показать деньги на иностранном счёте?</summary><p>Нужно проверить владельца счёта, доступность средств, валюту, перевод и актуальную практику для вашей подачи.</p></details> <details><summary>Что делать, если заявителю исполняется 18 лет?</summary><p>Используйте расчёт по датам. Месяц 18-летия и следующие месяцы считаются по взрослой ставке.</p></details> <details><summary>Почему калькулятор показывает сумму с запасом?</summary><p>Запас помогает подготовить справку спокойнее. Это рекомендация CENTR1, а не отдельная норма закона.</p></details> <details><summary>Когда вместо денег на счёте нужен доход?</summary><p>Такое возможно для семьи, предпринимательства, рабочей карты, ПМЖ и отдельных продлений. Важно смотреть конкретный комплект документов.</p></details> <details><summary>Можно показать сумму в евро или долларах?</summary><p>Валюта и пересчёт курса требуют отдельной проверки. Сейчас калькулятор показывает результат в CZK.</p></details> </div> </section> </main> <footer class="c1-bf-footer"> <div class="c1-bf-container"> <strong>CENTR1</strong> <p>Расчёт ориентировочный и не является гарантией решения МВД. Страница не отправляет и не сохраняет введённые данные.</p> </div> <div class="c1-bf-container c1-bf-footer-consult"> <div class="c1-bf-footer-consult__copy"> <span>Перед подачей лучше проверить дважды</span> <h2>Посчитайте сумму и проверьте документы до подачи</h2> <p>Калькулятор покажет минимум МВД, осторожный расчёт CENTR1 и ситуации, где одной банковской справки может быть недостаточно. Если хотите разобрать комплект документов — оставьте контакты для консультации.</p> <ul class="c1-bf-footer-consult__checks" aria-label="Что можно проверить"> <li>сумму по датам подачи и периода</li> <li>запас и период ожидания отдельно</li> <li>доходы, учёбу, бизнес и 18-летие</li> </ul> <a class="c1-bf-button c1-bf-button--light" href="#calculator">Открыть калькулятор <span aria-hidden="true">→</span></a> </div> <form class="c1-bf-consult-form" id="consult-form" novalidate> <label> <span>Имя</span> <input type="text" name="name" autocomplete="name" placeholder="Как к вам обращаться" required /> </label> <label> <span>Телефон или email</span> <input type="text" name="contact" autocomplete="email" placeholder="+420... или email" required /> </label> <label class="c1-bf-consult-form__wide"> <span>Что нужно проверить</span> <textarea name="message" rows="3" placeholder="Например: продление ВНЖ, справка из банка, доходы, документы семьи"></textarea> </label> <button class="c1-bf-button c1-bf-button--primary" type="submit">Записаться на консультацию</button> <p class="c1-bf-action-status" id="consult-form-status" role="status"></p> </form> </div> </footer> </div> <script> (() => { 'use strict'; const EXISTENCE_MINIMUM = 3_130; const ADULT_FIRST_MONTH_AMOUNT = 15 * EXISTENCE_MINIMUM; const ADULT_NEXT_MONTH_AMOUNT = 2 * EXISTENCE_MINIMUM; const MINOR_FIRST_MONTH_AMOUNT = ADULT_FIRST_MONTH_AMOUNT / 2; const MINOR_NEXT_MONTH_AMOUNT = ADULT_NEXT_MONTH_AMOUNT / 2; const BUSINESS_VISA_AMOUNT = 50 * EXISTENCE_MINIMUM; const SAFETY_BUFFER_OPTIONS = Object.freeze([0, 10, 15]); const APPLICATION_TYPES = Object.freeze({ LONG_TERM_VISA_STANDARD: "long_term_visa_standard", LONG_TERM_RESIDENCE_STANDARD: "long_term_residence_standard", EXTENSION_STANDARD: "extension_standard", STUDY: "study", LONG_TERM_VISA_BUSINESS: "long_term_visa_business", FAMILY_PERMANENT_BUSINESS_RESIDENCE: "family_or_permanent_or_business_residence" }); const AGE_SCENARIOS = Object.freeze({ ADULT: "adult_for_entire_period", MINOR: "minor_for_entire_period", TURNS_18: "turns_18_during_period" }); const CALCULATION_MODES = Object.freeze({ QUICK: "quick", DATES: "dates" }); const CONSTANTS_VERSION = Object.freeze({ existenceMinimumCzk: EXISTENCE_MINIMUM, verifiedOn: "2026-06-24" }); const APPLICATION_TYPE_VALUES = new Set(Object.values(APPLICATION_TYPES)); function isLeapYear(year) { return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); } function daysInMonth(year, month) { if (!Number.isInteger(year) || !Number.isInteger(month) || month < 1 || month > 12) { throw new RangeError("Invalid calendar month"); } if (month === 2) return isLeapYear(year) ? 29 : 28; return [4, 6, 9, 11].includes(month) ? 30 : 31; } function parseLocalDate(value) { if (typeof value !== "string") { throw new TypeError("Date must use YYYY-MM-DD format"); } const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value); if (!match) throw new RangeError("Date must use YYYY-MM-DD format"); const year = Number(match[1]); const month = Number(match[2]); const day = Number(match[3]); if (year < 1 || month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) { throw new RangeError("Invalid calendar date"); } return Object.freeze({ year, month, day }); } function compareCalendarDates(left, right) { const leftValue = left.year * 10_000 + left.month * 100 + left.day; const rightValue = right.year * 10_000 + right.month * 100 + right.day; return Math.sign(leftValue - rightValue); } function createMonth(year, month) { return Object.freeze({ year, month, day: 1, key: `${String(year).padStart(4, "0")}-${String(month).padStart(2, "0")}` }); } function addMonth(monthValue) { return monthValue.month === 12 ? createMonth(monthValue.year + 1, 1) : createMonth(monthValue.year, monthValue.month + 1); } function compareMonths(left, right) { return Math.sign(left.year * 12 + left.month - (right.year * 12 + right.month)); } function endOfMonth(monthValue) { return Object.freeze({ year: monthValue.year, month: monthValue.month, day: daysInMonth(monthValue.year, monthValue.month) }); } function addYears(dateValue, years) { const year = dateValue.year + years; const day = Math.min(dateValue.day, daysInMonth(year, dateValue.month)); return Object.freeze({ year, month: dateValue.month, day }); } function buildRequestedStayMonths(startValue, endValue) { const startDate = typeof startValue === "string" ? parseLocalDate(startValue) : startValue; const endDate = typeof endValue === "string" ? parseLocalDate(endValue) : endValue; if (compareCalendarDates(endDate, startDate) < 0) { throw new RangeError("Requested end date must not be before start date"); } const lastMonth = createMonth(endDate.year, endDate.month); const months = []; for (let cursor = createMonth(startDate.year, startDate.month); compareMonths(cursor, lastMonth) <= 0; cursor = addMonth(cursor)) { months.push(cursor); } return Object.freeze(months); } function buildGapMonths(applicationValue, requestedStartValue) { const applicationDate = typeof applicationValue === "string" ? parseLocalDate(applicationValue) : applicationValue; const requestedStartDate = typeof requestedStartValue === "string" ? parseLocalDate(requestedStartValue) : requestedStartValue; const startMonth = createMonth(requestedStartDate.year, requestedStartDate.month); const months = []; for (let cursor = addMonth(createMonth(applicationDate.year, applicationDate.month)); compareMonths(cursor, startMonth) < 0; cursor = addMonth(cursor)) { months.push(cursor); } return Object.freeze(months); } function isAdultMonth(monthValue, dateOfBirthValue) { const dateOfBirth = typeof dateOfBirthValue === "string" ? parseLocalDate(dateOfBirthValue) : dateOfBirthValue; const eighteenthBirthday = addYears(dateOfBirth, 18); return compareCalendarDates(eighteenthBirthday, endOfMonth(monthValue)) <= 0; } function calculateAmountForMonths(countedMonths, dateOfBirthValue) { if (!Array.isArray(countedMonths) || countedMonths.length === 0) { throw new RangeError("At least one counted month is required"); } const amount = countedMonths.reduce((total, monthValue, index) => { const adult = isAdultMonth(monthValue, dateOfBirthValue); const firstMonth = index === 0; if (firstMonth) { return total + (adult ? ADULT_FIRST_MONTH_AMOUNT : MINOR_FIRST_MONTH_AMOUNT); } return total + (adult ? ADULT_NEXT_MONTH_AMOUNT : MINOR_NEXT_MONTH_AMOUNT); }, 0); return Math.ceil(amount); } function calculateStandardAmount(months, ageScenario = AGE_SCENARIOS.ADULT) { if (!Number.isInteger(months) || months < 1) { throw new RangeError("Months must be a positive integer"); } const adultAmount = ADULT_FIRST_MONTH_AMOUNT + (months - 1) * ADULT_NEXT_MONTH_AMOUNT; if (ageScenario === AGE_SCENARIOS.ADULT) return adultAmount; if (ageScenario === AGE_SCENARIOS.MINOR) return Math.ceil(adultAmount / 2); if (ageScenario === AGE_SCENARIOS.TURNS_18) { throw new RangeError("Mixed-age calculation requires date mode"); } throw new RangeError("Unknown age scenario"); } function applySafetyBuffer(amount, safetyBufferPercent) { if (!Number.isInteger(amount) || amount < 0) throw new RangeError("Amount must be a non-negative integer"); if (!SAFETY_BUFFER_OPTIONS.includes(safetyBufferPercent)) { throw new RangeError("Unsupported safety buffer"); } const numerator = amount * (100 + safetyBufferPercent); return Math.floor((numerator + 99) / 100); } function assertApplicationType(applicationType) { if (!APPLICATION_TYPE_VALUES.has(applicationType)) { throw new RangeError("Unknown application type"); } } function getTypeWarningCodes(applicationType) { const warnings = []; if ( applicationType === APPLICATION_TYPES.EXTENSION_STANDARD || applicationType === APPLICATION_TYPES.FAMILY_PERMANENT_BUSINESS_RESIDENCE ) { warnings.push("income_warning"); } if (applicationType === APPLICATION_TYPES.LONG_TERM_VISA_BUSINESS) { warnings.push("business_visa_special_rule"); } if (applicationType === APPLICATION_TYPES.STUDY) { warnings.push("study_special_documents"); } return warnings; } function getAgeScenario(countedMonths, dateOfBirth) { const adultStates = countedMonths.map((monthValue) => isAdultMonth(monthValue, dateOfBirth)); if (adultStates.every(Boolean)) return AGE_SCENARIOS.ADULT; if (adultStates.every((value) => !value)) return AGE_SCENARIOS.MINOR; return AGE_SCENARIOS.TURNS_18; } function isAmbiguousPartialPeriod(startDate, endDate) { return startDate.day !== 1 || endDate.day !== daysInMonth(endDate.year, endDate.month); } function freezeResult(result) { return Object.freeze({ ...result, warnings: Object.freeze([...result.warnings]), formulaExplanation: Object.freeze([...result.formulaExplanation]), countedMonthsOfficial: Object.freeze([...result.countedMonthsOfficial]), countedMonthsConservative: Object.freeze([...result.countedMonthsConservative]), constantsVersion: CONSTANTS_VERSION }); } function calculateQuick({ applicationType, months, ageScenario, safetyBufferPercent = 10 }) { assertApplicationType(applicationType); if (!Number.isInteger(months) || months < 3 || months > 24) { throw new RangeError("Quick months must be between 3 and 24"); } let officialAmount; let formulaExplanation; if (applicationType === APPLICATION_TYPES.LONG_TERM_VISA_BUSINESS) { officialAmount = BUSINESS_VISA_AMOUNT; formulaExplanation = [ `Бизнес-виза: фиксированная сумма 50 × ${EXISTENCE_MINIMUM.toLocaleString("ru-RU")} Kč.` ]; } else { officialAmount = calculateStandardAmount(months, ageScenario); const ageNote = ageScenario === AGE_SCENARIOS.MINOR ? " Применена половинная ставка." : ""; formulaExplanation = [ `15 × ${EXISTENCE_MINIMUM.toLocaleString("ru-RU")} + ${months - 1} × 2 × ${EXISTENCE_MINIMUM.toLocaleString("ru-RU")}.${ageNote}` ]; } const warnings = getTypeWarningCodes(applicationType); const recommendedAmount = applySafetyBuffer(officialAmount, safetyBufferPercent); return freezeResult({ calculationMode: "quick", applicationType, ageScenario, officialMonths: months, gapMonths: 0, conservativeMonths: months, officialAmount, conservativeAmount: officialAmount, recommendedAmount, safetyBufferPercent, hasGap: false, turns18DuringPeriod: false, ambiguousPartialMonths: false, warnings, formulaExplanation, countedMonthsOfficial: [], countedMonthsConservative: [] }); } function calculateDates({ applicationType, applicationDate: applicationDateValue, requestedStartDate: requestedStartDateValue, requestedEndDate: requestedEndDateValue, dateOfBirth: dateOfBirthValue, safetyBufferPercent = 10 }) { assertApplicationType(applicationType); const applicationDate = parseLocalDate(applicationDateValue); const requestedStartDate = parseLocalDate(requestedStartDateValue); const requestedEndDate = parseLocalDate(requestedEndDateValue); const dateOfBirth = parseLocalDate(dateOfBirthValue); if (compareCalendarDates(requestedEndDate, requestedStartDate) < 0) { throw new RangeError("Requested end date must not be before start date"); } const countedMonthsOfficial = buildRequestedStayMonths(requestedStartDate, requestedEndDate); const gapMonthsList = buildGapMonths(applicationDate, requestedStartDate); const hasGap = gapMonthsList.length > 0; const businessVisa = applicationType === APPLICATION_TYPES.LONG_TERM_VISA_BUSINESS; const countedMonthsConservative = businessVisa ? countedMonthsOfficial : Object.freeze([...gapMonthsList, ...countedMonthsOfficial]); const officialAgeScenario = getAgeScenario(countedMonthsOfficial, dateOfBirth); const conservativeAgeScenario = getAgeScenario(countedMonthsConservative, dateOfBirth); const turns18DuringPeriod = officialAgeScenario === AGE_SCENARIOS.TURNS_18 || conservativeAgeScenario === AGE_SCENARIOS.TURNS_18; let officialAmount; let conservativeAmount; let formulaExplanation; if (businessVisa) { officialAmount = BUSINESS_VISA_AMOUNT; conservativeAmount = BUSINESS_VISA_AMOUNT; formulaExplanation = [ `Бизнес-виза: фиксированная сумма 50 × ${EXISTENCE_MINIMUM.toLocaleString("ru-RU")} Kč.`, "Период ожидания не добавлен к фиксированной сумме без отдельной проверки документов." ]; } else { officialAmount = calculateAmountForMonths(countedMonthsOfficial, dateOfBirth); conservativeAmount = calculateAmountForMonths(countedMonthsConservative, dateOfBirth); formulaExplanation = [ `Официальный период: ${countedMonthsOfficial.length} мес.`, hasGap ? `Расчёт CENTR1 добавляет ${gapMonthsList.length} полн. мес. ожидания до начала периода.` : "Дополнительные полные месяцы до начала периода не добавлены.", turns18DuringPeriod ? "Месяц 18-летия и следующие месяцы рассчитаны по взрослой ставке." : "Для всего периода применена единая возрастная ставка." ]; } const ambiguousPartialMonths = isAmbiguousPartialPeriod(requestedStartDate, requestedEndDate); const warnings = getTypeWarningCodes(applicationType); if (hasGap) warnings.push("has_gap"); if (turns18DuringPeriod) warnings.push("turns_18_during_period"); if (ambiguousPartialMonths) warnings.push("ambiguous_partial_months"); const recommendedAmount = applySafetyBuffer(conservativeAmount, safetyBufferPercent); return freezeResult({ calculationMode: "dates", applicationType, ageScenario: conservativeAgeScenario, officialMonths: countedMonthsOfficial.length, gapMonths: gapMonthsList.length, conservativeMonths: countedMonthsConservative.length, officialAmount, conservativeAmount, recommendedAmount, safetyBufferPercent, hasGap, turns18DuringPeriod, ambiguousPartialMonths, warnings, formulaExplanation, countedMonthsOfficial: countedMonthsOfficial.map((monthValue) => monthValue.key), countedMonthsConservative: countedMonthsConservative.map((monthValue) => monthValue.key) }); } const APPLICATION_TYPE_COPY = Object.freeze({ long_term_visa_standard: Object.freeze({ title: "Долгосрочная виза", description: "Ориентир для первой подачи, где обычно достаточно показать доступные средства на счёте." }), long_term_residence_standard: Object.freeze({ title: "ВНЖ", description: "Расчёт для новой подачи на долгосрочное пребывание с банковской справкой." }), extension_standard: Object.freeze({ title: "Продление ВНЖ", description: "При продлении МВД может смотреть не только остаток, но и регулярный доход." }), study: Object.freeze({ title: "Студенческая подача", description: "Показываем сумму и напоминаем о документах, которые могут заменить или дополнить остаток на счёте." }), long_term_visa_business: Object.freeze({ title: "Предпринимательство по долгосрочной визе", description: "Для бизнес-визы используется отдельная фиксированная сумма." }), family_or_permanent_or_business_residence: Object.freeze({ title: "Подача, где важен доход", description: "Для семьи, предпринимательства, ПМЖ и части продлений часто важен регулярный доход, а не только банковский остаток." }) }); const WARNING_COPY = Object.freeze({ income_warning: Object.freeze({ title: "МВД может смотреть регулярный доход", description: "В вашем сценарии одной справки из банка может быть мало. Проверьте, какие доходы и документы лучше показать вместе с остатком на счёте.", cta: "Проверить документы и доходы", tone: "important" }), has_gap: Object.freeze({ title: "Есть ожидание до начала визы или ВНЖ", description: "Мы добавили полные месяцы между подачей и началом запрашиваемого периода. Так сумма не выглядит заниженной, если документы будут рассматривать заранее.", cta: "Проверить сумму с учётом ожидания", tone: "notice" }), turns_18_during_period: Object.freeze({ title: "Заявителю исполняется 18 лет", description: "Месяц 18-летия и следующие месяцы считаются по взрослой ставке. Это может заметно изменить итоговую сумму.", cta: "Проверить расчёт для ребёнка", tone: "notice" }), business_visa_special_rule: Object.freeze({ title: "Для бизнес-визы действует отдельная сумма", description: "Калькулятор использует фиксированную сумму для долгосрочной бизнес-визы. Остальные документы лучше проверить отдельно.", cta: "Проверить документы для бизнес-визы", tone: "special" }), study_special_documents: Object.freeze({ title: "Для учёбы возможны другие подтверждения", description: "Стипендия, грант или оплаченное проживание могут влиять на комплект документов. Сумма на счёте не всегда единственный вариант.", cta: "Проверить студенческую подачу", tone: "special" }), ambiguous_partial_months: Object.freeze({ title: "Период округлён осторожно", description: "Пограничные календарные месяцы учтены целиком, чтобы не занизить сумму перед подачей.", cta: "Проверить период и сумму", tone: "notice" }) }); const PLANNED_ACTION_MESSAGE = "Расчёт уже работает. Онлайн-заявка здесь не отправляется: сейчас кнопка только показывает, какой тип проверки может подойти."; const FUNNEL_STATES = Object.freeze({ standard: Object.freeze({ primaryCta: "Проверить справку и документы", secondaryCta: "Что должно быть в справке", segment: "document_check", message: "Сумма понятна. Следующий риск обычно не в цифре, а в формате справки, датах, страховке и комплекте документов." }), gap: Object.freeze({ primaryCta: "Проверить сумму с учётом ожидания", secondaryCta: "Разобрать документы перед подачей", segment: "document_check", message: "Между подачей и началом периода есть ожидание. Лучше заранее проверить, чтобы сумма в справке не выглядела слишком низкой." }), mixedAge: Object.freeze({ primaryCta: "Проверить расчёт для ребёнка", secondaryCta: "Проверить комплект документов", segment: "document_check", message: "В периоде есть переход на взрослую ставку. Здесь особенно важно не ошибиться с датами и месяцем 18-летия." }), income: Object.freeze({ primaryCta: "Проверить документы и доходы", secondaryCta: "Разобрать риски по ВНЖ", segment: "income_check", message: "В вашем сценарии МВД может смотреть не только остаток на счёте. Проверьте доходы и документы до подачи, а не после вопроса от МВД." }), study: Object.freeze({ primaryCta: "Проверить студенческую подачу", secondaryCta: "Проверить справку и страховку", segment: "student_documents_check", message: "Для учёбы могут подойти разные подтверждения средств. Важно сверить справку, стипендию, жильё и страховку как один комплект." }), business: Object.freeze({ primaryCta: "Проверить документы для бизнес-визы", secondaryCta: "Разобрать финансовое подтверждение", segment: "business_visa_check", message: "Для бизнес-визы действует отдельная сумма. Кроме неё стоит проверить цель, документы по предпринимательству и формат подтверждения средств." }) }); function resolveFunnel({ applicationType, warnings = [] }) { const warningSet = new Set(warnings); if (warningSet.has("income_warning")) return FUNNEL_STATES.income; if (applicationType === APPLICATION_TYPES.LONG_TERM_VISA_BUSINESS) return FUNNEL_STATES.business; if (warningSet.has("turns_18_during_period")) return FUNNEL_STATES.mixedAge; if (warningSet.has("has_gap")) return FUNNEL_STATES.gap; if (applicationType === APPLICATION_TYPES.STUDY) return FUNNEL_STATES.study; return FUNNEL_STATES.standard; } const VALIDATION_APPLICATION_TYPE_VALUES = new Set(Object.values(APPLICATION_TYPES)); function getTodayCalendarDate() { const now = new Date(); return Object.freeze({ year: now.getFullYear(), month: now.getMonth() + 1, day: now.getDate() }); } function parseDateField(value, field, errors, requiredMessage) { if (!value) { errors[field] = requiredMessage; return null; } try { return parseLocalDate(value); } catch { errors[field] = "Укажите корректную календарную дату."; return null; } } function validateCalculatorInput(input, today = getTodayCalendarDate()) { const errors = {}; if (!VALIDATION_APPLICATION_TYPE_VALUES.has(input.applicationType)) { errors.applicationType = "Выберите тип заявления."; } if (![CALCULATION_MODES.QUICK, CALCULATION_MODES.DATES].includes(input.calculationMode)) { errors.calculationMode = "Выберите способ расчёта."; } if (!SAFETY_BUFFER_OPTIONS.includes(input.safetyBufferPercent)) { errors.safetyBufferPercent = "Выберите доступный запас: 0%, 10% или 15%."; } if (input.calculationMode === CALCULATION_MODES.QUICK) { if (!Number.isInteger(input.months) || input.months < 3 || input.months > 24) { errors.months = "Выберите количество месяцев от 3 до 24."; } if (input.ageScenario === AGE_SCENARIOS.TURNS_18) { errors.ageScenario = "Для смешанного возрастного расчёта перейдите к расчёту по датам."; } else if (![AGE_SCENARIOS.ADULT, AGE_SCENARIOS.MINOR].includes(input.ageScenario)) { errors.ageScenario = "Выберите возрастной сценарий."; } } if (input.calculationMode === CALCULATION_MODES.DATES) { const applicationDate = parseDateField( input.applicationDate, "applicationDate", errors, "Укажите дату подачи." ); const requestedStartDate = parseDateField( input.requestedStartDate, "requestedStartDate", errors, "Укажите начало запрашиваемого периода." ); const requestedEndDate = parseDateField( input.requestedEndDate, "requestedEndDate", errors, "Укажите конец запрашиваемого периода." ); const dateOfBirth = parseDateField( input.dateOfBirth, "dateOfBirth", errors, "Укажите дату рождения." ); if ( requestedStartDate && requestedEndDate && compareCalendarDates(requestedEndDate, requestedStartDate) < 0 ) { errors.requestedEndDate = "Дата окончания не может быть раньше даты начала."; } if (dateOfBirth && compareCalendarDates(dateOfBirth, today) > 0) { errors.dateOfBirth = "Дата рождения не может быть в будущем."; } if (dateOfBirth && today.year - dateOfBirth.year > 120) { errors.dateOfBirth = "Проверьте дату рождения."; } if (applicationDate && dateOfBirth && compareCalendarDates(dateOfBirth, applicationDate) > 0) { errors.dateOfBirth = "Дата рождения должна быть раньше даты подачи."; } } return Object.freeze({ valid: Object.keys(errors).length === 0, errors: Object.freeze(errors) }); } const STAY_TYPE_COPY = Object.freeze({ long_term_visa: Object.freeze({ title: "Долгосрочная виза", description: "Для первой подачи, когда вы просите визу на срок больше 90 дней." }), long_term_residence: Object.freeze({ title: "ВНЖ", description: "Для новой подачи на долгосрочное пребывание, например по рабочей карте или воссоединению." }), residence_extension: Object.freeze({ title: "Продление ВНЖ", description: "Для продления МВД может смотреть не только остаток на счёте, но и регулярный доход." }) }); const PURPOSE_COPY = Object.freeze({ study: Object.freeze({ title: "Студенческий", description: "Считаем сумму и отдельно показываем, когда могут помочь стипендия, грант или оплаченное жильё." }), entrepreneurship: Object.freeze({ title: "Предпринимательство", description: "Для бизнес-визы действует фиксированная сумма, а для ВНЖ предпринимателя часто важны доходы." }), family: Object.freeze({ title: "Воссоединение", description: "В семейных подачах одного остатка на счёте может быть недостаточно: часто проверяют доходы." }), employee_card: Object.freeze({ title: "Рабочая карта", description: "Обычно важны договор, зарплата и срок пребывания. Калькулятор помогает проверить банковский ориентир." }) }); const form = document.querySelector("#bank-funds-form"); const output = document.querySelector("#calculation-output"); const resultCard = document.querySelector("#result-card"); const validationSummary = document.querySelector("#validation-summary"); const quickPanel = document.querySelector("#quick-panel"); const datesPanel = document.querySelector("#dates-panel"); const monthsSelect = document.querySelector("#quick-months"); const mixedAgeGuidance = document.querySelector("#mixed-age-guidance"); const applicationNote = document.querySelector("#application-note"); const entrepreneurshipRuleNote = document.querySelector("#entrepreneurship-rule-note"); const warningsBlock = document.querySelector("#warnings-block"); const warningsList = document.querySelector("#warnings-list"); const plannedActionStatus = document.querySelector("#planned-action-status"); const servicesActionStatus = document.querySelector("#services-action-status"); const resultTitle = document.querySelector("#result-title"); const resultContextNote = document.querySelector("#result-context-note"); const resultEyebrow = document.querySelector(".c1-bf-result-card__eyebrow"); const modeChoices = [...document.querySelectorAll(".c1-bf-choice--mode")]; const applicationChoices = [...document.querySelectorAll(".c1-bf-choice--application")]; const stayChoices = [...document.querySelectorAll(".c1-bf-choice--stay")]; const purposeChoices = [...document.querySelectorAll(".c1-bf-choice--purpose")]; const currencyFormatter = new Intl.NumberFormat("ru-RU", { maximumFractionDigits: 0, style: "currency", currency: "CZK" }); function formatCzk(value) { return currencyFormatter.format(value).replace("CZK", "Kč"); } function populateMonthOptions() { if (!monthsSelect) return; const fragment = document.createDocumentFragment(); for (let month = 3; month <= 24; month += 1) { const option = document.createElement("option"); option.value = String(month); option.textContent = `${month} мес.`; if (month === 12) option.selected = true; fragment.append(option); } monthsSelect.append(fragment); } function getCheckedValue(name) { return form.querySelector(`input[name="${name}"]:checked`)?.value ?? ""; } function resolveApplicationType() { const stayType = getCheckedValue("stayType"); const purposeType = getCheckedValue("purposeType"); if (purposeType === "entrepreneurship" && stayType === "long_term_visa") { return APPLICATION_TYPES.LONG_TERM_VISA_BUSINESS; } if (purposeType === "study") { return APPLICATION_TYPES.STUDY; } if (purposeType === "family" || purposeType === "entrepreneurship") { return APPLICATION_TYPES.FAMILY_PERMANENT_BUSINESS_RESIDENCE; } if (stayType === "residence_extension") { return APPLICATION_TYPES.EXTENSION_STANDARD; } if (stayType === "long_term_residence") { return APPLICATION_TYPES.LONG_TERM_RESIDENCE_STANDARD; } return APPLICATION_TYPES.LONG_TERM_VISA_STANDARD; } function collectInput() { const calculationMode = getCheckedValue("calculationMode") || CALCULATION_MODES.DATES; const input = { stayType: getCheckedValue("stayType"), purposeType: getCheckedValue("purposeType"), applicationType: resolveApplicationType(), calculationMode }; if (calculationMode === CALCULATION_MODES.QUICK) { return { ...input, months: Number(monthsSelect?.value ?? 12), ageScenario: getCheckedValue("ageScenario"), safetyBufferPercent: Number(getCheckedValue("quickSafetyBuffer")) }; } return { ...input, applicationDate: form.elements.applicationDate.value, requestedStartDate: form.elements.requestedStartDate.value, requestedEndDate: form.elements.requestedEndDate.value, dateOfBirth: form.elements.dateOfBirth.value, safetyBufferPercent: Number(getCheckedValue("dateSafetyBuffer")) }; } function clearErrors() { validationSummary.hidden = true; validationSummary.querySelector("ul").replaceChildren(); form.querySelectorAll("[aria-invalid='true']").forEach((element) => element.removeAttribute("aria-invalid")); form.querySelectorAll("[data-error-for]").forEach((element) => { element.textContent = ""; }); } function renderErrors(errors) { clearErrors(); const list = validationSummary.querySelector("ul"); Object.entries(errors).forEach(([field, message]) => { const targets = form.querySelectorAll(`[data-error-for="${field}"]`); targets.forEach((target) => { if (!target.closest("[hidden]")) target.textContent = message; }); const fieldContainer = form.querySelector(`[data-field="${field}"]:not([hidden])`) ?? form.querySelector(`[data-field="${field}"]`); fieldContainer?.setAttribute("aria-invalid", "true"); const item = document.createElement("li"); item.textContent = message; list.append(item); }); validationSummary.hidden = false; validationSummary.focus(); } function updateMode() { const mode = getCheckedValue("calculationMode") || CALCULATION_MODES.DATES; const quick = mode === CALCULATION_MODES.QUICK; if (quickPanel) quickPanel.hidden = !quick; if (datesPanel) datesPanel.hidden = quick; form.dataset.mode = mode; modeChoices.forEach((choice) => { const input = choice.querySelector("input"); choice.classList.toggle("is-selected", input?.checked === true); }); clearErrors(); } function updateMixedAgeGuidance() { if (!mixedAgeGuidance) return; mixedAgeGuidance.hidden = getCheckedValue("ageScenario") !== AGE_SCENARIOS.TURNS_18; } function updateApplicationNote() { const stayType = getCheckedValue("stayType"); const purposeType = getCheckedValue("purposeType"); const resolvedType = resolveApplicationType(); const stay = STAY_TYPE_COPY[stayType]; const purpose = PURPOSE_COPY[purposeType]; const resolved = APPLICATION_TYPE_COPY[resolvedType]; if (stay && purpose && resolved) { applicationNote.innerHTML = ` <strong>${stay.title} + ${purpose.title}</strong> <span>${purpose.description}</span> <small>Для расчёта используем сценарий: ${resolved.title}. ${resolved.description}</small> `; } else { applicationNote.textContent = ""; } if (entrepreneurshipRuleNote) { entrepreneurshipRuleNote.hidden = purposeType !== "entrepreneurship"; } [...applicationChoices, ...stayChoices, ...purposeChoices].forEach((choice) => { const input = choice.querySelector("input"); choice.classList.toggle("is-selected", input?.checked === true); }); } function markResultStale() { if (!output.hidden) { plannedActionStatus.textContent = "Данные изменились. Нажмите «Рассчитать сумму», чтобы обновить результат."; } } function monthRangeText(months) { if (!months.length) return ""; return months.length <= 6 ? months.join(", ") : `${months[0]} - ${months.at(-1)} (${months.length} мес.)`; } function renderWarnings(result) { warningsList.replaceChildren(); warningsBlock.hidden = result.warnings.length === 0; result.warnings.forEach((warningCode) => { const copy = WARNING_COPY[warningCode]; if (!copy) return; const article = document.createElement("article"); article.className = "c1-bf-warning-card"; article.dataset.tone = copy.tone; const heading = document.createElement("h3"); heading.textContent = copy.title; const description = document.createElement("p"); description.textContent = copy.description; const action = document.createElement("button"); action.type = "button"; action.textContent = copy.cta; action.dataset.plannedAction = warningCode; article.append(heading, description, action); warningsList.append(article); }); } function renderFunnel(result) { const funnel = resolveFunnel(result); document.querySelector("#personal-cta-title").textContent = funnel.primaryCta; document.querySelector("#personal-cta-message").textContent = funnel.message; const primaryButton = document.querySelector("#personal-cta-button"); primaryButton.textContent = funnel.primaryCta; primaryButton.dataset.plannedAction = funnel.segment; const secondaryButton = document.querySelector("#personal-cta-secondary"); secondaryButton.textContent = funnel.secondaryCta; secondaryButton.dataset.plannedAction = funnel.segment; } function renderResult(result) { const incomeWarning = result.warnings.includes("income_warning"); const businessVisa = result.warnings.includes("business_visa_special_rule"); const quickMode = result.calculationMode === CALCULATION_MODES.QUICK; const contextMessages = []; if (quickMode) { contextMessages.push("Это предварительный расчёт. Для подачи лучше вернуться к точному расчёту по датам."); } if (incomeWarning) { contextMessages.push("В вашем сценарии МВД может смотреть не только остаток на счёте, но и регулярный доход."); } resultEyebrow.textContent = incomeWarning ? "Нужна проверка дохода" : quickMode ? "Предварительный ориентир" : "Ваш расчёт"; resultTitle.textContent = incomeWarning ? "В вашем случае может понадобиться проверка дохода" : "Рекомендуемая сумма на счёте"; resultContextNote.hidden = contextMessages.length === 0; resultContextNote.textContent = contextMessages.join(" "); resultCard.dataset.resultTone = incomeWarning ? "income" : quickMode ? "quick" : "standard"; document.querySelector("#recommended-amount").textContent = formatCzk(result.recommendedAmount); document.querySelector("#buffer-label").textContent = incomeWarning ? `Ориентир по банковской формуле с запасом +${result.safetyBufferPercent}%. Доход лучше проверить отдельно.` : result.safetyBufferPercent === 0 ? "Без дополнительного запаса" : `Запас +${result.safetyBufferPercent}% уже включён в главную сумму`; document.querySelector("#official-amount").textContent = formatCzk(result.officialAmount); document.querySelector("#conservative-amount").textContent = formatCzk(result.conservativeAmount); document.querySelector("#months-summary").textContent = businessVisa ? "Фиксированная сумма" : result.gapMonths > 0 ? `${result.officialMonths} мес. + ожидание ${result.gapMonths} мес.` : `${result.officialMonths} мес., без периода ожидания`; const explanation = document.querySelector("#formula-explanation"); explanation.replaceChildren(); result.formulaExplanation.forEach((line) => { const item = document.createElement("li"); item.textContent = line; explanation.append(item); }); const countedMonths = document.querySelector("#counted-months"); countedMonths.replaceChildren(); if (result.countedMonthsOfficial.length) { const official = document.createElement("p"); const officialLabel = document.createElement("strong"); officialLabel.textContent = "Период по формуле: "; official.append(officialLabel, monthRangeText(result.countedMonthsOfficial)); countedMonths.append(official); } if (result.countedMonthsConservative.length && result.gapMonths > 0) { const conservative = document.createElement("p"); const conservativeLabel = document.createElement("strong"); conservativeLabel.textContent = "С учётом периода ожидания: "; conservative.append(conservativeLabel, monthRangeText(result.countedMonthsConservative)); countedMonths.append(conservative); } renderWarnings(result); renderFunnel(result); plannedActionStatus.textContent = ""; output.hidden = false; resultTitle.focus({ preventScroll: true }); resultCard.scrollIntoView({ behavior: "smooth", block: "start" }); } function handleSubmit(event) { event.preventDefault(); const input = collectInput(); const validation = validateCalculatorInput(input); if (!validation.valid) { renderErrors(validation.errors); return; } clearErrors(); try { const result = input.calculationMode === CALCULATION_MODES.QUICK ? calculateQuick(input) : calculateDates(input); renderResult(result); } catch { renderErrors({ calculationMode: "Не удалось выполнить расчёт. Проверьте введённые данные." }); } } function showPlannedAction() { plannedActionStatus.textContent = PLANNED_ACTION_MESSAGE; } function handleConsultFormSubmit(event) { event.preventDefault(); const consultFormStatus = document.querySelector("#consult-form-status"); const consultForm = event.currentTarget; if (!consultForm.checkValidity()) { consultFormStatus.textContent = "Заполните имя и контакт, чтобы подготовить запись на консультацию."; consultForm.reportValidity(); return; } consultFormStatus.textContent = "Форма записи подготовлена, но онлайн-отправка здесь пока не подключена. Данные не сохранены и не переданы."; } function initialize() { populateMonthOptions(); updateMode(); updateMixedAgeGuidance(); updateApplicationNote(); form.addEventListener("submit", handleSubmit); form.addEventListener("change", (event) => { if (event.target.name === "calculationMode") updateMode(); if (event.target.name === "ageScenario") updateMixedAgeGuidance(); if (["applicationType", "stayType", "purposeType"].includes(event.target.name)) updateApplicationNote(); markResultStale(); }); form.addEventListener("input", markResultStale); document.querySelector("#edit-inputs").addEventListener("click", () => { document.querySelector("#calculator-title").scrollIntoView({ behavior: "smooth", block: "start" }); datesPanel.querySelector("input, select")?.focus({ preventScroll: true }); }); document.querySelector("#personal-cta").addEventListener("click", (event) => { if (event.target.closest("[data-planned-action]")) showPlannedAction(); }); warningsList.addEventListener("click", (event) => { if (event.target.closest("[data-planned-action]")) showPlannedAction(); }); document.querySelectorAll("#services [data-planned-action]").forEach((button) => { button.addEventListener("click", () => { servicesActionStatus.textContent = PLANNED_ACTION_MESSAGE; }); }); document.querySelector("#consult-form")?.addEventListener("submit", handleConsultFormSubmit); } initialize(); })(); (function () { function getHeight() { var body = document.body; var html = document.documentElement; return Math.ceil(Math.max( body ? body.scrollHeight : 0, body ? body.offsetHeight : 0, html ? html.scrollHeight : 0, html ? html.offsetHeight : 0 )); } function sendHeight() { parent.postMessage({ type: 'c1bf-calculator-height', height: getHeight() }, '*'); } window.addEventListener('load', sendHeight); window.addEventListener('resize', sendHeight); if ('ResizeObserver' in window) { new ResizeObserver(sendHeight).observe(document.documentElement); } document.addEventListener('toggle', sendHeight, true); document.addEventListener('click', function () { setTimeout(sendHeight, 80); }, true); setTimeout(sendHeight, 50); setTimeout(sendHeight, 300); setTimeout(sendHeight, 900); })(); </script> </body> </html>