PageSourceSearch

https://guarantor.su/max

html guarantor.su collected 2026-10-08 09:21:58 UTC 186,121 bytes, 2,611 lines download raw bytes

1<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!--metatextblock--> <title>Гарант Сделки - Эскроу сервис в MAX: Расчеты крипта и фиате в Максе</title> <meta name="description" content="Эскроу-сервис для MAX (Макс). Безопасная сделка между покупателем и продавцом. Гарантия честной сделки." /> <meta property="og:url" content="https://guarantor.su/max" /> <meta property="og:title" content="Гарант Сделки - Эскроу сервис в MAX: Расчеты крипта и фиате в Максе" /> <meta property="og:description" content="Эскроу-сервис для MAX (Макс). Безопасная сделка между покупателем и продавцом. Гарантия честной сделки." /> <meta property="og:type" content="website" /> <link rel="canonical" href="https://guarantor.su/max"> <!--/metatextblock--> <meta name="format-detection" content="telephone=no" /> <meta http-equiv="x-dns-prefetch-control" content="on"> <link rel="dns-prefetch" href="https://ws.tildacdn.com"> <link rel="dns-prefetch" href="https://static.tildacdn.com"> <!--favicons--> <link rel="icon" type="image/svg+xml" sizes="any" href="https://static.tildacdn.com/tild3466-3365-4631-b337-626163323333/1768296815_1.svg"> <!--/favicons--> <link rel="alternate" type="application/rss+xml" title="ГАРАНТ СДЕЛКИ" href="https://guarantor.su/rss.xml" /> <!-- Assets --> 
1<script src="https://neo.tildacdn.com/js/tilda-fallback-1.0.min.js" async charset="utf-8"></script>
1 <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-grid-3.0.min.css" type="text/css" media="all" onerror="this.loaderr='y';"/> <link rel="stylesheet" href="https://static.tildacdn.com/ws/project2980991/tilda-blocks-page148048346.min.css?t=1791450338" type="text/css" media="all" onerror="this.loaderr='y';" /> 
1<script nomodule src="https://static.tildacdn.com/js/tilda-polyfill-1.0.min.js" charset="utf-8"></script>
1 
1<script type="text/javascript">function t_onReady(func) {if(document.readyState!='loading') {func();} else {document.addEventListener('DOMContentLoaded',func);}}
2function t_onFuncLoad(funcName,okFunc,time) {if(typeof window[funcName]==='function') {okFunc();} else {setTimeout(function() {t_onFuncLoad(funcName,okFunc,time);},(time||100));}}if(navigator.userAgent.indexOf('Android')!==-1) {var l=document.createElement('link');l.rel='stylesheet';l.href='https://static.tildacdn.com/css/fonts-arial.css';l.media='all';document.getElementsByTagName('head')[0].appendChild(l);}</script>
2 
2<script src="https://static.tildacdn.com/js/tilda-scripts-3.0.min.js" charset="utf-8" defer onerror="this.loaderr='y';"></script>
2 
2<script src="https://static.tildacdn.com/ws/project2980991/tilda-blocks-page148048346.min.js?t=1791450338" charset="utf-8" async onerror="this.loaderr='y';"></script>
2 
2<script src="https://static.tildacdn.com/js/tilda-lazyload-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script>
2 
2<script src="https://static.tildacdn.com/js/tilda-events-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script>
2 <!-- nominify begin --><!-- ============================================================
3     GUARANTOR.SU GLOBAL HEAD v29.2 FINAL
4     Полная переработка с учётом всех ревью.
5
6     Исправлено:
7     - pageshow теперь закрывает модалку при bfcache restore
8     - FAB aria-label полностью соответствует видимому тексту (WCAG 2.5.3)
9     - aria-haspopup убран (несоответствие после перехода на <nav>)
10     - MutationObserver следит и за body, и за html (Tilda может ставить класс на любой)
11     - scroll-padding навешивается только при активном FAB (html.has-gs-fab)
12     - Fallback FAB адаптивен (bottom совпадает с основным FAB)
13     - Аналитика: gsTrack по умолчанию пишет только в Yandex Metrika
14       (Tilda сама управляет GA/GTM — конфигурируемо)
15     - Убран бессмысленный preload+media хак, оставлен чистый async CSS
16     - theme-color выровнен с основным цветом страницы
17     - Разделитель меню FAB: класс без role="separator"
18    ============================================================ --> <!-- Resource hints --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://static.tildacdn.com" crossorigin> <link rel="dns-prefetch" href="https://t.me"> <link rel="dns-prefetch" href="https://mc.yandex.ru"> <link rel="dns-prefetch" href="https://mc.yandex.com"> <!-- Async font loading (без избыточного preload+media хака) --> <link
19  rel="stylesheet"
20  href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Syne:wght@700;800;900&family=Space+Mono:wght@400;700&display=swap"
21  media="print"
22  onload="this.media='all';this.onload=null;"
23> <noscript> <link
24    rel="stylesheet"
25    href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Syne:wght@700;800;900&family=Space+Mono:wght@400;700&display=swap"
26  > </noscript> <!-- Global meta --> <meta name="theme-color" content="#05080F"> <meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"> <meta name="author" content="Гарант Сделок"> <meta name="geo.region" content="RU"> <meta name="geo.placename" content="Russia"> <meta name="referrer" content="strict-origin-when-cross-origin"> <!-- AI / LLM / AEO / GEO support --> <meta
27  name="ai:bot"
28  content="google-extended, GPTBot, ClaudeBot, PerplexityBot, Applebot-Extended, Bytespider, Omgilibot, CCbot, meta-externalagent"
29> <meta
30  name="ai:content"
31  content="Escrow service for cryptocurrency, P2P, OTC, RWA, NFT, Telegram channels, IT business. Deal guarantor since 2019. Multisig 2/3, MPC wallets, arbitration, anti-scam, anti-phishing, rug pull protection."
32> <meta
33  name="ai:license"
34  content="All rights reserved. Use for AI training is permitted for search and answer engines (AEO/GEO)."
35> <meta
36  name="ai:purpose"
37  content="Provide trustworthy escrow and guarantee services for crypto and fiat transactions, protect buyers and sellers from fraud, phishing, rug pull and chargeback."
38> <meta
39  name="ai:disclaimer"
40  content="This content is provided for informational purposes. Always verify escrow service details before transactions."
41> <meta
42  name="ai:training"
43  content="Permitted for search engines and AI assistants providing answers to user queries about escrow services, cryptocurrency transactions, and deal protection."
44> <!-- ============================================================
45     Schema.org Global Entities
46    ============================================================ --> 
46<script type="application/ld+json">
47{
48  "@context": "https://schema.org",
49  "@graph": [
50    {
51      "@type": "Organization",
52      "@id": "https://guarantor.su/#organization",
53      "name": "Гарант Сделок",
54      "alternateName": [
55        "Гарант Сделок",
56        "Гарант Сделок №1",
57        "Guarantor.su",
58        "Крипто-гарант",
59        "Эскроу-сервис",
60        "Сервис безопасных сделок"
61      ],
62      "url": "https://guarantor.su/",
63      "description": "Сервис гарант сделок и крипто-эскроу для безопасных расчетов в криптовалюте и фиате. Защита покупателя и продавца, депонирование средств, мультиподпись 2/3, проверка контрагентов, арбитраж споров.",
64      "slogan": "Безопасные сделки через эскроу",
65      "foundingDate": "2019",
66      "email": "[email protected]",
67      "areaServed": ["RU", "BY", "KZ", "UA", "AE", "TR", "GLOBAL"],
68      "availableLanguage": ["Russian", "English"],
69      "sameAs": [
70        "https://t.me/GARANT_S_bot"
71      ],
72      "knowsAbout": [
73        "гарант сделок",
74        "крипто эскроу",
75        "эскроу счет",
76        "безопасная сделка",
77        "p2p гарант",
78        "защита от скама",
79        "защита от фишинга",
80        "защита покупателя",
81        "защита продавца",
82        "депонирование средств",
83        "передача права собственности",
84        "мультиподпись 2/3",
85        "MPC кошелек",
86        "OTC сделки",
87        "RWA эскроу",
88        "NFT эскроу",
89        "продажа Telegram-канала",
90        "продажа IT-бизнеса",
91        "арбитраж крипто споров",
92        "безопасные расчеты в криптовалюте и фиате"
93      ],
94      "hasOfferCatalog": {
95        "@type": "OfferCatalog",
96        "name": "Эскроу и гарант-услуги",
97        "itemListElement": [
98          {
99            "@type": "Offer",
100            "itemOffered": {
101              "@type": "Service",
102              "name": "Крипто-эскроу",
103              "serviceType": "Escrow",
104              "description": "Безопасные расчеты через эскроу счет с депонированием средств."
105            }
106          },
107          {
108            "@type": "Offer",
109            "itemOffered": {
110              "@type": "Service",
111              "name": "P2P гарант",
112              "serviceType": "P2P Guarantee",
113              "description": "Защита P2P обмена криптовалюты от скама, треугольника и подмены реквизитов."
114            }
115          },
116          {
117            "@type": "Offer",
118            "itemOffered": {
119              "@type": "Service",
120              "name": "OTC и RWA сопровождение",
121              "serviceType": "OTC / RWA Escrow",
122              "description": "Защита крупных внебиржевых сделок и сделок с реальными активами."
123            }
124          },
125          {
126            "@type": "Offer",
127            "itemOffered": {
128              "@type": "Service",
129              "name": "Проверка контрагента",
130              "serviceType": "OSINT / AML / KYT Check",
131              "description": "Проверка крипто-адресов, аккаунтов и контрагентов перед сделкой."
132            }
133          }
134        ]
135      }
136    },
137    {
138      "@type": "WebSite",
139      "@id": "https://guarantor.su/#website",
140      "url": "https://guarantor.su/",
141      "name": "Гарант Сделок — Крипто-Эскроу Сервис",
142      "description": "Безопасные сделки через эскроу-счет. P2P, OTC, RWA, NFT, IT-бизнес, Telegram-каналы.",
143      "publisher": {
144        "@id": "https://guarantor.su/#organization"
145      },
146      "inLanguage": "ru",
147      "potentialAction": {
148        "@type": "SearchAction",
149        "target": "https://guarantor.su/?s={search_term_string}",
150        "query-input": "required name=search_term_string"
151      }
152    },
153    {
154      "@type": "FinancialService",
155      "@id": "https://guarantor.su/#service",
156      "name": "Крипто-эскроу и P2P-гарант",
157      "provider": {
158        "@id": "https://guarantor.su/#organization"
159      },
160      "serviceType": "Escrow & Guarantee",
161      "areaServed": ["RU", "BY", "KZ", "UA", "AE", "TR", "GLOBAL"],
162      "description": "Депонирование средств, защита покупателя и продавца, передача права собственности, арбитраж споров, проверка контрагентов перед сделкой."
163    },
164    {
165      "@type": "SoftwareApplication",
166      "@id": "https://guarantor.su/#software",
167      "name": "Гарант Сделок Bot",
168      "alternateName": "@GARANT_S_bot",
169      "applicationCategory": "FinanceApplication",
170      "operatingSystem": "Web, iOS, Android",
171      "url": "https://t.me/GARANT_S_bot",
172      "description": "Telegram-бот для безопасных сделок через крипто-эскроу: депонирование, проверка контрагента, защита от скама, арбитраж.",
173      "publisher": {
174        "@id": "https://guarantor.su/#organization"
175      },
176      "offers": {
177        "@type": "Offer",
178        "price": "0",
179        "priceCurrency": "USD",
180        "availability": "https://schema.org/InStock",
181        "description": "Запуск бота бесплатный. Комиссия сделки согласуется заранее."
182      }
183    }
184  ]
185}
186</script>
186 <!-- ============================================================
187     Global config + analytics + safe error filter
188     Аналитика: Tilda управляет GA/GTM сама. gsTrack по умолчанию
189     отправляет только reachGoal в Yandex Metrika (кастомные цели,
190     которые Tilda UI создать не может). Каналы конфигурируемы.
191    ============================================================ --> 
191<script>
192(function () {
193  'use strict';
194  if (window.__gsHeadV29) return;
195  window.__gsHeadV29 = true;
196
197  window.__gsConfigV29 = Object.assign(
198    {
199      botUrl: 'https://t.me/GARANT_S_bot',
200      maxUrl: 'https://guarantor.su/max',
201      saleUrl: 'https://guarantor.su/sale',
202      homeUrl: 'https://guarantor.su/',
203      modalEnabled: true,
204      fabEnabled: true,
205      interceptTelegram: true,
206      optimizeMetricaScripts: true,
207      suppressYandexConsoleNoise: true,
208      noindex404: true,
209
210      /* Аналитика: Tilda управляет GA/GTM. По умолчанию — только ym. */
211      analytics: {
212        ym: true,
213        gtag: false,
214        dataLayer: false
215      }
216    },
217    window.__gsConfigV29 || {}
218  );
219
220  function safe(fn) {
221    try { fn(); } catch (e) { /* silent */ }
222  }
223
224  function is404Page() {
225    try {
226      var p = window.location.pathname || '';
227      var t = document.title || '';
228      return p.indexOf('404') !== -1 || t.indexOf('404') !== -1;
229    } catch (e) { return false; }
230  }
231
232  function isYandexWsNoise(text) {
233    try {
234      if (!text) return false;
235      var msg = String(text).toLowerCase();
236      return (
237        (msg.indexOf('websocket') !== -1 || msg.indexOf('wss://') !== -1) &&
238        (msg.indexOf('yandex') !== -1 || msg.indexOf('metrika') !== -1 || msg.indexOf('mc.yandex') !== -1)
239      );
240    } catch (e) { return false; }
241  }
242
243  var ymIdCache = null;
244  function getYmId() {
245    if (ymIdCache) return ymIdCache;
246    try {
247      if (window.yaCounterId) { ymIdCache = window.yaCounterId; return ymIdCache; }
248      if (window.Ya && window.Ya.Metrika2 && typeof window.Ya.Metrika2.counters === 'function') {
249        var list = window.Ya.Metrika2.counters();
250        if (list && list[0] && list[0].id) { ymIdCache = list[0].id; return ymIdCache; }
251      }
252      var keys = Object.keys(window).filter(function (k) { return /^yaCounter\d+/.test(k); });
253      if (keys.length) {
254        ymIdCache = parseInt(keys[0].replace('yaCounter', ''), 10);
255        return ymIdCache;
256      }
257      if (typeof window.ym === 'function' && window.ym.id) {
258        ymIdCache = window.ym.id;
259        return ymIdCache;
260      }
261      var sc = document.querySelector(
262        'script[src*="mc.yandex.ru/metrika/watch.js"], script[src*="mc.yandex.com/metrika/watch.js"]'
263      );
264      if (sc && sc.src) {
265        var m = sc.src.match(/[?&](\d+)(?:&|$)/);
266        if (m) { ymIdCache = m[1]; return ymIdCache; }
267      }
268    } catch (e) { /* silent */ }
269    return null;
270  }
271  window.gsGetMetrikaId = getYmId;
272
273  window.gsTrack = function (goal, category, label, value) {
274    var a = (window.__gsConfigV29 && window.__gsConfigV29.analytics) || {};
275    if (a.ym !== false) {
276      safe(function () {
277        var id = getYmId();
278        if (id && typeof window.ym === 'function') {
279          window.ym(id, 'reachGoal', goal);
280        }
281      });
282    }
283    if (a.gtag === true) {
284      safe(function () {
285        if (typeof window.gtag === 'function') {
286          window.gtag('event', category || 'GS', {
287            event_category: category || 'GS',
288            event_label: label || goal,
289            value: value || 1
290          });
291        }
292      });
293    }
294    if (a.dataLayer === true) {
295      safe(function () {
296        if (window.dataLayer) {
297          window.dataLayer.push({
298            event: goal,
299            category: category || 'GS',
300            label: label || goal
301          });
302        }
303      });
304    }
305  };
306
307  function setMeta(name, content) {
308    safe(function () {
309      var m = document.querySelector('meta[name="' + name + '"]');
310      if (!m) {
311        m = document.createElement('meta');
312        m.name = name;
313        (document.head || document.documentElement).appendChild(m);
314      }
315      m.content = content;
316    });
317  }
318
319  function apply404Noindex() {
320    if (!window.__gsConfigV29.noindex404) return;
321    if (!is404Page()) return;
322    setMeta('robots', 'noindex, nofollow');
323  }
324  if (document.readyState === 'loading') {
325    document.addEventListener('DOMContentLoaded', apply404Noindex, { once: true });
326  } else {
327    apply404Noindex();
328  }
329
330  window.addEventListener(
331    'error',
332    function (e) {
333      safe(function () {
334        if (e && e.message && isYandexWsNoise(e.message)) {
335          e.preventDefault();
336          if (typeof e.stopImmediatePropagation === 'function') e.stopImmediatePropagation();
337        }
338      });
339    },
340    true
341  );
342
343  window.addEventListener('unhandledrejection', function (e) {
344    safe(function () {
345      var msg = '';
346      if (e && e.reason) msg = e.reason.message || String(e.reason);
347      if (isYandexWsNoise(msg)) e.preventDefault();
348    });
349  });
350
351  if (window.__gsConfigV29.suppressYandexConsoleNoise) {
352    safe(function () {
353      if (window.console && console.error && !console.__gsWrappedV29) {
354        var original = console.error;
355        console.error = function () {
356          try {
357            var msg = Array.prototype.map
358              .call(arguments, function (arg) {
359                if (typeof arg === 'string') return arg;
360                if (arg && arg.message) return arg.message;
361                try { return String(arg); } catch (e) { return ''; }
362              })
363              .join(' ');
364            if (isYandexWsNoise(msg)) return;
365          } catch (e) { /* silent */ }
366          original.apply(console, arguments);
367        };
368        console.__gsWrappedV29 = true;
369      }
370    });
371  }
372
373  if (window.__gsConfigV29.optimizeMetricaScripts && 'MutationObserver' in window) {
374    safe(function () {
375      var observer = new MutationObserver(function (mutations) {
376        mutations.forEach(function (mutation) {
377          mutation.addedNodes.forEach(function (node) {
378            if (
379              node &&
380              node.nodeType === 1 &&
381              node.tagName === 'SCRIPT' &&
382              node.src &&
383              /mc\.yandex\.ru|mc\.yandex\.com|googletagmanager\.com|google-analytics\.com|doubleclick\.net/i.test(node.src)
384            ) {
385              if (!node.dataset.gsOptimized) {
386                node.dataset.gsOptimized = '1';
387                try {
388                  node.async = true;
389                  node.setAttribute('fetchpriority', 'low');
390                  if ('fetchPriority' in node) node.fetchPriority = 'low';
391                } catch (e) { /* silent */ }
392              }
393            }
394          });
395        });
396      });
397      observer.observe(document.documentElement, { childList: true, subtree: true });
398      window.__gsMetricsObserverV29 = observer;
399      window.addEventListener('load', function () {
400        setTimeout(function () {
401          if (observer) {
402            observer.disconnect();
403            window.__gsMetricsObserverV29 = null;
404          }
405        }, 15000);
406      }, { once: true });
407    });
408  }
409
410  /* bfcache restore: убираем залипший overflow И просим модалку закрыться */
411  window.addEventListener('pageshow', function (event) {
412    safe(function () {
413      if (!event.persisted) return;
414      if (document.body) document.body.style.overflow = '';
415      var modalRoot = document.getElementById('gs-global-modal-root');
416      if (modalRoot && typeof modalRoot.closeModal === 'function') {
417        try { modalRoot.closeModal(); } catch (e) { /* silent */ }
418      }
419    });
420  });
421})();
422</script>
422 <!-- ============================================================
423     GLOBAL MODAL + INTERCEPTOR v29.2
424    ============================================================ --> 
424<script>
425(function () {
426  'use strict';
427  if (window.__gsGlobalModalV29) return;
428  window.__gsGlobalModalV29 = true;
429
430  var cfg = window.__gsConfigV29 || {};
431  cfg.botUrl = cfg.botUrl || 'https://t.me/GARANT_S_bot';
432  cfg.maxUrl = cfg.maxUrl || 'https://guarantor.su/max';
433  cfg.saleUrl = cfg.saleUrl || 'https://guarantor.su/sale';
434  cfg.homeUrl = cfg.homeUrl || 'https://guarantor.su/';
435
436  if (cfg.modalEnabled === false) return;
437
438  var p = window.location.pathname || '';
439  function isPagePath(name) {
440    var target = '/' + name;
441    return p === target || p.indexOf(target + '/') !== -1 || p.slice(-target.length) === target;
442  }
443  function isSpecialPage() {
444    return isPagePath('max') || isPagePath('sale');
445  }
446  function isPopupActive() {
447    try {
448      return (
449        (document.body && (document.body.classList.contains('t-body_popup') || document.body.classList.contains('t-popup_opened'))) ||
450        (document.documentElement && document.documentElement.classList.contains('t-popup_opened'))
451      );
452    } catch (e) { return false; }
453  }
454
455  var is404 = p.indexOf('404') !== -1 || (document.title || '').indexOf('404') !== -1;
456  var isMiniApp = p.indexOf('/miniapp') !== -1 || (window.Telegram && window.Telegram.WebApp);
457  if (is404 || isPopupActive() || isMiniApp || isSpecialPage()) return;
458  if (!window.customElements) return;
459
460  class GsGlobalModal extends HTMLElement {
461    constructor() {
462      super();
463      this.attachShadow({ mode: 'open' });
464      this._rendered = false;
465      this._isOpen = false;
466      this._lastFocused = null;
467      this._prevOverflow = '';
468      this._boundKeydown = null;
469      this._boundClick = null;
470      this._tildaObserver = null;
471      this._focusableSelector = 'a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';
472    }
473
474    connectedCallback() {
475      if (!this._rendered) {
476        this.render();
477        this._rendered = true;
478      }
479      this.setupGlobalInterceptor();
480      this.setupModalControls();
481      this.setupKeyboardNav();
482      this.setupTildaObserver();
483    }
484
485    disconnectedCallback() {
486      if (this._boundKeydown) document.removeEventListener('keydown', this._boundKeydown);
487      if (this._boundClick) document.removeEventListener('click', this._boundClick, true);
488      if (this._tildaObserver) {
489        this._tildaObserver.disconnect();
490        this._tildaObserver = null;
491      }
492    }
493
494    render() {
495      this.shadowRoot.innerHTML = `
496        <style>
497          @keyframes modal-fade-in{from{opacity:0}to{opacity:1}}
498          @keyframes modal-slide-up{from{opacity:0;transform:translateY(30px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}
499          @keyframes dot-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(1.35)}}
500          @keyframes hot-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.08)}}
501          :host{display:block;position:absolute;top:0;left:0;width:0;height:0;overflow:visible;pointer-events:none;z-index:99998;font-family:'DM Sans',system-ui,-apple-system,sans-serif}
502          .overlay{position:fixed;inset:0;background:rgba(3,6,20,.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .3s ease;padding:20px;z-index:99999}
503          .overlay.active{opacity:1;pointer-events:auto;animation:modal-fade-in .3s ease}
504          .modal{background:linear-gradient(145deg,rgba(12,16,32,.98),rgba(20,26,48,.95));border:1px solid rgba(0,229,160,.35);border-radius:28px;padding:clamp(24px,4vw,36px) clamp(20px,4vw,28px);max-width:420px;width:100%;box-shadow:0 30px 80px rgba(0,0,0,.7),0 0 0 1px rgba(0,229,160,.15),inset 0 1px 0 rgba(255,255,255,.05);position:relative;transform:translateY(30px) scale(.95);transition:transform .35s cubic-bezier(.25,.46,.45,.94)}
505          .overlay.active .modal{transform:translateY(0) scale(1);animation:modal-slide-up .35s cubic-bezier(.25,.46,.45,.94)}
506          .modal::before{content:'';position:absolute;inset:-1px;border-radius:28px;background:linear-gradient(135deg,rgba(0,229,160,.4),rgba(89,168,255,.2),rgba(255,194,75,.3));z-index:-1;opacity:.6;filter:blur(1px)}
507          .close-btn{position:absolute;top:14px;right:14px;width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.08);color:rgba(220,230,255,.9);font-size:22px;
507cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;font-family:inherit;line-height:1;z-index:2;touch-action:manipulation}
508          .close-btn:hover{background:#FF6B6B;color:#fff;border-color:#FF6B6B;transform:rotate(90deg)}
509          .header{text-align:center;margin-bottom:22px;padding:0 8px}
510          .badge{display:inline-flex;align-items:center;gap:6px;background:rgba(0,229,160,.12);border:1px solid rgba(0,229,160,.3);border-radius:100px;padding:5px 12px;font-family:'Space Mono',monospace;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1.2px;color:#00E5A0;margin-bottom:12px}
511          .dot{width:6px;height:6px;background:#00E5A0;border-radius:50%;box-shadow:0 0 12px #00E5A0;animation:dot-pulse 2.4s ease-in-out infinite;flex-shrink:0}
512          .title{font-family:'Syne',sans-serif;font-size:clamp(18px,4vw,22px);font-weight:800;line-height:1.2;margin-bottom:8px;letter-spacing:-.02em;color:#F5F7FA}
513          .title .grad{background:linear-gradient(135deg,#00E5A0 0%,#59A8FF 50%,#FFC24B 100%);-webkit-background-clip:text;background-clip:text;color:transparent}
514          .subtitle{font-size:12px;color:#E2E8F0;line-height:1.5}
515          .list{display:flex;flex-direction:column;gap:10px;margin-bottom:18px}
516          .btn{display:flex;align-items:center;gap:14px;width:100%;padding:14px 16px;border-radius:14px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);color:#F5F7FA;text-decoration:none;transition:all .25s;font-family:inherit;text-align:left;position:relative;overflow:hidden;min-height:64px;cursor:pointer;touch-action:manipulation}
517          .btn::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:#00E5A0;opacity:0;transition:opacity .25s}
518          .btn:hover{border-color:#00E5A0;background:rgba(0,229,160,.12);transform:translateX(4px)}
519          .btn:hover::before{opacity:1}
520          .btn:focus-visible{outline:3px solid #00E5A0;outline-offset:2px}
521          .btn-icon{width:42px;height:42px;border-radius:12px;background:linear-gradient(135deg,rgba(0,229,160,.15),rgba(89,168,255,.1));border:1px solid rgba(0,229,160,.25);display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0;transition:all .25s}
522          .btn:hover .btn-icon{background:linear-gradient(135deg,rgba(0,229,160,.25),rgba(89,168,255,.2));transform:scale(1.08)}
523          .btn-content{flex:1;min-width:0}
524          .btn-text{font-weight:700;font-size:14px;display:block;line-height:1.2;margin-bottom:2px}
525          .btn-sub{font-size:11px;color:#E2E8F0;display:block;font-family:'Space Mono',monospace;letter-spacing:.3px}
526          .btn-arrow{color:#00E5A0;font-size:18px;opacity:0;transform:translateX(-8px);transition:all .25s;flex-shrink:0}
527          .btn:hover .btn-arrow{opacity:1;transform:translateX(0)}
528          .btn-hot{position:relative}
529          .btn-hot::after{content:'HOT';position:absolute;top:-6px;right:12px;background:linear-gradient(135deg,#FF6B6B,#FF8E5F);color:#fff;font-family:'Space Mono',monospace;font-size:9px;font-weight:800;padding:3px 8px;border-radius:100px;letter-spacing:1px;box-shadow:0 4px 12px rgba(255,107,107,.4);animation:hot-pulse 2s ease-in-out infinite}
530          .btn-sale{background:linear-gradient(135deg,rgba(255,107,107,.12),rgba(255,107,107,.04));border-color:rgba(255,107,107,.35)}
531          .btn-sale::before{background:#FF6B6B}
532          .btn-sale:hover{border-color:#FF6B6B;background:rgba(255,107,107,.18)}
533          .btn-sale .btn-icon{background:linear-gradient(135deg,rgba(255,107,107,.2),rgba(255,194,75,.1));border-color:rgba(255,107,107,.35)}
534          .btn-sale .btn-text{color:#FFC24B}
535          .btn-sale .btn-arrow{color:#FF6B6B}
536          .footer{text-align:center;padding-top:14px;border-top:1px solid rgba(255,255,255,.08)}
537          .footer-text{font-size:10px;color:#E2E8F0;font-family:'Space Mono',monospace;letter-spacing:.5px;display:flex;align-items:center;justify-content:center;gap:6px}
538          @media(max-width:480px){
539            .modal{padding:22px 18px}
540            .btn{padding:12px 14px;gap:12px}
541            .btn-icon{width:38px;height:38px;font-size:20px}
542            .btn-text{font-size:13px}
543            .btn-sub{font-size:10px}
544            .btn-hot::after{top:-5px;right:8px;font-size:8px;padding:2px 6px}
545          }
546          @media(prefers-reduced-motion:reduce){
547            .overlay,.modal,.btn,.close-btn{transition-duration:.01ms!important;animation:none!important}
548            .btn-hot::after{animation:none}
549          }
550        </style> <div class="overlay" role="dialog" aria-modal="true" aria-labelledby="gs-modal-title" aria-describedby="gs-modal-desc" aria-hidden="true"> <div class="modal"> <button class="close-btn" type="button" aria-label="Закрыть" tabindex="-1">✕</button> <div class="header"> <div class="badge"><span class="dot"></span> ESCROW GATEWAY · ACTIVE</div> <div class="title" id="gs-modal-title">Выберите <span class="grad">площадку запуска</span></div> <div class="subtitle" id="gs-modal-desc">Безопасная сделка активируется за 30 секунд через защищённый шлюз</div> </div> <div class="list"> <a href="${cfg.botUrl}" class="btn btn-hot" target="_blank" rel="noopener" data-track="modal-telegram" tabindex="-1"> <span class="btn-icon" aria-hidden="true">✈️</span> <span class="btn-content"> <span class="btn-text">Сделки в Telegram</span> <span class="btn-sub">@GARANT_S_bot · Эскроу 30 сек · 30+ блокчейнов</span> </span> <span class="btn-arrow" aria-hidden="true">→</span> </a> <a href="${cfg.maxUrl}" class="btn" rel="noopener" data-track="modal-max" tabindex="-1"> <span class="btn-icon" aria-hidden="true">💬</span> <span class="btn-content"> <span class="btn-text">Сделки в MAX</span> <span class="btn-sub">Для РФ · Работает без VPN · MAX Messenger</span> </span> <span class="btn-arrow" aria-hidden="true">→</span> </a> <a href="${cfg.saleUrl}" class="btn btn-sale" rel="noopener" data-track="modal-sale" tabindex="-1"> <span class="btn-icon" aria-hidden="true">🔥</span> <span class="btn-content"> <span class="btn-text">SALE: Купить проект</span> <span class="btn-sub">Готовый бизнес под ключ · Оплата USDT</sp
550an> </span> <span class="btn-arrow" aria-hidden="true">→</span> </a> </div> <div class="footer"> <div class="footer-text"> <span class="dot"></span> <span>MULTISIG 2/3 · ESCROW · AML/KYT</span> </div> </div> </div> </div>
551      `;
552    }
553
554    setupGlobalInterceptor() {
555      if (cfg.interceptTelegram === false) return;
556      this._boundClick = (e) => {
557        if (e.ctrlKey || e.metaKey || e.shiftKey || e.button === 1) return;
558        if (e.defaultPrevented) return;
559        if (isPopupActive()) return;
560
561        const path = typeof e.composedPath === 'function' ? e.composedPath() : (e.path || []);
562        let targetLink = null;
563        for (const el of path) {
564          if (
565            el.tagName === 'A' &&
566            el.href &&
567            (el.href.indexOf('t.me/GARANT_S_bot') !== -1 || el.href.indexOf(cfg.botUrl) !== -1)
568          ) {
569            targetLink = el;
570            break;
571          }
572        }
573        if (!targetLink) return;
574        if (targetLink.closest('[data-gs-no-modal]')) return;
575        if (targetLink.closest('.t-popup, .t-popup_opened, [class*="t-popup"]')) return;
576        if (path.includes(this.shadowRoot)) return;
577
578        const fabRoot = document.getElementById('gs-fab-button-root');
579        if (fabRoot && path.includes(fabRoot)) return;
580        if (this._isOpen) return;
581
582        /* Без stopPropagation — событие должно дойти до целевых
583           обработчиков на <a> (например, data-g5-cta на главной),
584           чтобы аналитика фиксировала конкретный CTA. */
585        e.preventDefault();
586
587        const fab = document.getElementById('gs-fab-button-root');
588        if (fab && fab.shadowRoot) {
589          const trigger = fab.shadowRoot.querySelector('.fab-trigger');
590          if (trigger && trigger.getAttribute('aria-expanded') === 'true') trigger.click();
591        }
592
593        this.openModal();
594
595        if (window.gsTrack) {
596          window.gsTrack('global_interceptor', 'Global Modal', 'global_interceptor');
597        }
598      };
599      document.addEventListener('click', this._boundClick, true);
600    }
601
602    setupModalControls() {
603      const overlay = this.shadowRoot.querySelector('.overlay');
604      const closeBtn = this.shadowRoot.querySelector('.close-btn');
605      const buttons = this.shadowRoot.querySelectorAll('.btn');
606
607      closeBtn.addEventListener('click', () => this.closeModal());
608      overlay.addEventListener('click', (e) => {
609        if (e.target === overlay) this.closeModal();
610      });
611      buttons.forEach((btn) => {
612        btn.addEventListener('click', () => {
613          const trackId = btn.dataset.track;
614          if (trackId && window.gsTrack) {
615            window.gsTrack(trackId, 'Modal Choice', trackId);
616          }
617          setTimeout(() => this.closeModal(), 150);
618        });
619      });
620    }
621
622    setupKeyboardNav() {
623      this._boundKeydown = (e) => {
624        if (!this._isOpen) return;
625        if (e.key === 'Escape') {
626          e.preventDefault();
627          this.closeModal();
628          return;
629        }
630        if (e.key === 'Tab') {
631          const focusable = Array.from(this.shadowRoot.querySelectorAll(this._focusableSelector));
632          if (!focusable.length) return;
633          const first = focusable[0];
634          const last = focusable[focusable.length - 1];
635          const active = this.shadowRoot.activeElement || document.activeElement;
636          if (e.shiftKey) {
637            if (active === first) { e.preventDefault(); last.focus(); }
638          } else {
639            if (active === last) { e.preventDefault(); first.focus(); }
640          }
641        }
642      };
643      document.addEventListener('keydown', this._boundKeydown);
644    }
645
646    setupTildaObserver() {
647      /* Tilda может ставить класс попапа и на body, и на html.
648         Следим за обоими. */
649      const observer = new MutationObserver(() => {
650        if (isPopupActive() && this._isOpen) this.closeModal();
651      });
652      observer.observe(document.body, { attributes: true, attributeFilter: ['class'] });
653      observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
654      this._tildaObserver = observer;
655    }
656
657    setTabindexForAll(container, value) {
658      const elems = container.querySelectorAll('a[href], button, [tabindex]');
659      elems.forEach((el) => el.setAttribute('tabindex', value));
660    }
661
662    openModal() {
663      if (this._isOpen) return;
664      this._isOpen = true;
665      this._lastFocused = document.activeElement;
666      this._prevOverflow = document.body.style.overflow;
667
668      const overlay = this.shadowRoot.querySelector('.overlay');
669      overlay.classList.add('active');
670      overlay.setAttribute('aria-hidden', 'false');
671      document.body.style.overflow = 'hidden';
672      this.setTabindexForAll(overlay, '0');
673
674      /* Фокус на первый CTA (Telegram), не на close-btn */
675      setTimeout(() => {
676        const firstCta = overlay.querySelector('.btn');
677        if (firstCta) firstCta.focus();
678      }, 100);
679
680      if (window.gsTrack) {
681        window.gsTrack('modal_open_global', 'Global Modal', 'open');
682      }
683    }
684
685    closeModal() {
686      if (!this._isOpen) return;
687      this._isOpen = false;
688      const overlay = this.shadowRoot.querySelector('.overlay');
689      overlay.classList.remove('active');
690      overlay.setAttribute('aria-hidden', 'true');
691      document.body.style.overflow = this._prevOverflow || '';
692      this.setTabindexForAll(overlay, '-1');
693      if (this._lastFocused && typeof this._lastFocused.focus === 'function') {
694        try { this._lastFocused.focus(); } catch (e) { /* silent */ }
695      }
696    }
697  }
698
699  if (!customElements.get('gs-global-modal')) {
700    customElements.define('gs-global-modal', GsGlobalModal);
701  }
702
703  const ELEMENT_ID = 'gs-global-modal-root';
704  const TAG_NAME = 'gs-global-modal';
705  let isInjecting = false;
706
707  function inject() {
708    if (isInjecting) return false;
709    if (document.getElementById(ELEMENT_ID)) return true;
710    if (!document.body) return false;
711    isInjecting = true;
712    try {
713      const el = document.createElement(TAG_NAME);
714      el.id = ELEMENT_ID;
715      document.body.appendChild(el);
716      isInjecting = false;
717      return true;
718    } catch (e) {
719      isInjecting = false;
720      return false;
721    }
722  }
723
724  function setupWatcher() {
725    let c = 0;
726    const obs = new MutationObserver(() => {
727      if (!document.getElementById(ELEMENT_ID) && c < 3) {
728        c++;
729        inject();
730      }
731    });
732    obs.observe(document.body, { childList: true, subtree: true });
733  }
734
735  function init() {
736    if (!document.body) { setTimeout(init, 100); return; }
737    if (inject()) setupWatcher();
738  }
739
740  if (document.readyState === 'loading') {
741    document.addEventListener('DOMContentLoaded', init, { once: true });
742  } else {
743    setTimeout(init, 120);
744  }
745  if (window.t_onReady && typeof window.t_onReady === 'function') {
746    window.t_onReady(() => setTimeout(init, 120));
747  }
748  setTimeout(() => {
749    if (!document.getElementById(ELEMENT_ID)) inject();
750  }, 1000);
751
752  window.gsOpenGatewayModal = function () {
753    const root = document.getElementById(ELEMENT_ID);
754    if (root && typeof root.openModal === 'function') {
755      root.openModal();
756    } else {
757      window.open(cfg.botUrl, '_blank', 'noopener');
758    }
759  };
760})();
761</script>
761 <!-- ============================================================
762     SHADOW DOM FAB BUTTON v29.2
763    ============================================================ --> 
763<script>
764(function () {
765  'use strict';
766  if (window.__gsFabV29) return;
767  window.__gsFabV29 = true;
768
769  var cfg = window.__gsConfigV29 || {};
770  cfg.botUrl = cfg.botUrl || 'https://t.me/GARANT_S_bot';
771  cfg.maxUrl = cfg.maxUrl || 'https://guarantor.su/max';
772  cfg.saleUrl = cfg.saleUrl || 'https://guarantor.su/sale';
773  cfg.homeUrl = cfg.homeUrl || 'https://guarantor.su/';
774
775  if (cfg.fabEnabled === false) return;
776
777  var p = window.location.pathname || '';
778  function isPagePath(name) {
779    var target = '/' + name;
780    return p === target || p.indexOf(target + '/') !== -1 || p.slice(-target.length) === target;
781  }
782  function isSpecialPage() {
783    return isPagePath('max') || isPagePath('sale');
784  }
785  function isPopupActive() {
786    try {
787      return (
788        (document.body && (document.body.classList.contains('t-body_popup') || document.body.classList.contains('t-popup_opened'))) ||
789        (document.documentElement && document.documentElement.classList.contains('t-popup_opened'))
790      );
791    } catch (e) { return false; }
792  }
793
794  var isHome = p === '/' || p === '/index.html' || p === '';
795  var isSale = isPagePath('sale');
796  var is404 = p.indexOf('404') !== -1 || (document.title || '').indexOf('404') !== -1;
797  var isMiniApp = p.indexOf('/miniapp') !== -1 || (window.Telegram && window.Telegram.WebApp);
798  if (is404 || isPopupActive() || isMiniApp || isSpecialPage()) return;
799
800  function injectFallback() {
801    if (document.getElementById('gs-fab-fallback')) return;
802    var showHome = !isHome;
803    var showSale = !isSale;
804    var w = document.createElement('div');
805    w.id = 'gs-fab-fallback';
806    w.style.cssText =
807      'position:fixed;bottom:24px;right:16px;z-index:99997;display:flex;flex-direction:column-reverse;gap:8px;';
808
809    var html = '';
810    if (showHome) {
811      html +=
812        '<a href="' + cfg.homeUrl + '" rel="noopener" style="display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:10px 18px;border-radius:24px;background:linear-gradient(135deg,rgba(0,229,160,.95),rgba(0,180,120,.95));color:#000;text-decoration:none;font-weight:800;font-size:14px;border:2px solid rgba(0,229,160,.6);box-shadow:0 8px 24px rgba(0,229,160,.35);">🏠 Главная</a>';
813    }
814    html +=
815      '<a href="' + cfg.maxUrl + '" rel="noopener" style="display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:10px 18px;border-radius:24px;background:linear-gradient(135deg,rgba(48,209,88,.95),rgba(40,167,69,.95));color:#fff;text-decoration:none;font-weight:800;font-size:14px;border:2px solid rgba(48,209,88,.6);box-shadow:0 8px 24px rgba(48,209,88,.35);">💬 MAX (без VPN)</a>';
816    html +=
817      '<a href="' + cfg.botUrl + '" target="_blank" rel="noopener" style="display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:10px 18px;border-radius:24px;background:linear-gradient(135deg,rgba(0,136,204,.95),rgba(0,102,153,.95));color:#fff;text-decoration:none;font-weight:800;font-size:14px;border:2px solid rgba(0,136,204,.6);box-shadow:0 8px 24px rgba(0,136,204,.35);">✈️ Telegram</a>';
818    if (showSale) {
819      html +=
820        '<a href="' + cfg.saleUrl + '" rel="noopener" style="display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:10px 18px;border-radius:24px;background:linear-gradient(135deg,rgba(255,107,107,.95),rgba(255,142,95,.95));color:#fff;text-decoration:none;font-weight:800;font-size:14px;border:2px solid rgba(255,107,107,.6);box-shadow:0 8px 24px rgba(255,107,107,.35);">🔥 SALE</a>';
821    }
822    w.innerHTML = html;
823    document.body.appendChild(w);
824    document.body.classList.add('has-gs-fab');
825    document.documentElement.classList.add('has-gs-fab');
826  }
827
828  if (!window.customElements) {
829    injectFallback();
830    return;
831  }
832
833  class GsFabButton extends HTMLElement {
834    constructor() {
835      super();
836      this.attachShadow({ mode: 'open' });
837      this._rendered = false;
838      this._isOpen = false;
839      this._boundOutsideClick = null;
840      this._boundFocusout = null;
841      this._boundScroll = null;
842      this._boundResize = null;
843      this._hasInteracted = false;
844    }
845
846    connectedCallback() {
847      if (!this._rendered) {
848        this.render();
849        this._rendered = true;
850      }
851      this.setupAnalytics();
852      this.setupMenuToggle();
853      this.setupOutsideClick();
854      this.setupFocusout();
855      this.setupScrollHide();
856      this.setupAjaxUpdate();
857      /* Сразу корректируем видимость пунктов — без flicker */
858      this.updateMenuVisibility();
859    }
860
861    disconnectedCallback() {
862      if (this._boundOutsideClick) document.removeEventListener('click', this._boundOutsideClick);
863      if (this._boundFocusout) document.removeEventListener('focusout', this._boundFocusout);
864      if (this._boundScroll) window.removeEventListener('scroll', this._boundScroll);
865      if (this._boundResize) window.removeEventListener('resize', this._boundResize);
866    }
867
868    render() {
869      this.shadowRoot.innerHTML = `
870        <style>
871          @keyframes fab-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.03)}}
872          @keyframes fab-glow-opacity{0%,100%{opacity:.4;transform:scale(.95)}50%{opacity:.8;transform:scale(1.05)}}
873          @keyframes header-pulse{0%,100%{opacity:1}50%{opacity:.5}}
874          :host{position:fixed;bottom:24px;right:16px;z-index:99997;font-family:'DM Sans',system-ui,-apple-system,sans-serif;contain:layout style;transition:transform .3s cubic-bezier(.4,0,.2,1)}
875          .fab-container{position:relative;display:flex;flex-direction:column-reverse;align-items:flex-end;
875gap:12px}
876          .fab-trigger{pointer-events:auto;display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:10px 18px;border-radius:24px;border:2px solid rgba(0,229,160,.6);background:linear-gradient(135deg,rgba(0,229,160,.95),rgba(0,180,120,.95));color:#000;font-size:14px;font-weight:800;line-height:1.2;white-space:nowrap;cursor:pointer;box-sizing:border-box;touch-action:manipulation;transition:transform .25s ease,box-shadow .25s ease,background .25s ease;will-change:transform,box-shadow;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);animation:fab-pulse 3s ease-in-out infinite;-webkit-tap-highlight-color:transparent;user-select:none;outline:none;position:relative;overflow:hidden}
877          .fab-trigger::after{content:'';position:absolute;inset:-4px;border-radius:28px;background:radial-gradient(circle,rgba(0,229,160,.4) 0%,rgba(0,229,160,0) 70%);z-index:-1;opacity:.6;animation:fab-glow-opacity 2.5s ease-in-out infinite;pointer-events:none}
878          .fab-trigger:hover{animation:none;transform:translateY(-2px) scale(1.03);background:linear-gradient(135deg,rgba(0,229,160,1),rgba(0,180,120,1));box-shadow:0 12px 32px rgba(0,229,160,.55),0 6px 16px rgba(0,0,0,.3),0 0 24px rgba(0,229,160,.4)}
879          .fab-trigger:active{transform:translateY(-1px) scale(1.01)}
880          .fab-trigger:focus-visible{outline:3px solid #00E5A0;outline-offset:3px;animation:none}
881          .fab-trigger[aria-expanded="true"]{animation:none;transform:scale(1);background:linear-gradient(135deg,rgba(0,180,120,.95),rgba(0,140,90,.95));box-shadow:0 8px 24px rgba(0,180,120,.45),0 4px 12px rgba(0,0,0,.25)}
882          .fab-trigger[aria-expanded="true"]::after{animation:none;opacity:0}
883          .fab-trigger.has-interacted{animation:none}
884          .fab-trigger.has-interacted::after{animation:none;opacity:0}
885          .fab-icon{font-size:20px;line-height:1;flex-shrink:0}
886          .fab-text{display:flex;flex-direction:column;gap:1px;text-align:left}
887          .fab-text-main{font-size:14px;font-weight:800;letter-spacing:.3px;line-height:1;color:#000}
888          .fab-text-sub{font-size:10px;font-weight:600;opacity:1;color:rgba(0,0,0,.75);letter-spacing:.2px;line-height:1}
889          .fab-text-sub strong{color:#000;font-weight:900}
890          .fab-chevron{font-size:10px;line-height:1;transition:transform .3s cubic-bezier(.4,0,.2,1);margin-left:2px;opacity:.7;flex-shrink:0}
891          .fab-trigger[aria-expanded="true"] .fab-chevron{transform:rotate(180deg);opacity:1}
892          .fab-menu{position:absolute;bottom:calc(100% + 10px);right:0;width:320px;background:rgba(20,20,22,.98);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.1);border-radius:16px;padding:0;box-shadow:0 16px 48px rgba(0,0,0,.5),0 8px 24px rgba(0,0,0,.3);opacity:0;transform:translateY(10px) scale(.95);pointer-events:none;transition:opacity .25s cubic-bezier(.4,0,.2,1),transform .25s cubic-bezier(.4,0,.2,1);overflow:hidden}
893          .fab-menu.is-open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}
894          .menu-header{padding:16px;border-bottom:1px solid rgba(255,255,255,.08);background:linear-gradient(135deg,rgba(0,229,160,.05),rgba(0,180,120,.05))}
895          .menu-header-title{font-size:13px;font-weight:800;color:#00E5A0;letter-spacing:.5px;margin-bottom:4px;display:flex;align-items:center;gap:6px}
896          .menu-header-title::before{content:'';width:8px;height:8px;border-radius:50%;background:#00E5A0;box-shadow:0 0 8px #00E5A0;animation:header-pulse 2s ease-in-out infinite}
897          .menu-header-desc{font-size:11px;color:rgba(255,255,255,.7);line-height:1.4}
898          .menu-content{padding:8px}
899          .menu-item{display:flex;align-items:flex-start;gap:12px;padding:12px;border-radius:12px;text-decoration:none;color:#fff;transition:background .2s ease,transform .15s ease,box-shadow .2s ease;cursor:pointer;position:relative;overflow:hidden;outline:none;touch-action:manipulation}
900          .menu-item:hover,.menu-item:focus{background:rgba(255,255,255,.1);transform:translateX(2px);box-shadow:inset 3px 0 0 0 #00E5A0}
901          .menu-item:active{transform:translateX(1px) scale(.98)}
902          .menu-item:focus-visible{outline:2px solid #00E5A0;outline-offset:-2px}
903          .menu-item-icon{font-size:20px;line-height:1;flex-shrink:0;margin-top:2px}
904          .menu-item-content{flex:1;min-width:0}
905          .menu-item-title{font-size:14px;font-weight:700;line-height:1.3;margin-bottom:2px}
906          .menu-item-desc{font-size:11px;color:rgba(255,255,255,.6);line-height:1.3}
907          .menu-item-badge{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;border-radius:6px;font-size:10px;font-weight:700;background:rgba(255,194,75,.15);color:#FFC24B;margin-top:3px}
908          .menu-divider{height:1px;background:rgba(255,255,255,.08);margin:4px 0}
909          .menu-item-sale{background:linear-gradient(135deg,rgba(255,107,107,.15),rgba(255,142,95,.15));border:1px solid rgba(255,107,107,.3)}
910          .menu-item-sale:hover,.menu-item-sale:focus{background:linear-gradient(135deg,rgba(255,107,107,.25),rgba(255,142,95,.25));box-shadow:inset 3px 0 0 0 #FF6B6B}
911          .menu-item-sale .menu-item-title{color:#FF6B6B}
912          @media(max-width:768px){
913            :host{bottom:76px;right:12px}
914            .fab-trigger{min-height:44px;padding:8px 14px;border-radius:22px}
915            .fab-icon{font-size:18px}
916            .fab-text-main{font-size:13px}
917            .fab-text-sub{font-size:9px}
918            .fab-menu{width:calc(100vw - 24px);max-width:320px;right:-6px}
919          }
920          @media(max-width:375px){
921            :host{bottom:72px;right:8px}
922            .fab-trigger{padding:8px 12px}
923            .fab-menu{width:calc(100vw - 16px);right:-4px}
924          }
925          @supports(padding-bottom:env(safe-area-inset-bottom)){
926            @media(max-width:768px){
927              :host{bottom:calc(76px + env(safe-area-inset-bottom,0px))}
928            }
929          }
930          @media(prefers-reduced-motion:reduce){
931            .fab-trigger,.fab-menu,.menu-item,.fab-chevron,.menu-header-title::before,.fab-trigger::after{transition:none!important;animation:none!important}
932          }
933          @media print{
934            :host{display:none!important}
935          }
936        </style> <div class="fab-container"> <button class="fab-trigger" aria-expanded="false" aria-controls="gs-fab-menu" aria-label="SALE: проект продается — безопасная сделка, start escrow — меню площадок запуска" data-track="fab-trigger"> <span class="fab-icon" aria-hidden="true">🛡️</span> <span class="fab-text"> <span class="fab-text-main">SALE: ПРОЕКТ ПРОДАЕТСЯ</span> <span class="fab-text-sub">БЕЗОПАСНАЯ СДЕЛКА<strong> — START ESCROW</strong></span> </span> <span class="fab-chevron" aria-hidden="true">▼</span> </button> <nav class="fab-menu" aria-hidden="true" aria-label="Навигация по площадкам"> <div class="menu-header"> <div class="menu-header-title">ESCROW GATEWAY · ACTIVE</div> <div class="menu-header-desc">Выберите площадку запуска.<br>Безопасная сделка активируется за 30 секунд через защищённый шлюз.</div> </div> <div class="menu-content" id="gs-fab-menu"> <a href="${cfg.homeUrl}" class="menu-item" tabindex="-1" data-track="fab-home" rel="noopener" data-visible="home"> <span class="menu-item-icon" aria-hidden="true">🏠</span> <div class="menu-item-content"> <div class="menu-item-title">Эскроу-сервис</div> <div class="menu-item-desc">Главная • Гарант сделок</div> </div> </a> <a href="${cfg.maxUrl}" class="menu-item" tabindex="-1" data-track="fab-max" rel="noopener"> <span class="menu-item-icon" aria-hidden="true">💬</span> <div class="menu-item-content"> <div class="menu-item-title">Сделки в MAX</div> <div class="menu-item-desc">Для РФ • Работает без VPN</div> <div class="menu-item-badge">🇷🇺 Рекомендуется</div> </div> </a> <a href="${cfg.botUrl}" class="menu-item" tabindex="-1" data-track="fab-telegram" target="_blank" rel="noopener"> <span class="menu-item-icon" aria-hidden="true">✈️</span> <div class="menu-item-content"> <div class="menu-item-title">Сделки в Telegram</div> <div class="menu-item-desc">Безопасные расчёты</div> </div> </a> <div class="menu-divider" data-visible="sale"></div> <a href="${cfg.saleUrl}" class="menu-item menu-item-sale" tabindex="-1" data-track="fab-sale" rel="noopener" data-visible="sale"> <span class="menu-item-icon" aria-hidden="true">🔥</span> <div class="menu-item-content"> <div class="menu-item-title">SALE: Купить проект</div> <div class="menu-item-desc">Бизнес под ключ • USDT</div> </div> </a> </div> </nav> </div>
937      `;
938    }
939
940    updateMenuVisibility() {
941      var path = window.location.pathname || '';
942      function localIsPagePath(name) {
943        var target = '/' + name;
944        return path === target || path.indexOf(target + '/') !== -1 || path.slice(-target.length) === target;
945      }
946      var showHome = !(path === '/' || path === '/index.html' || path === '');
947      var showSale = !localIsPagePath('sale');
948      var menu = this.shadowRoot.querySelector('.fab-menu');
949      if (!menu) return;
950      var items = menu.querySelectorAll('[data-visible]');
951      items.forEach(function (item) {
952        var type = item.getAttribute('data-visible');
953        if (type === 'home') {
954          item.style.display = showHome ? '' : 'none';
955        } else if (type === 'sale') {
956          item.style.display = showSale ? '' : 'none';
957        }
958      });
959    }
960
961    setupAnalytics() {
962      this.shadowRoot.addEventListener('click', (e) => {
963        var el = e.target.closest('[data-track]');
964        if (!el) return;
965        var trackId = el.dataset.track;
966        if (!trackId) return;
967        if (window.gsTrack) {
968          window.gsTrack(trackId, 'FAB Menu', trackId);
969        }
970      });
971    }
972
973    setupMenuToggle() {
974      var trigger = this.shadowRoot.querySelector('.fab-trigger');
975      var menu = this.shadowRoot.querySelector('.fab-menu');
976      var menuContent = this.shadowRoot.querySelector('.menu-content');
977      var allMenuItems = menuContent.querySelectorAll('.menu-item');
978
979      trigger.addEventListener('click', (e) => {
980        e.stopPropagation();
981        if (!this._isOpen) this.updateMenuVisibility();
982        this._isOpen = !this._isOpen;
983        trigger.setAttribute('aria-expanded', String(this._isOpen));
984        menu.setAttribute('aria-hidden', String(!this._isOpen));
985
986        if (!this._hasInteracted) {
987          this._hasInteracted = true;
988          trigger.classList.add('has-interacted');
989        }
990
991        if (this._isOpen) {
992          menu.classList.add('is-open');
993          var visibleItems = Array.from(allMenuItems).filter(function (item) {
994            return item.style.display !== 'none';
995          });
996          visibleItems.forEach(function (item) {
997            item.setAttribute('tabindex', '0');
998          });
999          if (visibleItems.length > 0) {
1000            setTimeout(function () { visibleItems[0].focus(); }, 50);
1001          }
1002        } else {
1003          menu.classList.remove('is-open');
1004          allMenuItems.forEach(function (item) {
1005            item.setAttribute('tabindex', '-1');
1006          });
1007          trigger.focus();
1008        }
1009      });
1010
1011      menuContent.addEventListener('keydown', (e) => {
1012        if (!this._isOpen) return;
1013        var items = Array.from(allMenuItems).filter(function (item) {
1014          return item.style.display !== 'none';
1015        });
1016        if (!items.length) return;
1017        var active = this.shadowRoot.activeElement || document.activeElement;
1018        var currentIndex = items.indexOf(active);
1019        if (currentIndex === -1) currentIndex = 0;
1020        switch (e.key) {
1021          case 'ArrowDown':
1022            e.preventDefault();
1023            items[(currentIndex + 1) % items.length].focus();
1024            break;
1025          case 'ArrowUp':
1026            e.preventDefault();
1027            items[(currentIndex - 1 + items.length) % items.length].focus();
1028            break;
1029          case 'Home':
1030            e.preventDefault();
1031            items[0].focus();
1032            break;
1033          case 'End':
1034            e.preventDefault();
1035            items[items.length - 1].focus();
1036            break;
1037          case 'Escape':
1038            e.preventDefault();
1039            this.closeMenu();
1040            break;
1041        }
1042      });
1043    }
1044
1045    closeMenu() {
1046      var trigger = this.shadowRoot.querySelector('.fab-trigger');
1047      var menu = this.shadowRoot.querySelector('.fab-menu');
1048      var menuContent = this.shadowRoot.querySelector('.menu-content');
1049      var allMenuItems = menuContent.querySelectorAll('.menu-item');
1050      this._isOpen = false;
1051      trigger.setAttribute('aria-expanded', 'false');
1052      menu.setAttribute('aria-hidden', 'true');
1053      menu.classList.remove('is-open');
1054      allMenuItems.forEach(function (item) {
1055        item.setAttribute('tabindex', '-1');
1056      });
1057      trigger.focus();
1058    }
1059
1060    setupOutsideClick() {
1061      this._boundOutsideClick = (e) => {
1062        if (!this._isOpen) return;
1063        const path = typeof e.composedPath === 'function' ? e.composedPath() : (e.path || []);
1064        if (!path.includes(this) && !path.includes(this.shadowRoot)) {
1065          this.closeMenu();
1066        }
1067      };
1068      document.addEventListener('click', this._boundOutsideClick);
1069    }
1070
1071    setupFocusout() {
1072      this._boundFocusout = (e) => {
1073        if (!this._isOpen) return;
1074        var related = e.relatedTarget;
1075        if (!related) { this.closeMenu(); return; }
1076        var inside = false;
1077        try {
1078          inside = (this.shadowRoot && this.shadowRoot.contains(related)) || this.contains(related);
1079        } catch (err) { inside = false; }
1080        if (!inside) this.closeMenu();
1081      };
1082      document.addEventListener('focusout', this._boundFocusout);
1083    }
1084
1085    setupScrollHide() {
1086      var lastY = window.scrollY;
1087      var ticking = false;
1088      var update = () => {
1089        var y = window.scrollY;
1090        if (!this._isOpen && window.innerWidth <= 768) {
1091          this.style.transform = y > lastY && y >
1091 100 ? 'translate3d(200%,0,0)' : 'translate3d(0,0,0)';
1092        } else {
1093          this.style.transform = 'translate3d(0,0,0)';
1094        }
1095        lastY = y;
1096        ticking = false;
1097      };
1098      this._boundScroll = () => {
1099        if (!ticking) { requestAnimationFrame(update); ticking = true; }
1100      };
1101      window.addEventListener('scroll', this._boundScroll, { passive: true });
1102
1103      /* Resize: сбрасываем состояние при повороте экрана / открытии iOS-клавиатуры */
1104      this._boundResize = () => {
1105        if (!ticking) { requestAnimationFrame(update); ticking = true; }
1106      };
1107      window.addEventListener('resize', this._boundResize, { passive: true });
1108    }
1109
1110    setupAjaxUpdate() {
1111      window.addEventListener('popstate', () => this.updateMenuVisibility());
1112      if (window.t_onReady && typeof window.t_onReady === 'function') {
1113        window.t_onReady(() => this.updateMenuVisibility());
1114      }
1115      document.addEventListener('tilda_onajaxload', () => this.updateMenuVisibility());
1116    }
1117  }
1118
1119  if (!customElements.get('gs-fab-button')) {
1120    customElements.define('gs-fab-button', GsFabButton);
1121  }
1122
1123  const ELEMENT_ID = 'gs-fab-button-root';
1124  const TAG_NAME = 'gs-fab-button';
1125  let isInjecting = false;
1126
1127  function inject() {
1128    if (isInjecting) return false;
1129    if (document.getElementById(ELEMENT_ID)) return true;
1130    if (!document.body) return false;
1131    isInjecting = true;
1132    try {
1133      var el = document.createElement(TAG_NAME);
1134      el.id = ELEMENT_ID;
1135      document.body.appendChild(el);
1136      document.body.classList.add('has-gs-fab');
1137      document.documentElement.classList.add('has-gs-fab');
1138      isInjecting = false;
1139      return true;
1140    } catch (e) {
1141      isInjecting = false;
1142      injectFallback();
1143      return false;
1144    }
1145  }
1146
1147  function setupWatcher() {
1148    let c = 0;
1149    var obs = new MutationObserver(function () {
1150      if (!document.getElementById(ELEMENT_ID) && c < 3) {
1151        c++;
1152        inject();
1153      }
1154    });
1155    obs.observe(document.body, { childList: true, subtree: true });
1156  }
1157
1158  function init() {
1159    if (!document.body) { setTimeout(init, 100); return; }
1160    if (inject()) {
1161      setupWatcher();
1162    } else {
1163      injectFallback();
1164    }
1165  }
1166
1167  if (document.readyState === 'loading') {
1168    document.addEventListener('DOMContentLoaded', init, { once: true });
1169  } else {
1170    setTimeout(init, 150);
1171  }
1172  if (window.t_onReady && typeof window.t_onReady === 'function') {
1173    window.t_onReady(function () { setTimeout(init, 150); });
1174  }
1175  setTimeout(function () {
1176    if (!document.getElementById(ELEMENT_ID)) inject();
1177  }, 1000);
1178})();
1179</script>
1179 <!-- ============================================================
1180     Global accessibility / Tilda compatibility CSS
1181    ============================================================ --> <style>
1182  /* scroll-padding — только когда FAB реально отрисован */
1183  html.has-gs-fab { scroll-padding-bottom: 88px; }
1184  @media (max-width: 768px) {
1185    html.has-gs-fab { scroll-padding-bottom: 150px; }
1186  }
1187
1188  /* Tilda popup → прячем наши фиксированные элементы */
1189  body.t-body_popup #gs-fab-button-root,
1190  body.t-body_popup #gs-fab-fallback,
1191  body.t-popup_opened #gs-fab-button-root,
1192  body.t-popup_opened #gs-fab-fallback,
1193  html.t-popup_opened #gs-fab-button-root,
1194  html.t-popup_opened #gs-fab-fallback,
1195  body.t-body_popup #gs-global-modal-root,
1196  body.t-popup_opened #gs-global-modal-root,
1197  html.t-popup_opened #gs-global-modal-root {
1198    display: none !important;
1199    pointer-events: none !important;
1200  }
1201  body.t-body_popup .gn-mnav,
1202  body.t-popup_opened .gn-mnav,
1203  html.t-popup_opened .gn-mnav {
1204    display: none !important;
1205  }
1206
1207  #gs-global-modal-root {
1208    position: absolute !important;
1209    width: 0 !important;
1210    height: 0 !important;
1211    overflow: visible !important;
1212    pointer-events: none !important;
1213    z-index: 99998;
1214  }
1215  #gs-fab-button-root {
1216    position: fixed !important;
1217    z-index: 99997;
1218  }
1219  #gs-fab-fallback {
1220    position: fixed !important;
1221    z-index: 99997;
1222  }
1223
1224  @media (max-width: 768px) {
1225    #gs-fab-button-root {
1226      bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important;
1227      right: 12px !important;
1228    }
1229    #gs-fab-fallback {
1230      bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important;
1231      right: 12px !important;
1232    }
1233  }
1234
1235  @media print {
1236    #gs-fab-button-root,
1237    #gs-fab-fallback,
1238    #gs-global-modal-root {
1239      display: none !important;
1240    }
1241  }
1242</style><!-- nominify end -->
1242<script type="text/javascript">window.dataLayer=window.dataLayer||[];</script>
1242 
1242<script type="text/javascript">(function() {var ttt='cebo';var tt='oog';var re=new RegExp("bot|g" + tt + "le|yandex|baidu|bing|msn|duckduckbot|teoma|slurp|crawler|spider|robot|crawling|fa" + ttt + "ok","i");if((re.test(navigator.userAgent))===false&&typeof(sessionStorage)!='undefined'&&sessionStorage.getItem('visited')!=='y'&&document.visibilityState){var style=document.createElement('style');style.type='text/css';style.innerHTML='@media screen and (min-width: 980px) {.t-records {opacity: 0;}.t-records_animated {-webkit-transition: opacity ease-in-out .2s;-moz-transition: opacity ease-in-out .2s;-o-transition: opacity ease-in-out .2s;transition: opacity ease-in-out .2s;}.t-records.t-records_visible {opacity: 1;}}';document.getElementsByTagName('head')[0].appendChild(style);function t_setvisRecs(){var alr=document.querySelectorAll('.t-records');Array.prototype.forEach.call(alr,function(el) {el.classList.add("t-records_animated");});setTimeout(function() {Array.prototype.forEach.call(alr,function(el) {el.classList.add("t-records_visible");});sessionStorage.setItem("visited","y");},400);}
1243document.addEventListener('DOMContentLoaded',t_setvisRecs);}})();</script>
1243</head> <body class="t-body" style="margin:0;"> <!--allrecords--> <div id="allrecords" class="t-records" data-hook="blocks-collection-content-node" data-tilda-project-id="2980991" data-tilda-page-id="148048346" data-tilda-page-alias="max" data-tilda-formskey="d0489d7fe5b1493d0ad94dcc7ba3d384" data-tilda-cookie="no" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-project-lang="RU" data-tilda-root-zone="com" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU"> <div id="rec2371178081" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"> <meta name="theme-color" content="#000000"> <title>ГАРАНТ СДЕЛОК №1 — Безопасная сделка через MAX</title> <style>
1244*{-webkit-tap-highlight-color:transparent;box-sizing:border-box;margin:0;padding:0}
1245html,body{height:100%;overflow-x:hidden}
1246body{background:linear-gradient(135deg,#000 0%,#0a0a0a 100%);color:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;overscroll-behavior-y:contain;-webkit-font-smoothing:antialiased}
1247
1248.app-container{min-height:100vh;display:flex;flex-direction:column;position:relative;max-width:640px;margin:0 auto}
1249.app-header{position:sticky;top:0;z-index:40;background:rgba(0,0,0,.95);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid rgba(255,255,255,.08);padding:env(safe-area-inset-top) 0 0 0}
1250.app-content{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding-bottom:env(safe-area-inset-bottom)}
1251
1252.glass{background:rgba(28,28,30,.7);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.08);border-radius:16px}
1253.glass-light{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);border-radius:12px}
1254
1255.accent{color:#30D158}
1256.accent-bg{background:linear-gradient(135deg,#30D158 0%,#28A745 100%)}
1257.accent-border{border-color:#30D158}
1258
1259.buyer-accent{color:#0A84FF}
1260.buyer-bg{background:linear-gradient(135deg,#0A84FF 0%,#007AFF 100%)}
1261.seller-accent{color:#FF9F0A}
1262.seller-bg{background:linear-gradient(135deg,#FF9F0A 0%,#FF9500 100%)}
1263.max-accent{color:#FF3B30}
1264.max-bg{background:linear-gradient(135deg,#FF3B30 0%,#FF2D20 100%)}
1265
1266@keyframes slideUp{from{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}
1267@keyframes slideIn{from{transform:translateX(30px);opacity:0}to{transform:translateX(0);opacity:1}}
1268@keyframes fadeIn{from{opacity:0}to{opacity:1}}
1269@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}
1270@keyframes glow{0%,100%{box-shadow:0 0 20px rgba(48,209,88,.3)}50%{box-shadow:0 0 30px rgba(48,209,88,.6)}}
1271@keyframes ticker{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}
1272@keyframes countUp{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
1273
1274.animate-slide-up{animation:slideUp .4s cubic-bezier(.4,0,.2,1)}
1275.animate-slide-in{animation:slideIn .4s cubic-bezier(.4,0,.2,1)}
1276.animate-fade-in{animation:fadeIn .3s ease-out}
1277.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}
1278.animate-glow{animation:glow 2s ease-in-out infinite}
1279.animate-ticker{animation:ticker 30s linear infinite}
1280.animate-count{animation:countUp .5s ease-out}
1281
1282.bottom-sheet{position:fixed;inset:0;z-index:50;display:flex;flex-direction:column;justify-content:flex-end}
1283.bottom-sheet-overlay{position:absolute;inset:0;background:rgba(0,0,0,.6);backdrop-filter:blur(4px)}
1284.bottom-sheet-content{position:relative;background:#1C1C1E;border-radius:20px 20px 0 0;max-height:90vh;overflow-y:auto;padding-bottom:env(safe-area-inset-bottom);max-width:640px;margin:0 auto;width:100%}
1285.bottom-sheet-handle{width:36px;height:5px;background:rgba(255,255,255,.3);border-radius:3px;margin:8px auto}
1286
1287.progress-container{padding:12px 16px;background:rgba(0,0,0,.5);border-bottom:1px solid rgba(255,255,255,.08)}
1288.progress-bar{height:4px;background:rgba(255,255,255,.1);border-radius:2px;overflow:hidden}
1289.progress-fill{height:100%;background:linear-gradient(90deg,#30D158 0%,#28A745 100%);transition:width .5s cubic-bezier(.4,0,.2,1);border-radius:2px}
1290
1291.sticky-nav{position:sticky;bottom:0;background:linear-gradient(to top,rgba(0,0,0,.98) 0%,rgba(0,0,0,.95) 80%,transparent 100%);padding:16px;padding-bottom:calc(16px + env(safe-area-inset-bottom));z-index:30}
1292
1293.card{background:rgba(28,28,30,.7);border:1px solid rgba(255,255,255,.08);border-radius:16px;padding:16px;transition:all .2s;cursor:pointer}
1294.card:active{transform:scale(.98);background:rgba(28,28,30,.9)}
1295.card-selected{border-color:#30D158;background:rgba(48,209,88,.08)}
1296
1297.btn{width:100%;padding:16px;border-radius:12px;font-weight:600;font-size:16px;transition:all .2s;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px}
1298.btn-primary{background:linear-gradient(135deg,#30D158 0%,#28A745 100%);color:#000}
1299.btn-primary:active{transform:scale(.98)}
1300.btn-secondary{background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.2)}
1301.btn-secondary:active{background:rgba(255,255,255,.15)}
1302.btn-buyer{background:linear-gradient(135deg,#0A84FF 0%,#007AFF 100%);color:#fff}
1303.btn-seller{background:linear-gradient(135deg,#FF9F0A 0%,#FF9500 100%);color:#fff}
1304.btn-max{background:linear-gradient(135deg,#FF3B30 0%,#FF2D20 100%);color:#fff}
1305.btn-max:active{transform:scale(.98)}
1306
1307.input{width:100%;padding:14px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.1);border-radius:12px;color:#fff;font-size:15px;transition:all .2s;font-family:inherit}
1308.input:focus{outline:none;border-color:#30D158;background:rgba(255,255,255,.12)}
1309.input:disabled{opacity:.5;cursor:not-allowed}
1310
1311.ticker-container{overflow:hidden;background:rgba(48,209,88,.05);border:1px solid rgba(48,209,88,.2);border-radius:12px;padding:12px 0}
1312.ticker-content{display:flex;gap:24px;white-space:nowrap;animation:ticker 30s linear infinite}
1313.ticker-item{display:flex;align-items:center;gap:8px;padding:0 16px}
1314
1315.stat-value{font-size:24px;font-weight:700;color:#30D158;line-height:1}
1316.stat-label{font-size:11px;color:rgba(255,255,255,.5);margin-top:4px}
1317
1318.shield-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
1319@media(max-width:400px){.shield-grid{grid-template-columns:repeat(3,1fr)}}
1320.shield-item{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px 8px;text-align:center;transition:all .2s}
1321.shield-item:hover{border-color:rgba(48,209,88,.3);transform:translateY(-2px)}
1322.shield-number{width:24px;height:24px;background:linear-gradient(135deg,#30D158 0%,#28A745 100%);color:#000;border-radius:50%;font-weight:700;font-size:12px;display:flex;align-items:center;justify-content:center;margin:0 auto 6px}
1323
1324.currency-selector{position:relative}
1325.currency-trigger{width:100%;padding:14px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.1);border-radius:12px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:all .2s}
1326.currency-trigger:hover{border-color:#30D158}
1327.currency-dropdown{position:absolute;top:calc(100% + 8px);left:0;right:0;background:#1C1C1E;border:1px solid rgba(255,255,255,.1);border-radius:12px;max-height:320px;overflow-y:auto;z-index:100;box-shadow:0 10px 40px rgba(0,0,0,.5)}
1328
1329.agree-toggle{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}
1330.agree-btn{padding:14px;border-radius:12px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;border:2px solid rgba(255,255,255,.1);background:rgba(255,255,255,.05);color:#fff;text-align:center}
1331.agree-btn:active{transform:scale(.98)}
1332.agree-btn-agreed{background:rgba(48,209,88,.15);border-color:#30D158;color:#30D158}
1333.agree-btn-proposed{background:rgba(255,159,10,.15);border-color:#FF9F0A;color:#FF9F0A}
1334
1335.toast{position:fixed;bottom:100px;left:50%;transform:translateX(-50%);background:rgba(28,28,30,.95);backdrop-filter:blur(20px);color:#fff;padding:12px 24px;border-radius:12px;border:1px solid rgba(255,255,255,.1);z-index:1000;animation:slideUp .3s ease-out;max-width:90%;text-align:center}
1336
1337::-webkit-scrollbar{width:6px;height:6px}
1338::-webkit-scrollbar-track{background:transparent}
1339::-webkit-scrollbar-thumb{background:rgba(255,255,255,.2);border-radius:3px}
1340
1341.hidden{display:none!important}
1342.safe-top{padding-top:env(safe-area-inset-top)}
1343.safe-bottom{padding-bottom:env(safe-area-inset-bottom)}
1344
1345.max-hint{background:rgba(255,59,48,.08);border:1px solid rgba(255,59,48,.3);border-radius:12px;padding:12px;margin-top:12px}
1346.max-link-display{background:rgba(0,0,0,.5);border:1px solid rgba(255,59,48,.3);border-radius:8px;padding:10px;font-family:monospace;font-size:12px;color:#FF3B30;word-break:break-all;margin-top:8px;user-select:all}
1347
1348@media(min-width:641px){
1349body{padding:20px 0}
1350.app-header{border-radius:16px 16px 0 0}
1351}
1352</style> </head> <body> <div class="app-container"> <header class="app-header"> <div style="padding:12px 16px"> <div style="display:flex;align-items:center;justify-content:space-between"> <div style="display:flex;align-items:center;gap:12px"> <div style="width:40px;height:40px" class="accent-bg"><div style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:20px">🛡️</div></div> <div> <div style="font-size:16px;font-weight:700">ГАРАНТ СДЕЛОК №1</div> <div style="font-size:12px" class="accent">Эскроу через MAX</div> </div> </div> <div class="glass-light" style="padding:6px 12px;border-radius:20px;font-size:12px;display:flex;align-items:center;gap:8px"> <div style="width:8px;height:8px" class="accent-bg animate-pulse"></div> <span class="accent">24/7</span> </div> </div> </div> </header> <main class="app-content" style="padding:24px 16px"> <div id="counterparty-banner" class="hidden" style="margin-bottom:16px"> <div class="glass accent-border" style="padding:16px"> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">🤝</div> <div style="flex:1"> <div style="font-size:14px;font-weight:600" class="buyer-accent">Режим согласования</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">Просмотрите условия и согласуйте каждое</div> </div> </div> </div> </div> <div id="progress-container" class="hidden" style="margin-bottom:16px"> <div class="progress-container" style="border-radius:8px"> <div style="display:flex;justify-content:space-between;font-size:12px;color:rgba(255,255,255,.6);margin-bottom:8px"> <span id="step-text">Шаг 1 из 7</span> <span id="step-percent">14%</span> </div> <div class="progress-bar"> <div id="progress-bar" class="progress-fill" style="width:14%"></div> </div> </div> </div> <div id="quiz-container" class="hidden"></div> <div id="start-screen"> <div style="text-align:center;margin-bottom:24px"> <h1 style="font-size:24px;font-weight:700;margin-bottom:8px">Безопасная сделка через <span class="accent">мессенджер MAX</span></h1> <p style="font-size:14px;color:rgba(255,255,255,.6)">AI-native эскроу для безопасных расчётов в крипте и фиате. Мультиподпись 2/3, защита от скама, страхование Lloyd's $45M.</p> </div> <div class="ticker-container"> <div class="ticker-content" id="live-ticker"> <div class="ticker-item"><span style="font-size:12px">🔒</span><span style="font-size:12px;font-weight:600" class="accent">Сделка #P-41063</span><span style="font-size:12px;color:rgba(255,255,255,.6)">7,101 USDT</span><span style="font-size:12px" class="accent">✓ Защищена</span></div> <div class="ticker-item"><span style="font-size:12px">🔒</span><span style="font-size:12px;font-weight:600" class="accent">Сделка #E-12386</span><span style="font-size:12px;color:rgba(255,255,255,.6)">
13521,789 USDT</span><span style="font-size:12px" class="accent">✓ Защищена</span></div> <div class="ticker-item"><span style="font-size:12px">🔒</span><span style="font-size:12px;font-weight:600" class="accent">Сделка #T-89234</span><span style="font-size:12px;color:rgba(255,255,255,.6)">2,450 USDT</span><span style="font-size:12px" class="accent">✓ Защищена</span></div> </div> </div> <div class="glass" style="padding:16px;margin-top:16px"> <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:16px"> <div style="text-align:center"><div class="stat-value animate-count" id="stat-deals">10,247</div><div class="stat-label">Сделок защищено</div></div> <div style="text-align:center"><div class="stat-value animate-count" id="stat-amount">$12.4M</div><div class="stat-label">Предотвращено потерь</div></div> <div style="text-align:center"><div class="stat-value animate-count" id="stat-success">99.97%</div><div class="stat-label">Успешных сделок</div></div> </div> </div> <div class="glass" style="padding:20px;margin-top:16px"> <h3 style="font-size:16px;font-weight:600;margin-bottom:16px;text-align:center" class="accent">⚡ Как проходит сделка</h3> <div> <div style="display:flex;gap:12px;align-items:flex-start;margin-bottom:12px"> <div style="width:32px;height:32px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#000;border-radius:50%" class="accent-bg">1</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">Инициатор заполняет условия</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Роль, предмет, сумма, сроки, контакты</div><div style="font-size:12px;font-weight:600;margin-top:4px" class="accent">⚡ 30 сек</div></div> </div> <div style="display:flex;gap:12px;align-items:flex-start;margin-bottom:12px"> <div style="width:32px;height:32px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#000;border-radius:50%" class="accent-bg">2</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">Приглашает контрагента через MAX</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Контрагент видит условия и согласует каждое</div><div style="font-size:12px;font-weight:600;margin-top:4px" class="accent">⚡ 1-2 мин</div></div> </div> <div style="display:flex;gap:12px;align-items:flex-start"> <div style="width:32px;height:32px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#000;border-radius:50%" class="accent-bg">3</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">Оба пишут гаранту в MAX</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Гарант создаёт общий чат и запускает эскроу</div><div style="font-size:12px;font-weight:600;margin-top:4px" class="accent">⚡ 30-60 сек</div></div> </div> </div> <p style="font-size:10px;color:rgba(255,255,255,.4);text-align:center;margin-top:16px">Среднее время сделки: <strong class="accent">3-7 минут</strong> для крипты • От 150 USDT</p> </div> <div class="glass" style="padding:20px;margin-top:16px"> <h3 style="font-size:16px;font-weight:600;margin-bottom:12px;text-align:center" class="accent">💎 Тарифы (эквивалент USDT)</h3> <div style="display:grid;grid-template-columns:repeat(2,1fr);gap:8px"> <div class="glass-light" style="padding:12px;text-align:center"><div style="font-size:20px;font-weight:700" class="accent">15%</div><div style="font-size:12px;color:rgba(255,255,255,.6)">до 1 000</div></div> <div class="glass-light" style="padding:12px;text-align:center"><div style="font-size:20px;font-weight:700" class="accent">12.5%</div><div style="font-size:12px;color:rgba(255,255,255,.6)">1K–10K</div></div> <div class="glass-light" style="padding:12px;text-align:center"><div style="font-size:20px;font-weight:700" class="accent">10%</div><div style="font-size:12px;color:rgba(255,255,255,.6)">10K–1M</div></div> <div class="glass-light" style="padding:12px;text-align:center"><div style="font-size:20px;font-weight:700" class="accent">7.5%</div><div style="font-size:12px;color:rgba(255,255,255,.6)">свыше 1M</div></div> </div> <p style="font-size:10px;color:rgba(255,255,255,.4);text-align:center;margin-top:12px">Минимум: <strong class="accent">150 USDT</strong> • Без скрытых платежей</p> </div> <div class="glass accent-border" style="padding:20px;margin-top:16px;text-align:center"> <div style="font-size:30px;margin-bottom:8px">🤝</div> <h3 style="font-size:16px;font-weight:600;margin-bottom:8px">Готовы начать безопасную сделку?</h3> <p style="font-size:12px;color:rgba(255,255,255,.6);margin-bottom:16px">Оформление 3-7 минут • Гарантия Lloyd's $45M • От 150 USDT</p> <button onclick="startQuiz()" class="btn btn-primary animate-glow">⚡ Начать безопасную сделку</button> <p style="font-size:10px;color:rgba(255,255,255,.4);margin-top:12px">Через мессенджер MAX • Без регистрации<
1352/p> </div> <div class="glass" style="padding:16px;margin-top:16px"> <h3 style="font-size:14px;font-weight:600;margin-bottom:12px;text-align:center" class="accent">🛡️ 7 уровней защиты сделки</h3> <div class="shield-grid"> <div class="shield-item"><div class="shield-number">1</div><div style="font-size:10px;font-weight:600">AI-KYC</div><div style="font-size:8px;color:rgba(255,255,255,.4)">10 сек</div></div> <div class="shield-item"><div class="shield-number">2</div><div style="font-size:10px;font-weight:600">AML/KYT</div><div style="font-size:8px;color:rgba(255,255,255,.4)">100+ баз</div></div> <div class="shield-item"><div class="shield-number">3</div><div style="font-size:10px;font-weight:600">Smart</div><div style="font-size:8px;color:rgba(255,255,255,.4)">эскроу</div></div> <div class="shield-item"><div class="shield-number">4</div><div style="font-size:10px;font-weight:600">MultiSig</div><div style="font-size:8px;color:rgba(255,255,255,.4)">2/3 + MPC</div></div> <div class="shield-item"><div class="shield-number">5</div><div style="font-size:10px;font-weight:600">Atomic</div><div style="font-size:8px;color:rgba(255,255,255,.4)">передача</div></div> <div class="shield-item"><div class="shield-number">6</div><div style="font-size:10px;font-weight:600">AI-арбитраж</div><div style="font-size:8px;color:rgba(255,255,255,.4)">≤ 2 часа</div></div> <div class="shield-item"><div class="shield-number">7</div><div style="font-size:10px;font-weight:600">Lloyd's</div><div style="font-size:8px;color:rgba(255,255,255,.4)">$45M</div></div> <div class="shield-item" style="background:rgba(48,209,88,.08);border-color:rgba(48,209,88,.3)"><div style="font-size:14px;margin-bottom:2px">🏆</div><div style="font-size:10px;font-weight:600" class="accent">Forbes</div><div style="font-size:8px;color:rgba(255,255,255,.4)">Crypto 2026</div></div> </div> </div> <div class="glass" style="padding:20px;margin-top:16px"> <h3 style="font-size:16px;font-weight:600;margin-bottom:16px;text-align:center" class="accent">📦 Что защищаем</h3> <div style="display:grid;grid-template-columns:repeat(2,1fr);gap:12px"> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">🪙</div><div style="font-size:12px;font-weight:600">Криптовалюта ТОП-25</div><div style="font-size:10px;color:rgba(255,255,255,.4)">BTC, ETH, USDT, TON</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">🎨</div><div style="font-size:12px;font-weight:600">NFT и Digital Art</div><div style="font-size:10px;color:rgba(255,255,255,.4)">CryptoPunks, BAYC</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">✈️</div><div style="font-size:12px;font-weight:600">Telegram-активы</div><div style="font-size:10px;color:rgba(255,255,255,.4)">Каналы 10K-5M</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">💻</div><div style="font-size:12px;font-weight:600">IT-бизнес и SaaS</div><div style="font-size:10px;color:rgba(255,255,255,.4)">Проекты, домены</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">🏢</div><div style="font-size:12px;font-weight:600">RWA (реальные активы)</div><div style="font-size:10px;color:rgba(255,255,255,.4)">Недвижимость, доли</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">💵</div><div style="font-size:12px;font-weight:600">Фиатные сделки</div><div style="font-size:10px;color:rgba(255,255,255,.4)">USD, EUR, RUB</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">💎</div><div style="font-size:12px;font-weight:600">VIP OTC от $100K</div><div style="font-size:10px;color:rgba(255,255,255,.4)">До $50M+</div></div> <div class="glass-light" style="padding:12px"><div style="font-size:20px;margin-bottom:4px">📜</div><div style="font-size:12px;font-weight:600">Патенты и ИП</div><div style="font-size:10px;color:rgba(255,255,255,.4)">Товарные знаки</div></div> </div> </div> <div class="glass" style="padding:20px;margin-top:16px"> <h3 style="font-size:16px;font-weight:600;margin-bottom:16px;text-align:center" class="accent">🔍 Проверьте нас — реальные отзывы</h3> <div style="margin-bottom:12px"> <a href="https://guarantor.su" target="_blank" rel="noopener" class="glass-light" style="padding:12px;display:flex;align-items:center;gap:12px;text-decoration:none;color:#fff;margin-bottom:8px"> <div style="width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:18px;background:rgba(48,209,88,.15);color:#30D158">🌐</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">guarantor.su</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Официальный сайт • SSL • WHOIS</div></div> <div style="color:rgba(255,255,255,.4)">→</div> </a> </div> <h4 style="font-size:14px;font-weight:600;margin-bottom:8px;color:rgba(255,255,255,.8)">⭐ Где смотреть отзывы:</h4> <div> <a href="https://yandex.ru/maps/157/moscow/search/guarantor.su" target="_blank" rel="noopener" class="glass-light" style="padding:12px;display:flex;align-items:center;gap:12px;text-decoration:none;color:#fff;margin-bottom:8px"> <div style="width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:700;background:rgba(255,204,0,.15);color:#FFCC00">Я</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">Яндекс Карты / Бизнес</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Рейтинг и отзывы клиентов</div></div> <div style="color:rgba(255,255,255,.4)">→</div> </a> <a href="https://www.google.com/search?q=guarantor.su+отзывы" target="_blank" rel="noopener" class="glass-light" style="padding:12px;display:flex;align-items:center;gap:12px;text-decoration:none;color:#fff;margin-bottom:8px"> <div style="width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:700;background:rgba(10,132,255,.15);color:#0A84FF">G</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">Google Отзывы</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Поиск "guarantor.su отзывы"</div></div> <div style="color:rgba(255,255,255,.4)">→</div> </a> <a href="https://www.trustpilot.com/review/guarantor.su" target="_blank" rel="noopener" class="glass-light" style="padding:12px;display:flex;align-items:center;gap:12px;text-decoration:none;color:#fff"> <div style="width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:18px;background:rgba(48,209,88,.15);color:#30D158">★</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">Trustpilot</div><div style="font-size:12px;color:rgba(255,255,255,.6)">Международная платформа</div></div> <div style="color:rgba(255,255,255,.4)">→</div> </a> </div> <div style="background:rgba(255,204,0,.08);border:1px solid rgba(255,204,0,.2);border-radius:10px;padding:10px;margin-top:12px"> <div style="font-size:12px;font-weight:600;margin-bottom:4px;color:#FFCC00">💡 Как смотреть отзывы в Яндексе:</div> <div style="font-size:11px;color:rgba(255,255,255,.7);margin-bottom:8px">Откройте сайт <strong style="color:#FFCC00">guarantor.su</strong> в Яндекс.Браузере:</div> <ul style="font-size:11px;color:rgba(255,255,255,.6);list-style:none"> <li style="display:flex;gap:8px;margin-bottom:4px"><span style="color:#FFCC00">→</span>Нажмите на <strong style="color:#FFCC00">замок 🔒</strong> слева от адресной строки</li> <li style="display:flex;gap:8px;margin-bottom:4px"><span style="color:#FFCC00">→</span>Выберите <strong style="color:#FFCC00">"Подробнее о сайте"</strong></li> <li style="display:flex;gap:8px"><span style="color:#FFCC00">→</span>Увидите <strong style="color:#FFCC00">рейтинг и отзывы</strong> клиентов</li> </ul> </div> </div> <div class="glass" style="padding:20px;margin-top:16px"> <h3 style="font-size:16px;font-weight:600;margin-bottom:16px;text-align:center" class="accent">📊 Нам доверяют</h3> <div style="display:grid;grid-template-columns:repeat(2,1fr);gap:12px"> <div class="glass-light" style="padding:12px;text-align:center"><div class="stat-value">2019</div><div class="stat-label">На рынке с</div></div> <div class="glass-light" style="padding:12px;text-align:center"><div class="stat-value">0%</div><div class="stat-label">Мошенничества</div></div> <div class="glass-light" style="padding:12px;text-align:center"><div class="stat-value">$12.4M+</div><div class="stat-label">Предотвращено потерь</div></div> <div class="glass-light" style="padding:12px;text-align:center"><div class="stat-value">№1</div><div class="stat-label">СНГ (Forbes 2026)</div></div> </div> <p style="font-size:10px;color:rgba(255,255,255,.4);text-align:center;margin-top:12px">Более 10 000 успешных сделок • 99.97% без споров • РБК Инновации<
1352/p> </div> <div style="margin-top:24px;text-align:center"> <button onclick="resetDeal()" style="font-size:12px;color:rgba(255,255,255,.4);background:none;border:none;cursor:pointer;text-decoration:underline">🔄 Начать заново (сбросить данные)</button> </div> </div> </main> </div> <div id="final-modal" class="bottom-sheet hidden"> <div class="bottom-sheet-overlay" onclick="closeFinalModal()"></div> <div class="bottom-sheet-content"> <div class="bottom-sheet-handle"></div> <div style="padding:24px"> <div style="text-align:center;margin-bottom:24px"> <div style="width:80px;height:80px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 16px" class="accent-bg"> <svg style="width:48px;height:48px;color:#000" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </div> <h3 style="font-size:24px;font-weight:700;margin-bottom:8px">Сделка подготовлена!</h3> <p style="font-size:14px;color:rgba(255,255,255,.6)" id="final-modal-subtitle">Отправьте заявку гаранту в MAX</p> </div> <div class="glass-light" style="padding:16px;margin-bottom:16px;font-size:14px" id="modal-summary"></div> <div id="agreement-summary-block" class="hidden"></div> <div id="final-buttons"> <button id="btn-max" onclick="contactMax()" class="btn-max" style="margin-bottom:12px">📨 Открыть MAX и написать гаранту</button> <button id="btn-invite" onclick="inviteCounterparty()" class="btn btn-secondary" style="margin-bottom:12px">🔗 Пригласить контрагента</button> <p id="btn-invite-hint" style="font-size:12px;text-align:center;color:rgba(255,255,255,.5);margin-bottom:12px">Сгенерирует ссылку для отправки контрагенту</p> <button onclick="copyDealData()" class="btn btn-secondary">📋 Скопировать данные сделки</button> </div> <div class="max-hint"> <div style="font-size:12px;font-weight:600;margin-bottom:4px;color:#FF3B30">📱 Как связаться с гарантом:</div> <div style="font-size:11px;color:rgba(255,255,255,.7);margin-bottom:8px">1. Нажмите кнопку выше → откроется MAX<br>2. Скопируйте данные сделки ниже<br>3. Вставьте в чат с гарантом</div> <div style="font-size:11px;color:rgba(255,255,255,.7);margin-top:8px"><strong style="color:#FF3B30">Ссылка на MAX-профиль гаранта:</strong></div> <div class="max-link-display">https://max.ru/u/f9LHodD0cOKxM9AneUugd9eK_DO3CEW5UX3L1LT8p9xdK_jmZ9lakbDVp1I</div> <div style="font-size:11px;color:rgba(255,255,255,.7);margin-top:8px"><strong style="color:#FF3B30">Или по номеру:</strong> +7 963 916-63-14</div> </div> <div class="max-hint" style="margin-top:16px;background:rgba(255,59,48,.08);border-color:rgba(255,59,48,.3)"> <div style="font-size:12px;font-weight:600;margin-bottom:4px;color:#FF3B30">💡 Как это работает:</div> <p style="font-size:11px;color:rgba(255,255,255,.7)" id="final-hint-text">1. Отправьте ссылку контрагенту<br>2. Контрагент согласует условия<br>3. Оба пишете гаранту в MAX<br>4. Гарант создаст общий чат сделки</p> </div> <button onclick="closeFinalModal()" style="width:100%;color:rgba(255,255,255,.5);font-size:14px;padding:12px;margin-top:16px;background:none;border:none;cursor:pointer">← Вернуться к редактированию</button> </div> </div> </div> <div id="invite-modal" class="bottom-sheet hidden"> <div class="bottom-sheet-overlay" onclick="closeInviteModal()"></div> <div class="bottom-sheet-content"> <div class="bottom-sheet-handle"></div> <div style="padding:24px"> <div style="text-align:center;margin-bottom:20px"> <div style="font-size:40px;margin-bottom:8px">🔗</div> <h3 style="font-size:20px;font-weight:700;margin-bottom:4px">Ссылка для контрагента</h3> <p style="font-size:14px;color:rgba(255,255,255,.6)">Отправьте эту ссылку в MAX</p> </div> <div class="glass-light" style="padding:16px;margin-bottom:16px"> <div style="font-size:12px;color:rgba(255,255,255,.6);margin-bottom:8px">Ссылка сделки:</div> <div style="background:rgba(0,0,0,.5);border-radius:8px;padding:12px;font-family:monospace;font-size:12px;word-break:break-all;user-select:all" class="accent" id="invite-link-display"></div> </div> <div> <button onclick="copyInviteLink()" class="btn btn-primary" style="margin-bottom:12px">📋 Скопировать ссылку</button> <button onclick="shareInviteLink()" class="btn btn-secondary">📤 Поделиться через...</button> </div> <div class="max-hint" style="margin-top:16px;background:rgba(255,59,48,.08);border-color:rgba(255,59,48,.3)"> <div style="font-size:12px;font-weight:600;margin-bottom:4px;color:#FF3B30">💡 Что произойдёт:</div> <p style="font-size:11px;color:rgba(255,255,255,.7)">Контрагент откроет ссылку → увидит условия → согласует каждое → напишет гаранту в MAX со своей заявкой. Гарант получит обе заявки и создаст общий чат.</p> </div> <button onclick="closeInviteModal()" style="width:100%;color:rgba(255,255,255,.5);font-size:14px;padding:12px;margin-top:16px;background:none;border:none;cursor:pointer">← Назад</button> </div> </div> </div> </body> </html> <!-- nominify end --> </div> </div> </div> </div> <div id="rec2371177731" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> 
1352<script>
1353(function(){
1354'use strict';
1355
1356// ===== MAX-КОНТАКТЫ =====
1357const MAX_URL = 'https://max.ru/u/f9LHodD0cOKxM9AneUugd9eK_DO3CEW5UX3L1LT8p9xdK_jmZ9lakbDVp1I';
1358const MAX_PHONE = '+79639166314';
1359const MAX_PHONE_FORMATTED = '+7 963 916-63-14';
1360const MIN_DEAL_USDT = 150;
1361
1362// ===== ВАЛЮТЫ =====
1363const currencies = [
1364  {code:'USDT', name:'Tether', symbol:'USDT', icon:'💵', color:'#26A17B', rate:1, group:'popular'},
1365  {code:'BTC', name:'Bitcoin', symbol:'₿', icon:'₿', color:'#F7931A', rate:105000, group:'popular', cgId:'bitcoin'},
1366  {code:'ETH', name:'Ethereum', symbol:'Ξ', icon:'Ξ', color:'#627EEA', rate:2600, group:'popular', cgId:'ethereum'},
1367  {code:'TON', name:'Toncoin', symbol:'TON', icon:'💎', color:'#0098EA', rate:5.2, group:'popular', cgId:'the-open-network'},
1368  {code:'BNB', name:'BNB', symbol:'BNB', icon:'🔶', color:'#F0B90B', rate:620, group:'crypto', cgId:'binancecoin'},
1369  {code:'SOL', name:'Solana', symbol:'SOL', icon:'◎', color:'#9945FF', rate:170, group:'crypto', cgId:'solana'},
1370  {code:'XRP', name:'Ripple', symbol:'XRP', icon:'✕', color:'#23292F', rate:2.35, group:'crypto', cgId:'ripple'},
1371  {code:'DOGE', name:'Dogecoin', symbol:'Ð', icon:'🐕', color:'#C2A633', rate:0.22, group:'crypto', cgId:'dogecoin'},
1372  {code:'ADA', name:'Cardano', symbol:'₳', icon:'₳', color:'#0033AD', rate:0.78, group:'crypto', cgId:'cardano'},
1373  {code:'TRX', name:'TRON', symbol:'TRX', icon:'⚡', color:'#FF0013', rate:0.28, group:'crypto', cgId:'tron'},
1374  {code:'AVAX', name:'Avalanche', symbol:'AVAX', icon:'🔺', color:'#E84142', rate:36, group:'crypto', cgId:'avalanche-2'},
1375  {code:'SHIB', name:'Shiba Inu', symbol:'SHIB', icon:'🐶', color:'#FFA409', rate:0.000018, group:'crypto', cgId:'shiba-inu'},
1376  {code:'DOT', name:'Polkadot', symbol:'DOT', icon:'●', color:'#E6007A', rate:7.5, group:'crypto', cgId:'polkadot'},
1377  {code:'POL', name:'Polygon', symbol:'POL', icon:'⬡', color:'#8247E5', rate:0.48, group:'crypto', cgId:'matic-network'},
1378  {code:'LTC', name:'Litecoin', symbol:'Ł', icon:'Ł', color:'#BFBBBB', rate:88, group:'crypto', cgId:'litecoin'},
1379  {code:'UNI', name:'Uniswap', symbol:'UNI', icon:'🦄', color:'#FF007A', rate:11.5, group:'crypto', cgId:'uniswap'},
1380  {code:'LINK', name:'Chainlink', symbol:'LINK', icon:'🔗', color:'#2A5ADA', rate:17.5, group:'crypto', cgId:'chainlink'},
1381  {code:'NEAR', name:'NEAR', symbol:'NEAR', icon:'Ⓝ', color:'#000000', rate:5.2, group:'crypto', cgId:'near'},
1382  {code:'XLM', name:'Stellar', symbol:'XLM', icon:'✡', color:'#000000', rate:0.38, group:'crypto', cgId:'stellar'},
1383  {code:'BCH', name:'Bitcoin Cash', symbol:'BCH', icon:'Ƀ', color:'#0AC18E', rate:450, group:'crypto', cgId:'bitcoin-cash'},
1384  {code:'RUB', name:'Российский рубль', symbol:'₽', icon:'₽', color:'#0033A0', rate:1/92.5, group:'fiat'},
1385  {code:'USD', name:'Доллар США', symbol:'$', icon:'$', color:'#85BB65', rate:1, group:'fiat'},
1386  {code:'EUR', name:'Евро', symbol:'€', icon:'€', color:'#003399', rate:1.08, group:'fiat'},
1387  {code:'CNY', name:'Китайский юань', symbol:'¥', icon:'¥', color:'#DE2910', rate:0.138, group:'fiat'},
1388  {code:'TRY', name:'Турецкая лира', symbol:'₺', icon:'₺', color:'#E30A17', rate:0.031, group:'fiat'},
1389  {code:'AED', name:'Дирхам ОАЭ', symbol:'د.إ', icon:'د.إ', color:'#00732F', rate:0.27, group:'fiat'},
1390  {code:'GBP', name:'Фунт стерлингов', symbol:'£', icon:'£', color:'#012169', rate:1.27, group:'fiat'}
1391];
1392
1393const groupNames = {popular:'⭐ Популярные', crypto:'🪙 Криптовалюты', fiat:'💵 Фиатные валюты'};
1394
1395const dealCategories = [
1396  {id:'crypto', name:'Криптовалюта ТОП-25', icon:'🪙', description:'BTC, ETH, USDT, TON, SOL и др.'},
1397  {id:'nft', name:'NFT и Digital Art', icon:'🎨', description:'CryptoPunks, BAYC, Azuki'},
1398  {id:'telegram', name:'Telegram-каналы', icon:'✈️', description:'Каналы 10K-5M, боты, группы'},
1399  {id:'it_business', name:'IT-бизнес и SaaS', icon:'💻', description:'Проекты, домены, MRR'},
1400  {id:'rwa', name:'RWA (реальные активы)', icon:'🏢', description:'Недвижимость, доли, золото'},
1401  {id:'fiat', name:'Фиатные сделки', icon:'💵', description:'USD, EUR, RUB, CNY, GBP'},  {id:'otc', name:'VIP OTC от $100K', icon:'💎', description:'До $50M+, персональный менеджер'},
1402  {id:'patent', name:'Патенты и ИП', icon:'📜', description:'Товарные знаки, лицензии'},
1403  {id:'other', name:'Другое', icon:'📦', description:'Иные активы'}
1404];
1405
1406const DEFAULT_STATE = {
1407  role: null, category: null, details: '', amount: 0, currency: 'USDT',
1408  commissionPayer: 'buyer', deadline: '', counterparty: '',
1409  myMaxContact: '',
1410  isCounterparty: false, initiatorUsername: '',
1411  agreements: {category:'pending', details:'pending', amount:'pending', currency:'pending', commissionPayer:'pending', deadline:'pending'},
1412  proposals: {category:null, details:null, amount:null, currency:null, commissionPayer:null, deadline:null},
1413  comment: '',
1414  confirmations: {agreement:false, commission:false, amounts:false, terms:false, chat:false}
1415};
1416
1417let state = {...DEFAULT_STATE, 
1418  agreements: {...DEFAULT_STATE.agreements}, 
1419  proposals: {...DEFAULT_STATE.proposals}, 
1420  confirmations: {...DEFAULT_STATE.confirmations}};
1421
1422const STORAGE_KEY = 'max_deal_state_v4';
1423
1424function handleUrlParams() {
1425  const params = new URLSearchParams(window.location.search);
1426  const dealParam = params.get('deal');
1427  if (!dealParam) return false;
1428  
1429  try {
1430    let json;
1431    try {
1432      const binString = atob(dealParam);
1433      const bytes = Uint8Array.from(binString, c => c.charCodeAt(0));
1434      json = new TextDecoder().decode(bytes);
1435    } catch(e) {
1436      json = decodeURIComponent(dealParam);
1437    }
1438    const dec = JSON.parse(json);
1439    
1440    try { localStorage.removeItem(STORAGE_KEY + '_cp'); } catch(e) {}
1441    
1442    state = {
1443      ...DEFAULT_STATE, ...dec,
1444      isCounterparty: true,
1445      role: dec.role === 'buyer' ? 'seller' : 'buyer',
1446      initiatorUsername: dec.initiatorContact || 'пользователь',
1447      counterparty: dec.initiatorContact || '',
1448      myMaxContact: '',
1449      agreements: {category:'pending', details:'pending', amount:'pending', currency:'pending', commissionPayer:'pending', deadline:'pending'},
1450      proposals: {...DEFAULT_STATE.proposals},      confirmations: {...DEFAULT_STATE.confirmations},
1451      comment: ''
1452    };
1453    
1454    document.getElementById('counterparty-banner').classList.remove('hidden');
1455    document.getElementById('start-screen').classList.add('hidden');
1456    document.getElementById('progress-container').classList.remove('hidden');
1457    currentStep = 2;
1458    renderStep();
1459    showToast('🤝 Приглашение от контрагента. Согласуйте условия.');
1460    return true;
1461  } catch(e) {
1462    console.warn('Decode error:', e);
1463    showToast('❌ Ошибка загрузки данных сделки');
1464    return false;
1465  }
1466}
1467
1468try {
1469  const saved = localStorage.getItem(STORAGE_KEY);
1470  if (saved && !state.isCounterparty) {
1471    const p = JSON.parse(saved);
1472    state = {
1473      ...DEFAULT_STATE, ...p,
1474      agreements: {...DEFAULT_STATE.agreements, ...(p.agreements || {})},
1475      proposals: {...DEFAULT_STATE.proposals, ...(p.proposals || {})},
1476      confirmations: {...DEFAULT_STATE.confirmations, ...(p.confirmations || {})}
1477    };
1478    if (!state.commissionPayer) state.commissionPayer = 'buyer';
1479  }
1480} catch(e) {}
1481
1482function saveState() {
1483  if (state.isCounterparty) return;
1484  try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch(e) {}
1485}
1486
1487window.resetDeal = function() {
1488  if (!confirm('Сбросить все данные сделки?')) return;
1489  state = {...DEFAULT_STATE, 
1490    agreements: {...DEFAULT_STATE.agreements}, 
1491    proposals: {...DEFAULT_STATE.proposals}, 
1492    confirmations: {...DEFAULT_STATE.confirmations}};
1493  try { localStorage.removeItem(STORAGE_KEY); } catch(e) {}
1494  currentStep = 0;
1495  document.getElementById('quiz-container').classList.add('hidden');
1496  document.getElementById('progress-container').classList.add('hidden');
1497  document.getElementById('start-screen').classList.remove('hidden');
1498  document.getElementById('counterparty-banner').classList.add('hidden');
1499  showToast('✅ Данные сброшены');  window.scrollTo({top: 0, behavior: 'smooth'});
1500};
1501
1502let ratesLastUpdated = null;
1503let ratesSource = 'fallback';
1504
1505async function fetchLiveRates() {
1506  try {
1507    const ids = currencies.filter(c => c.cgId).map(c => c.cgId).join(',');
1508    const ctrl = new AbortController();
1509    const timeout = setTimeout(() => ctrl.abort(), 5000);
1510    const r = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`, {signal: ctrl.signal});
1511    clearTimeout(timeout);
1512    if (!r.ok) throw new Error('API');
1513    const d = await r.json();
1514    currencies.forEach(c => {
1515      if (c.cgId && d[c.cgId]?.usd) c.rate = d[c.cgId].usd;
1516    });
1517    ratesLastUpdated = Date.now();
1518    ratesSource = 'live';
1519    try { localStorage.setItem('max_rates_cache_v3', JSON.stringify({time: ratesLastUpdated, rates: currencies.map(c => ({code: c.code, rate: c.rate}))})); } catch(e) {}
1520    if (currentStep === 3) updateAmount(state.amount);
1521  } catch(e) {
1522    try {
1523      const cached = localStorage.getItem('max_rates_cache_v3');
1524      if (cached) {
1525        const {time, rates} = JSON.parse(cached);
1526        rates.forEach(r => {
1527          const cur = currencies.find(x => x.code === r.code);
1528          if (cur) cur.rate = r.rate;
1529        });
1530        ratesLastUpdated = time;
1531        ratesSource = 'cached';
1532      } else {
1533        ratesSource = 'fallback';
1534      }
1535    } catch(e) {
1536      ratesSource = 'fallback';
1537    }
1538  }
1539}
1540
1541function getCommissionRate(a) {
1542  if (a <= 1000) return 0.15;
1543  if (a <= 10000) return 0.125;
1544  if (a <= 1000000) return 0.1;
1545  return 0.075;
1546}
1547
1548function formatNumber(n) {  if (n === 0) return '0';
1549  if (n < 0.0001 && n > 0) return n.toFixed(8);
1550  if (n < 0.01 && n > 0) return n.toFixed(6);
1551  if (n < 1 && n > 0) return n.toFixed(4);
1552  return n.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$& ').replace('.', ',');
1553}
1554
1555function calculateCommissionData(a, c) {
1556  const cur = currencies.find(x => x.code === c) || currencies[0];
1557  const u = a * cur.rate;
1558  const r = getCommissionRate(u);
1559  const com = a * r;
1560  return {currency: cur, amountInUSDT: u, commissionRate: r, commission: com};
1561}
1562
1563function calculateFinalSums(a, c, p) {
1564  let b = a, s = a;
1565  if (p === 'buyer') b = a + c;
1566  else if (p === 'seller') s = a - c;
1567  else if (p === 'half') { b = a + (c/2); s = a - (c/2); }
1568  return {buyerPays: b, sellerGets: s};
1569}
1570
1571function getPayerLabel(p) {
1572  if (p === 'buyer') return 'Покупатель 100%';
1573  if (p === 'seller') return 'Продавец 100%';
1574  return '50/50 пополам';
1575}
1576
1577function getPayerIcon(p) {
1578  if (p === 'buyer') return '🛒';
1579  if (p === 'seller') return '💼';
1580  return '🤝';
1581}
1582
1583let openDropdownId = null;
1584
1585function createCurrencySelector(id, init, onChange, disabled = false) {
1586  const container = document.getElementById(id);
1587  if (!container) return;
1588  let sel = init;
1589  
1590  function render() {
1591    const cur = currencies.find(x => x.code === sel) || currencies[0];
1592    container.innerHTML = `
1593      <div class="currency-selector" id="${id}-wrapper"> <button type="button" class="currency-trigger" onclick="${disabled ? '' : `window._toggleDropdown('${id}')`}" ${disabled ? 'disabled' : ''}> <div style="display:flex;align-items:center;gap:12px"> <div style="width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:bold;background:${cur.color}20;color:${cur.color}">${cur.icon}</div> <div> <div style="font-size:14px;font-weight:600">${cur.code}</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">${cur.name}</div> </div> </div>
1594          ${!disabled ? '<svg width="16" height="16" fill="none" stroke="rgba(255,255,255,.4)" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg>' : ''}
1595        </button>
1596        ${!disabled ? `<div class="currency-dropdown hidden" id="${id}-dropdown"></div>` : ''}
1597      </div>`;
1598    if (!disabled) renderDD();
1599  }
1600  
1601  function renderDD(filter = '') {
1602    const dd = document.getElementById(`${id}-dropdown`);
1603    if (!dd) return;
1604    const fl = filter.toLowerCase();
1605    const groups = ['popular', 'crypto', 'fiat'];
1606    let html = `<div style="padding:8px;border-bottom:1px solid rgba(255,255,255,.1)"> <input type="text" placeholder="🔍 Поиск..." value="${filter}" 
1607        oninput="window._filterCurrency('${id}', this.value)" 
1608        onclick="event.stopPropagation()" 
1609        style="width:100%;padding:8px 12px;border-radius:8px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);font-size:14px;color:#fff"> </div>`;
1610    groups.forEach(g => {
1611      const gc = currencies.filter(x => x.group === g && (filter === '' || x.code.toLowerCase().includes(fl) || x.name.toLowerCase().includes(fl)));
1612      if (gc.length > 0) {
1613        html += `<div style="padding:8px 12px 4px;font-size:11px;color:rgba(255,255,255,.4);font-weight:600;text-transform:uppercase">${groupNames[g]}</div>`;
1614        gc.forEach(x => {
1615          const is = x.code === sel;
1616          let rt = '';
1617          if (x.code === 'RUB') rt = '92.5 ₽/USDT';
1618          else if (x.rate !== 1) rt = `$${x.rate < 0.001 ? x.rate.toExponential(2) : x.rate.toFixed(x.rate < 1 ? 4 : 2)}`;
1619          else rt = '1:1';
1620          html += `<div style="padding:10px 12px;cursor:pointer;display:flex;align-items:center;gap:12px;${is ? 'background:rgba(48,209,88,.1);color:#30D158' : ''}" 
1621            onclick="event.stopPropagation();window._selectCurrency('${id}', '${x.code}')"> <div style="width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:bold;background:${x.color}20;color:${x.color}">${x.icon}</div> <div style="flex:1"><div style="font-size:14px;font-weight:600">${x.code}</div><div style="font-size:12px;color:rgba(255,255,255,.6)">${x.name}</div></div> <div style="font-size:11px;color:rgba(255,255,255,.4)">${rt}</div> </div>`;
1622        });
1623      }
1624    });
1625    dd.innerHTML = html;
1626  }
1627  
1628  window._toggleDropdown = function(i) {
1629    const dd = document.getElementById(`${i}-dropdown`);
1630    if (!dd) return;
1631    const wasHidden = dd.classList.contains('hidden');
1632    document.querySelectorAll('.currency-dropdown').forEach(d => d.classList.add('hidden'));
1633    if (wasHidden) {      dd.classList.remove('hidden');
1634      openDropdownId = i;
1635      renderDD();
1636    } else {
1637      dd.classList.add('hidden');
1638      openDropdownId = null;
1639    }
1640  };
1641  
1642  window._selectCurrency = function(i, code) {
1643    sel = code;
1644    render();
1645    onChange(code);
1646    const dd = document.getElementById(`${i}-dropdown`);
1647    if (dd) dd.classList.add('hidden');
1648    openDropdownId = null;
1649  };
1650  
1651  window._filterCurrency = function(i, f) { renderDD(f); };
1652  
1653  render();
1654}
1655
1656document.addEventListener('click', e => {
1657  if (openDropdownId && !e.target.closest('.currency-selector')) {
1658    const dd = document.getElementById(`${openDropdownId}-dropdown`);
1659    if (dd) dd.classList.add('hidden');
1660    openDropdownId = null;
1661  }
1662});
1663
1664let currentStep = 0;
1665const totalSteps = 7;
1666
1667window.startQuiz = function() {
1668  document.getElementById('start-screen').classList.add('hidden');
1669  document.getElementById('progress-container').classList.remove('hidden');
1670  currentStep = 1;
1671  renderStep();
1672  window.scrollTo({top: 0, behavior: 'smooth'});
1673};
1674
1675function updateProgress() {
1676  const p = Math.round((currentStep / totalSteps) * 100);
1677  document.getElementById('step-text').textContent = `Шаг ${currentStep} из ${totalSteps}`;
1678  document.getElementById('step-percent').textContent = `${p}%`;
1679  document.getElementById('progress-bar').style.width = `${p}%`;
1680}
1681
1682function renderNavButtons(showBack = true, showNext = true) {  const nextText = state.isCounterparty ? 'Согласовать →' : 'Далее →';
1683  const btnClass = state.role === 'buyer' ? 'btn-buyer' : (state.role === 'seller' ? 'btn-seller' : 'btn-primary');
1684  return `<div class="sticky-nav"> <div style="display:flex;gap:12px;max-width:640px;margin:0 auto">
1685      ${showBack ? `<button onclick="prevStep()" class="btn btn-secondary" style="flex:1">← Назад</button>` : '<div style="flex-1"></div>'}
1686      ${showNext ? `<button onclick="nextStep()" class="btn ${btnClass}" style="flex:1">${nextText}</button>` : ''}
1687    </div> </div>`;
1688}
1689
1690function renderStep() {
1691  updateProgress();
1692  const c = document.getElementById('quiz-container');
1693  c.classList.remove('hidden');
1694  switch(currentStep) {
1695    case 1: renderStep1(); break;
1696    case 2: renderStep2(); break;
1697    case 3: renderStep3(); break;
1698    case 4: renderStep4(); break;
1699    case 5: renderStep5(); break;
1700    case 6: renderStep6(); break;
1701    case 7: renderStep7(); break;
1702  }
1703  saveState();
1704  setTimeout(() => {
1705    const progressContainer = document.getElementById('progress-container');
1706    if (progressContainer) {
1707      window.scrollTo({top: progressContainer.offsetTop - 80, behavior: 'smooth'});
1708    }
1709  }, 100);
1710}
1711
1712function renderStep1() {
1713  document.getElementById('quiz-container').innerHTML = `
1714    <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">Ваша роль в сделке</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">Выберите, кем вы выступаете</p> <div style="display:flex;flex-direction:column;gap:12px"> <div class="card ${state.role === 'buyer' ? 'card-selected' : ''}" onclick="selectRole('buyer')"> <div style="display:flex;align-items:center;gap:16px"> <div style="width:56px;height:56px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:24px;flex-shrink:0" class="buyer-bg">🛒</div> <div style="flex:1"> <div style="font-size:18px;font-weight:700">Покупатель</div> <div style="font-size:14px;color:rgba(255,255,255,.6)">Хочу купить актив безопасно</div> </div> </div> </div> <div class="card ${state.role === 'seller' ? 'card-selected' : ''}" onclick="selectRole('seller')"> <div style="display:flex;align-items:center;gap:16px"> <div style="width:56px;height:56px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:24px;flex-shrink:0" class="seller-bg">💼</div> <div style="flex:1"> <div style="font-size:18px;font-weight:700">Продавец</div> <div style="font-size:14px;color:rgba(255,255,255,.6)">Хочу продать актив безопасно</div> </div> </div> </div> </div>
1715      ${renderNavButtons(true, false)}
1716    </div>`;
1717}
1718
1719window.selectRole = function(r) {
1720  state.role = r;
1721  saveState();
1722  renderStep();
1723  setTimeout(() => nextStep(), 300);
1724};
1725
1726function renderStep2() {
1727  const cp = state.isCounterparty;
1728  const cat = dealCategories.find(c => c.id === state.category);
1729  
1730  if (cp) {
1731    const ag = state.agreements.category === 'agreed';
1732    const pr = state.agreements.category === 'proposed';
1733    
1734    document.getElementById('quiz-container').innerHTML = `
1735      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">🤝 Согласование: Предмет сделки</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:16px">Инициатор ${state.initiatorUsername} предлагает:</p> <div class="glass-light" style="padding:16px;margin-bottom:16px;background:rgba(10,132,255,.08);border:1px solid rgba(10,132,255,.2)"> <div style="font-size:12px;color:#0A84FF;margin-bottom:4px">👤 Предложение инициатора:</div> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">${cat?.icon || '📦'}</div> <div> <div style="font-weight:600">${cat?.name || 'Не выбрано'}</div> <div style="font-size:12px;color:rgba(255,255,255,.6);margin-top:4px">${state.details || state.proposals.details || 'Не указано'}</div> </div> </div> </div> <div style="font-size:14px;font-weight:600;margin-bottom:8px">Ваше решение:</div> <div class="agree-toggle"> <button class="agree-btn ${ag ? 'agree-btn-agreed' : ''}" onclick="setAgreement('category', 'agreed')">
1736            ✅ Согласен<br><span style="font-size:12px;font-weight:400">Принять как есть</span> </button>
1736 <button class="agree-btn ${pr ? 'agree-btn-proposed' : ''}" onclick="setAgreement('category', 'proposed')">
1737            ⚠️ Предлагаю своё<br><span style="font-size:12px;font-weight:400">Изменить условие</span> </button> </div>
1738        
1739        ${pr ? `
1740          <div style="margin-top:12px;padding:12px;border-radius:12px;background:rgba(255,159,10,.08);border:1px solid rgba(255,159,10,.2)"> <div style="font-size:12px;color:#FF9F0A;margin-bottom:8px">✍️ Ваше предложение:</div> <div style="display:flex;flex-direction:column;gap:8px"> <div> <label style="display:block;font-size:12px;margin-bottom:4px">Категория:</label> <select id="proposal-category" class="input" style="font-size:14px" onchange="updateProposal('category', this.value)">
1741                  ${dealCategories.map(c => `<option value="${c.id}" ${state.proposals.category === c.id ? 'selected' : ''}>${c.icon} ${c.name}</option>`).join('')}
1742                </select> </div> <div> <label style="display:block;font-size:12px;margin-bottom:4px">Детали (что именно):</label> <input type="text" id="proposal-details" class="input" style="font-size:14px" value="${state.proposals.details || state.details}" 
1743                  placeholder="Например: iPhone 15 Pro Max 256GB" oninput="updateProposal('details', this.value)"> </div> </div> </div>` : ''}
1744        
1745        ${renderNavButtons(true, true)}
1746      </div>`;
1747  } else {
1748    document.getElementById('quiz-container').innerHTML = `
1749      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">Предмет сделки</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">Что является объектом купли-продажи?</p> <div style="display:flex;flex-direction:column;gap:8px;max-height:320px;overflow-y:auto">
1750          ${dealCategories.map(c => `
1751            <div class="card ${state.category === c.id ? 'card-selected' : ''}" onclick="selectCategory('${c.id}')"> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">${c.icon}</div> <div style="flex:1"> <div style="font-weight:600">${c.name}</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">${c.description}</div> </div> </div> </div>`).join('')}
1752        </div>
1753        
1754        ${state.category ? `
1755          <div class="animate-fade-in" style="margin-top:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">✏️ Уточнение (что именно продаётся/покупается)</label> <input type="text" id="details-input" class="input" value="${state.details}" 
1756              placeholder="Например: iPhone 15 Pro Max, 0.5 BTC, канал @example" 
1757              oninput="state.details = this.value; saveState()"> <div style="font-size:12px;margin-top:4px;display:flex;align-items:center;gap:4px;${state.details ? 'color:#30D158' : 'color:rgba(255,255,255,.4)'}">
1758              ${state.details ? '✅ Заполнено' : '💡 Опишите предмет сделки подробнее'}
1759            </div> </div>` : `          <div style="margin-top:16px;padding:16px;border-radius:12px;background:rgba(255,255,255,.05);text-align:center;font-size:14px;color:rgba(255,255,255,.4)">
1760            👆 Выберите категорию выше
1761          </div>`}
1762        
1763        ${renderNavButtons(true, true)}
1764      </div>`;
1765    
1766    if (state.category) {
1767      setTimeout(() => {
1768        const inp = document.getElementById('details-input');
1769        if (inp) inp.focus();
1770      }, 200);
1771    }
1772  }
1773}
1774
1775window.selectCategory = function(id) {
1776  state.category = id;
1777  state.details = '';
1778  saveState();
1779  renderStep();
1780};
1781
1782window.setAgreement = function(f, s) {
1783  state.agreements[f] = s;
1784  if (f === 'category' && s === 'agreed') state.agreements.details = 'agreed';
1785  if (f === 'category' && s === 'proposed') {
1786    state.agreements.details = 'proposed';
1787    if (!state.proposals.details) state.proposals.details = state.details;
1788  }
1789  saveState();
1790  renderStep();
1791};
1792
1793window.updateProposal = function(f, v) {
1794  state.proposals[f] = v;
1795  saveState();
1796};
1797
1798function renderStep3() {
1799  const cp = state.isCounterparty;
1800  const cd = calculateCommissionData(state.amount, state.currency);
1801  const sym = cd.currency.symbol;
1802  const belowMinimum = cd.amountInUSDT < MIN_DEAL_USDT && state.amount > 0;
1803  
1804  if (cp) {
1805    const aA = state.agreements.amount === 'agreed';
1806    const pA = state.agreements.amount === 'proposed';
1807    const aC = state.agreements.currency === 'agreed';
1808    const pC = state.agreements.currency === 'proposed';    const aP = state.agreements.commissionPayer === 'agreed';
1809    const pP = state.agreements.commissionPayer === 'proposed';
1810    
1811    document.getElementById('quiz-container').innerHTML = `
1812      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">🤝 Согласование: Сумма и условия</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:16px">Инициатор предлагает:</p> <div class="glass-light" style="padding:12px;margin-bottom:12px;background:rgba(10,132,255,.08);border:1px solid rgba(10,132,255,.2)"> <div style="font-size:12px;color:#0A84FF;margin-bottom:4px">💰 Сумма:</div> <div style="font-size:18px;font-weight:700">${formatNumber(state.amount)} ${sym}</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">≈ ${formatNumber(cd.amountInUSDT)} USDT</div> </div> <div class="agree-toggle"> <button class="agree-btn ${aA ? 'agree-btn-agreed' : ''}" onclick="setAgreement('amount', 'agreed')">✅ Согласен</button>
1812 <button class="agree-btn ${pA ? 'agree-btn-proposed' : ''}" onclick="setAgreement('amount', 'proposed')">⚠️ Предлагаю свою</button> </div>
1813        ${pA ? `
1814          <div style="margin-top:12px;padding:12px;border-radius:12px;background:rgba(255,159,10,.08);border:1px solid rgba(255,159,10,.2)"> <label style="display:block;font-size:12px;color:#FF9F0A;margin-bottom:4px">Ваша сумма:</label> <input type="number" class="input" style="font-size:14px" value="${state.proposals.amount || state.amount}" 
1815              oninput="updateProposal('amount', parseFloat(this.value) || 0)"> </div>` : ''}
1816        
1817        <div class="glass-light" style="padding:12px;margin-top:16px;margin-bottom:12px;background:rgba(10,132,255,.08);border:1px solid rgba(10,132,255,.2)"> <div style="font-size:12px;color:#0A84FF;margin-bottom:4px">💵 Валюта:</div> <div style="font-weight:700">${cd.currency.name} (${state.currency})</div> </div> <div class="agree-toggle"> <button class="agree-btn ${aC ? 'agree-btn-agreed' : ''}" onclick="setAgreement('currency', 'agreed')">✅ Согласен</button>
1817 <button class="agree-btn ${pC ? 'agree-btn-proposed' : ''}" onclick="setAgreement('currency', 'proposed')">⚠️ Другую</button> </div>
1818        ${pC ? `
1819          <div style="margin-top:12px;padding:12px;border-radius:12px;background:rgba(255,159,10,.08);border:1px solid rgba(255,159,10,.2)"> <label style="display:block;font-size:12px;color:#FF9F0A;margin-bottom:4px">Ваша валюта:</label> <div id="proposal-currency-container"></div> </div>` : ''}
1820        
1821        <div class="glass-light" style="padding:12px;margin-top:16px;margin-bottom:12px;background:rgba(10,132,255,.08);border:1px solid rgba(10,132,255,.2)"> <div style="font-size:12px;color:#0A84FF;margin-bottom:4px">💳 Плательщик комиссии:</div> <div style="font-weight:700">${getPayerIcon(state.commissionPayer)} ${getPayerLabel(state.commissionPayer)}</div> </div> <div class="agree-toggle"> <button class="agree-btn ${aP ? 'agree-btn-agreed' : ''}" onclick="setAgreement('commissionPayer', 'agreed')">✅ Согласен</button>
1821 <button class="agree-btn ${pP ? 'agree-btn-proposed' : ''}" onclick="setAgreement('commissionPayer', 'proposed')">⚠️ Предлагаю иначе</button> </div>
1822        ${pP ? `
1823          <div style="margin-top:12px;padding:12px;border-radius:12px;background:rgba(255,159,10,.08);border:1px solid rgba(255,159,10,.2)"> <label style="display:block;font-size:12px;color:#FF9F0A;margin-bottom:8px">Ваш вариант:</label> <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px"> <button type="button" class="agree-btn ${state.proposals.commissionPayer === 'buyer' ? 'agree-btn-proposed' : ''}" 
1824                onclick="updateProposal('commissionPayer', 'buyer');renderStep()">
1825                🛒<br><span style="font-size:11px">Покупатель</span> </button> <button type="button" class="agree-btn ${state.proposals.commissionPayer === 'seller' ? 'agree-btn-proposed' : ''}" 
1826                onclick="updateProposal('commissionPayer', 'seller');renderStep()">
1827                💼<br><span style="font-size:11px">Продавец</span> </button> <button type="button" class="agree-btn ${state.proposals.commissionPayer === 'half' ? 'agree-btn-prop
1827osed' : ''}" 
1828                onclick="updateProposal('commissionPayer', 'half');renderStep()">
1829                🤝<br><span style="font-size:11px">50/50</span> </button> </div> </div>` : ''}
1830        
1831        ${renderNavButtons(true, true)}
1832      </div>`;
1833    
1834    if (pC) {
1835      createCurrencySelector('proposal-currency-container', state.proposals.currency || state.currency, code => updateProposal('currency', code));
1836    }
1837  } else {
1838    document.getElementById('quiz-container').innerHTML = `
1839      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">Сумма и условия оплаты</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:12px">Укажите сумму, валюту и кто оплачивает комиссию гаранта</p>
1840        
1841        ${belowMinimum ? `
1842          <div style="background:rgba(255,59,48,.08);border:1px solid rgba(255,59,48,.3);border-radius:12px;padding:12px;margin-bottom:12px"> <div style="font-size:12px;font-weight:600;color:#FF3B30;margin-bottom:4px">⚠️ Минимум сделки: ${MIN_DEAL_USDT} USDT</div> <p style="font-size:11px;color:rgba(255,255,255,.7)">Текущая сумма (${formatNumber(cd.amountInUSDT)} USDT) ниже минимального порога. Увеличьте сумму или выберите другую валюту.</p> </div>` : ''}
1843        
1844        <div style="display:flex;flex-direction:column;gap:16px"> <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px"> <div> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">Сумма</label> <input type="number" id="amount-input" class="input" value="${state.amount || ''}" 
1845                placeholder="50000" oninput="updateAmount(this.value)"> </div> <div> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">Валюта</label> <div id="currency-selector-container"></div> </div> </div> <div> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">Кто оплачивает комиссию гаранта?</label> <div style="display:flex;flex-direction:column;gap:8px;margin-top:8px"> <div class="card ${state.commissionPayer === 'buyer' ? 'card-selected' : ''}" onclick="selectPayer('buyer', event)"> <div style="display:flex;align-items:center;justify-content:space-between"> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">🛒</div> <div> <div style="font-size:14px;font-weight:600">Покупатель 100%</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">Комиссия + к сумме</div> </div> </div> <div style="text-align:right"> <div style="font-size:12px;color:rgba(255,255,255,.6)">Заплатит:</div> <div style="font-size:14px;font-weight:700;color:#30D158" id="preview-buyer-buyer">—</div> </div> </div> </div> <div class="card ${state.commissionPayer === 'seller' ? 'card-selected' : ''}" onclick="selectPayer('seller', event)"> <div style="display:flex;align-items:center;justify-content:space-between"> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">💼</div> <div> <div style="font-size:14px;font-weight:600">Продавец 100%</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">Комиссия - из суммы</div> </div> </div> <div style="text-align:right"> <div style="font-size:12px;color:rgba(255,255,255,.6)">Получит:</div> <div style="font-size:14px;font-weight:700;color:#30D158" id="preview-seller-seller">—</div> </div> </div> </div> <div class="card ${state.commissionPayer === 'half' ? 'card-selected' : ''}" onclick="selectPayer('half', event)"> <div style="display:flex;align-items:center;justify-content:space-between"> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">🤝</div> <div> <div style="font-size:14px;font-weight:600">50/50</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">Комиссия пополам</div> </div> </div> <div style="text-align:right"> <div style="font-size:12px;color:rgba(255,255,255,.6)">Каждый:</div> <div style="font-size:14px;font-weight:700;color:#30D158" id="preview-half-half">—</div> </div> </div> </div> </div> </div> <div class="glass" style="padding:16px;font-size:14px" id="live-calc"></div> </div>
1846                ${renderNavButtons(true, true)}
1847      </div>`;
1848    
1849    createCurrencySelector('currency-selector-container', state.currency, code => {
1850      state.currency = code;
1851      saveState();
1852      updateAmount(state.amount);
1853    });
1854    updateAmount(state.amount || 0);
1855  }
1856}
1857
1858window.selectPayer = function(p, e) {
1859  state.commissionPayer = p;
1860  saveState();
1861  document.querySelectorAll('.card').forEach(c => c.classList.remove('card-selected'));
1862  if (e && e.currentTarget) e.currentTarget.classList.add('card-selected');
1863  updateAmount(state.amount);
1864};
1865
1866window.updateAmount = function(v) {
1867  const a = parseFloat(String(v).replace(',', '.')) || 0;
1868  state.amount = Math.max(0, a);
1869  saveState();
1870  
1871  const cd = calculateCommissionData(state.amount, state.currency);
1872  const f = calculateFinalSums(state.amount, cd.commission, state.commissionPayer);
1873  const sym = cd.currency.symbol;
1874  const belowMinimum = cd.amountInUSDT < MIN_DEAL_USDT && state.amount > 0;
1875  
1876  const pb = document.getElementById('preview-buyer-buyer');
1877  const ps = document.getElementById('preview-seller-seller');
1878  const ph = document.getElementById('preview-half-half');
1879  
1880  if (pb) pb.textContent = `${formatNumber(state.amount + cd.commission)} ${sym}`;
1881  if (ps) ps.textContent = `${formatNumber(state.amount - cd.commission)} ${sym}`;
1882  if (ph) ph.textContent = `${formatNumber(cd.commission / 2)} ${sym}`;
1883  
1884  const lc = document.getElementById('live-calc');
1885  if (lc) {
1886    lc.innerHTML = `
1887      <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Сумма сделки:</span> <span style="font-weight:700">${formatNumber(state.amount)} ${sym}</span> </div> <div style="display:flex;justify-content:space-between;font-size:12px;color:rgba(255,255,255,.4);margin-bottom:8px"> <span>Эквивалент:</span> <span>${formatNumber(cd.amountInUSDT)}
1887 USDT</span> </div>
1888      ${belowMinimum ? `        <div style="background:rgba(255,59,48,.1);border:1px solid rgba(255,59,48,.3);border-radius:8px;padding:8px;margin-bottom:8px;font-size:12px;color:#FF3B30">
1889          ⚠️ Минимум: ${MIN_DEAL_USDT} USDT
1890        </div>` : ''}
1891      <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Комиссия гаранта:</span> <span style="font-weight:700;color:#30D158">${formatNumber(cd.commission)} ${sym} (${(cd.commissionRate * 100).toFixed(1)}%)</span> </div> <div style="border-top:1px solid rgba(255,255,255,.1);margin:8px 0"></div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">💳 Плательщик:</span> <span style="font-weight:700">${getPayerIcon(state.commissionPayer)} ${getPayerLabel(state.commissionPayer)}</span> </div> <div style="border-top:1px solid rgba(255,255,255,.1);margin:8px 0"></div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">🛒 Покупатель заплатит:</span> <span style="font-weight:700">${formatNumber(f.buyerPays)} ${sym}</span> </div> <div style="display:flex;justify-content:space-between"> <span style="color:rgba(255,255,255,.6)">💼 Продавец получит:</span> <span style="font-weight:700">${formatNumber(f.sellerGets)} ${sym}</span> </div>`;
1892  }
1893};
1894
1895function renderStep4() {
1896  const cp = state.isCounterparty;
1897  const ag = state.agreements.deadline === 'agreed';
1898  const pr = state.agreements.deadline === 'proposed';
1899  
1900  if (cp) {
1901    document.getElementById('quiz-container').innerHTML = `
1902      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">🤝 Согласование: Сроки</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:16px">Инициатор предлагает:</p> <div class="glass-light" style="padding:16px;margin-bottom:16px;background:rgba(10,132,255,.08);border:1px solid rgba(10,132,255,.2)"> <div style="font-size:12px;color:#0A84FF;margin-bottom:4px">⏰ Срок сделки:</div> <div style="font-size:18px;font-weight:700">${state.deadline || 'Не указан'}</div> </div> <div style="font-size:14px;font-weight:600;margin-bottom:8px">Ваше решение:</div> <div class="agree-toggle"> <button class="agree-btn ${ag ? 'agree-btn-agreed' : ''}" onclick="setAgreement('deadline', 'agreed')">✅ Согласен</button>
1902 <button class="agree-btn ${pr ? 'agree-btn-proposed' : ''}" onclick="setAgreement('deadline', 'proposed')">⚠️ Предлагаю свои</button> </div>
1903        
1904        ${pr ? `
1905          <div style="margin-top:12px;padding:12px;border-radius:12px;background:rgba(255,159,10,.08);border:1px solid rgba(255,159,10,.2)"> <label style="display:block;font-size:12px;color:#FF9F0A;margin-bottom:4px">Ваш срок:</label> <input type="text" class="input" style="font-size:14px" value="${state.proposals.deadline || state.deadline}"               placeholder="Например: 48 часов" oninput="updateProposal('deadline', this.value)"> </div>` : ''}
1906        
1907        ${renderNavButtons(true, true)}
1908      </div>`;
1909  } else {
1910    const s = ['1 час', '24 часа', '3 дня', '7 дней', '14 дней', '30 дней'];
1911    document.getElementById('quiz-container').innerHTML = `
1912      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">Сроки сделки</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">В течение какого времени должна завершиться сделка?</p> <input type="text" id="deadline-input" class="input" value="${state.deadline}" 
1913          placeholder="Например: 24 часа" oninput="state.deadline = this.value; saveState()"> <div style="margin-top:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">⚡ Быстрый выбор:</label> <div style="display:flex;flex-wrap:wrap;gap:8px">
1914            ${s.map(x => `
1915              <button type="button" style="padding:8px 12px;border-radius:8px;font-size:14px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);color:#fff;cursor:pointer;transition:all .2s" 
1916                onclick="setDeadline('${x}')">${x}</button>`).join('')}
1917          </div> </div>
1918        
1919        ${renderNavButtons(true, true)}
1920      </div>`;
1921  }
1922}
1923
1924window.setDeadline = function(v) {
1925  state.deadline = v;
1926  document.getElementById('deadline-input').value = v;
1927  saveState();
1928};
1929
1930// 🎯 ИСПРАВЛЕНО: ШАГ 5 — добавлено поле "Ваш MAX-контакт" для контрагента
1931function renderStep5() {
1932  if (state.isCounterparty) {
1933    document.getElementById('quiz-container').innerHTML = `
1934      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">👤 Контакты участников</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">Укажите MAX-контакты для идентификации гарантом</p> <!-- Инициатор (readonly) --> <div style="margin-bottom:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">👤 MAX-контакт инициатора</label> <input type="text" class="input" value="${state.initiatorUsername}" disabled style="opacity:.7;cursor:not-allowed"> <div style="font-size:11px;color:rgba(255,255,255,.5);margin-top:4px">Этот контакт указал инициатор сделки</div> </div> <!-- Ваш MAX-контакт --> <div style="margin-bottom:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">📱 Ваш MAX-контакт (обязательно)</label> <input type="text" id="my-max-contact-input" class="input" 
1935            value="${state.myMaxContact}" 
1936            placeholder="max.ru/u/... или +7 999 123-45-67" 
1937            oninput="state.myMaxContact = this.value.trim(); saveState()"> <div style="font-size:11px;color:rgba(255,255,255,.5);margin-top:4px">Гарант увидит этот контакт в вашей заявке</div> </div> <div class="glass-light" style="padding:16px;background:rgba(255,59,48,.08);border:1px solid rgba(255,59,48,.2)"> <div style="font-size:12px;font-weight:600;color:#FF3B30;margin-bottom:4px">💡 Как найти свой MAX-контакт:</div> <div style="font-size:11px;color:rgba(255,255,255,.7);margin-bottom:8px">
1938            1. Откройте свой профиль в MAX<br>
1939            2. Нажмите на три точки (⋮) вверху<br>
1940            3. Выберите "Поделиться профилем" или "Скопировать ссылку"
1941          </div> <div style="font-size:11px;color:rgba(255,255,255,.7)"> <strong style="color:#FF3B30">Или</strong> введите номер телефона, привязанный к MAX
1942          </div> </div>
1943        
1944        ${renderNavButtons(true, true)}
1945      </div>`;
1946  } else {
1947    document.getElementById('quiz-container').innerHTML = `
1948      <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">Контакты участников</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">Укажите MAX-контакты для идентификации гарантом</p> <!-- Ваш MAX-контакт --> <div style="margin-bottom:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">📱 Ваш MAX-контакт (обязательно)</label> <input type="text" id="my-max-contact-input" class="input" 
1949            value="${state.myMaxContact}" 
1950            placeholder="max.ru/u/... или +7 999 123-45-67" 
1951            oninput="state.myMaxContact = this.value.trim(); saveState()"> <div style="font-size:11px;color:rgba(255,255,255,.5);margin-top:4px">Гарант увидит этот контакт в вашей заявке</div> </div> <!-- MAX контрагента --> <div style="margin-bottom:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">👥 MAX-контакт контрагента</label> <input type="text" id="counterparty-input" class="input" 
1952            value="${state.counterparty}" 
1953            placeholder="max.ru/u/... или +7 999 123-45-67" 
1954            oninput="validateCounterparty(this.value)"> <div id="counterparty-error" style="font-size:12px;color:#FF3B30;margin-top:4px;display:none">
1955            Введите корректную MAX-ссылку или номер телефона
1956          </div> </div> <div class="glass-light" style="padding:16px;background:rgba(255,59,48,.08);border:1px solid rgba(255,59,48,.2)"> <div style="font-size:12px;font-weight:600;color:#FF3B30;margin-bottom:4px">💡 Как найти MAX-контакт:</div> <div style="font-size:11px;color:rgba(255,255,255,.7);margin-bottom:8px">
1957            1. Откройте профиль в MAX<br>
1958            2. Нажмите на три точки (⋮) вверху<br>
1959            3. Выберите "Поделиться профилем" или "Скопировать ссылку"
1960          </div> <div style="font-size:11px;color:rgba(255,255,255,.7)"> <strong style="color:#FF3B30">Или</strong> введите номер телефона, привязанный к MAX
1961          </div> </div>
1962        
1963        ${renderNavButtons(true, true)}
1964      </div>`;
1965  }
1966}
1967
1968window.validateCounterparty = function(v) {
1969  const c = v.trim();
1970  state.counterparty = c;
1971  saveState();
1972  
1973  const isValidLink = c.includes('max.ru/') || c.includes('max.ru/u/');
1974  const isValidPhone = /^[+]?[\d\s\-()]{5,}$/.test(c);
1975  const isValid = isValidLink || isValidPhone || c.length >= 5;
1976  
1977  const e = document.getElementById('counterparty-error');
1978  const i = document.getElementById('counterparty-input');
1979  
1980  if (c.length > 0 && !isValid) {
1981    e.style.display = 'block';
1982    i.style.borderColor = '#FF3B30';
1983  } else {
1984    e.style.display = 'none';
1985    i.style.borderColor = '';
1986  }
1987};
1988
1989function renderStep6() {
1990  const cd = calculateCommissionData(state.amount, state.currency);
1991  const f = calculateFinalSums(state.amount, cd.commission, state.commissionPayer);
1992  const sym = cd.currency.symbol;
1993  
1994  let ab = '';
1995  if (state.isCounterparty) {
1996    const s = getAgreementStats();
1997    ab = `
1998      <div class="glass-light" style="padding:16px;margin-bottom:16px"> <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px"> <div style="font-weight:600">📊 Статус согласования:</div> <div style="font-size:14px;font-weight:700;${s.allAgreed ? 'color:#30D158' : 'color:#FF9F0A'}">${s.agreedCount}/${s.totalCount} ✅</div> </div>
1999        ${renderAgreementRow('category', 'Категория')}
2000        ${renderAgreementRow('details', 'Детали')}
2001        ${renderAgreementRow('amount', 'Сумма')}
2002        ${renderAgreementRow('currency', 'Валюта')}
2003        ${renderAgreementRow('commissionPayer', 'Плательщик')}
2004        ${renderAgreementRow('deadline', 'Сроки')}
2005      </div> <div style="margin-bottom:16px"> <label style="display:block;font-size:14px;font-weight:500;margin-bottom:8px">💬 Комментарий для гаранта (если есть разногласия):</label> <textarea id="comment-input" class="input" style="font-size:14px;min-height:60px;resize:vertical" 
2006          placeholder="Например: предлагаю встретиться лично для передачи товара" 
2007          oninput="state.comment = this.value; saveState()">${state.comment || ''}</textarea> </div>`;
2008  }
2009  
2010  document.getElementById('quiz-container').innerHTML = `
2011    <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">${state.isCounterparty ? '🤝 Итоги согласования' : '✅ Подтверждение условий'}</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">
2012        ${state.isCounterparty ? 'Проверьте статус согласования и подтвердите' : 'Для создания сделки необходимо подтвердить согласие'}
2013      </p>
2014      
2015      ${ab}
2016      
2017      <div style="display:flex;flex-direction:column;gap:12px">
2018        ${renderCheckbox('agreement', state.isCounterparty 
2019          ? `Я ознакомился(ась) с условиями инициатора и статусом согласования` 
2020          : `Я согласовал(а) все условия с контрагентом: сумму (${formatNumber(state.amount)} ${sym}), предмет, сроки`)}
2021        ${renderCheckbox('commission', `Я ознакомился(ась) с комиссией гаранта (${(cd.commissionRate * 100).toFixed(1)}% = ${formatNumber(cd.commission)} ${sym}) и вариантом оплаты: ${getPayerLabel(state.commissionPayer)}`)}
2022        ${renderCheckbox('amounts', `Я понимаю итоговые суммы: покупатель заплатит ${formatNumber(f.buyerPays)} ${sym}, продавец получит ${formatNumber(f.sellerGets)} ${sym}`)}
2023        ${renderCheckbox('terms', `Я понимаю, что средства будут заблокированы на эскроу-счете с мультиподписью 2/3 до выполнения условий сделки`)}
2024        ${renderCheckbox('chat', `Я согласен(на) написать гаранту в MAX для создания чата сделки${state.isCounterparty ? ` с инициатором` : (state.counterparty ? ` с контрагентом` : '')}`)}
2025      </div> <div class="glass-light" style="padding:16px;margin-top:20px;background:rgba(48,209,88,.08);border:1px solid rgba(48,209,88,.2)"> <div style="font-size:12px;font-weight:600;color:#30D158;margin-bottom:4px">🛡️ 7-уровневая защита:</div> <p style="font-size:12px;color:rgba(255,255,255,.7)">AI-KYC → AML/KYT → Smart Contract → MultiSig 2/3 → Atomic Transfer → AI-арбитраж → Lloyd's $45M</p> </div>
2026      
2027      ${renderNavButtons(true, true)}
2028    </div>`;
2029}
2030
2031function renderAgreementRow(f, label) {
2032  const s = state.agreements[f];
2032  const ag = s === 'agreed';
2033  const pr = s === 'proposed';
2034  const txt = ag ? '✅ Согласовано' : (pr ? '⚠️ Есть предложение' : '⏳ Ожидает');
2035  
2036  let d = '';
2037  if (pr && state.proposals[f]) {
2038    if (f === 'category') {
2039      const c = dealCategories.find(x => x.id === state.proposals.category);
2040      d = `<div style="font-size:11px;color:#FF9F0A;margin-top:4px">Предложение: ${c?.name || state.proposals.category}</div>`;
2041    } else if (f === 'amount') {
2042      d = `<div style="font-size:11px;color:#FF9F0A;margin-top:4px">Предложение: ${formatNumber(state.proposals.amount)} ${state.currency}</div>`;
2043    } else if (f === 'currency') {
2044      d = `<div style="font-size:11px;color:#FF9F0A;margin-top:4px">Предложение: ${state.proposals.currency}</div>`;
2045    } else if (f === 'commissionPayer') {
2046      d = `<div style="font-size:11px;color:#FF9F0A;margin-top:4px">Предложение: ${getPayerLabel(state.proposals.commissionPayer)}</div>`;
2047    } else if (f === 'deadline') {
2048      d = `<div style="font-size:11px;color:#FF9F0A;margin-top:4px">Предложение: ${state.proposals.deadline}</div>`;
2049    } else if (f === 'details') {
2050      d = `<div style="font-size:11px;color:#FF9F0A;margin-top:4px">Предложение: ${state.proposals.details}</div>`;
2051    }
2052  }
2053  
2054  const bgColor = ag ? 'rgba(48,209,88,.15)' : (pr ? 'rgba(255,159,10,.15)' : 'rgba(255,255,255,.05)');
2055  const textColor = ag ? '#30D158' : (pr ? '#FF9F0A' : 'rgba(255,255,255,.4)');
2056  
2057  return `<div style="display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.1)"> <div style="flex:1"> <div style="font-size:14px">${label}</div>
2058      ${d}
2059    </div> <div style="font-size:11px;padding:4px 8px;border-radius:6px;font-weight:600;background:${bgColor};color:${textColor};white-space:nowrap">${txt}</div> </div>`;
2060}
2061
2062function getAgreementStats() {
2063  const fs = ['category', 'details', 'amount', 'currency', 'commissionPayer', 'deadline'];
2064  let c = 0;
2065  fs.forEach(f => { if (state.agreements[f] === 'agreed') c++; });
2066  return {agreedCount: c, totalCount: fs.length, allAgreed: c === fs.length};
2067}
2068
2069function renderCheckbox(k, l) {
2070  const c = state.confirmations[k];
2071  return `
2072    <div class="glass-light" style="padding:16px;cursor:pointer;transition:all .2s" onclick="toggleConfirmation('${k}')"> <div style="display:flex;align-items:flex-start;gap:12px"> <div style="width:20px;height:20px;border:2px solid rgba(255,255,255,.2);border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s;${c ? 'background:#30D158;border-color:#30D158' : ''}">
2073          ${c ? '<svg width="12" height="12" fill="none" stroke="#000" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"/></svg>' : ''}
2074        </div> <label style="font-size:14px;cursor:pointer;flex:1;line-height:1.4">${l}</label> </div> </div>`;
2075}
2076
2077window.toggleConfirmation = function(k) {
2078  state.confirmations[k] = !state.confirmations[k];
2079  saveState();
2080  renderStep();
2081};
2082
2083function renderStep7() {
2084  const cd = calculateCommissionData(state.amount, state.currency);
2085  const f = calculateFinalSums(state.amount, cd.commission, state.commissionPayer);
2086  const cat = dealCategories.find(c => c.id === state.category) || dealCategories[0];
2087  const sym = cd.currency.symbol;
2088  
2089  let as = '';
2090  if (state.isCounterparty) {
2091    const s = getAgreementStats();
2092    as = `
2093      <div class="glass-light" style="padding:20px;margin-bottom:16px"> <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px"> <div style="font-weight:700;color:#30D158">📊 Статус согласования</div> <div style="font-size:14px;font-weight:700;${s.allAgreed ? 'color:#30D158' : 'color:#FF9F0A'}">${s.agreedCount}/${s.totalCount} пунктов</div> </div>
2094        ${renderAgreementRow('category', 'Категория')}
2095        ${renderAgreementRow('details', 'Детали')}
2096        ${renderAgreementRow('amount', 'Сумма')}
2097        ${renderAgreementRow('currency', 'Валюта')}
2098        ${renderAgreementRow('commissionPayer', 'Плательщик')}
2099        ${renderAgreementRow('deadline', 'Сроки')}
2100        ${state.comment ? `
2101          <div style="margin-top:12px;padding-top:12px;border-top:1px solid rgba(255,255,255,.1)"> <div style="font-size:12px;color:rgba(255,255,255,.6);margin-bottom:4px">💬 Ваш комментарий:</div> <div style="font-size:14px">${state.comment}</div> </div>` : ''}
2102      </div>`;
2103  }
2104  
2105  document.getElementById('quiz-container').innerHTML = `
2106    <div class="animate-slide-in"> <h3 style="font-size:20px;font-weight:700;margin-bottom:8px">Итоговая сводка</h3> <p style="font-size:14px;color:rgba(255,255,255,.6);margin-bottom:20px">
2107        ${state.isCounterparty ? 'Проверьте и напишите гаранту в MAX' : 'Проверьте данные перед отправкой гаранту'}
2108      </p>
2109      
2110      ${state.isCounterparty ? `
2111        <div class="glass-light" style="padding:16px;margin-bottom:16px;background:rgba(10,132,255,.08);border:1px solid rgba(10,132,255,.2)"> <div style="display:flex;align-items:center;gap:12px"> <div style="font-size:24px">🤝</div> <div style="flex:1"> <div style="font-size:14px;font-weight:600;color:#0A84FF">Приглашение от инициатора</div> <div style="font-size:12px;color:rgba(255,255,255,.6)">Вы завершили согласование условий</div> </div> </div> </div>` : ''}
2112      
2113      ${as}
2114      
2115      <div class="glass-light" style="padding:20px;margin-bottom:16px;font-size:14px"> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Ваша роль:</span> <span style="font-weight:700">${state.role === 'buyer' ? '🛒 Покупатель' : '💼 Продавец'}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Категория:</span> <span style="font-weight:700">${cat.icon} ${cat.name}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Детали:</span> <span style="font-weight:700;text-align:right;max-width:60%;word-wrap:break-word">${state.details || '-'}</span> </div> <div style="border-top:1px solid rgba(255,255,255,.1);margin:8px 0"></div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Сумма сделки:</span> <span style="font-weight:700;font-size:16px">${formatNumber(state.amount)} ${sym}</span> </div> <div style="display:flex;justify-content:space-between;font-size:12px;color:rgba(255,255,255,.4);margin-bottom:8px"> <span>Эквивалент:</span> <span>${formatNumber(cd.amountInUSDT)} USDT</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Комиссия гаранта:</span> <span style="font-weight:700;color:#30D158">${formatNumber(cd.commission)} ${sym} (${(cd.commissionRate * 100).toFixed(1)}%)</span> </div> <div class="glass-light" style="padding:12px;margin:8px 0"> <div style="font-size:12px;color:rgba(255,255,255,.6);margin-bottom:4px">💳 Плательщик комиссии:</div> <div style="font-weight:700;color:#30D158">${getPayerIcon(state.commissionPayer)} ${getPayerLabel(state.commissionPayer)}</div> </div> <div style="border-top:1px solid rgba(255,255,255,.1);margin:8px 0"></div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">🛒 Покупатель заплатит:</span> <span style="font-weight:700">${formatNumber(f.buyerPays)} ${sym}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">💼 Продавец получит:</span> <span style="font-weight:700">${formatNumber(f.sellerGets)} ${sym}</span> </div> <div style="border-top:1px solid rgba(255,255,255,.1);margin:8px 0"></div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Сроки:</span> <span style="font-weight:700">${state.deadline || '-'}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">📱 Ваш MAX-контакт:</span> <span style="font-weight:700;color:#30D158">${state.myMaxContact || '-'}</span> </div> <div style="display:flex;justify-content:space-between"> <span style="color:rgba(255,255,255,.6)">${state.isCounterparty ? '👤 Инициатор:' : '👥 Контрагент:'}</span> <span style="font-weight:700;color:#30D158">${state.isCounterparty ? state.initiatorUsername : (state.counterparty || '-')}</span> </div> </div> <div class="glass-light" style="padding:16px;margin-bottom:16px;background:rgba(48,209,88,.08);border:1px solid rgba(48,209,88,.2)"> <div style="font-size:12px;font-weight:600;color:#30D158;margin-bottom:4px">✅ Готово к отправке</div> <p style="font-size:12px;color:rgba(255,255,255,.7)">
2116          ${state.isCounterparty 
2117            ? 'Нажмите «Написать гаранту» — откроется MAX со скопированными данными сделки.' 
2118            : 'Нажмите «Завершить и написать гаранту» — сможете пригласить контрагента или сразу написать гаранту в MAX.'}
2119        </p> </div> <div style="display:flex;flex-direction:column;gap:12px"> <button onclick="finalizeDeal()" class="btn-max animate-glow">
2120          📨 ${state.isCounterparty ? 'Написать гаранту в MAX' : 'Завершить и написать гаранту'}
2121        </button> <button onclick="prevStep()" class="btn btn-secondary">← Вернуться к редактированию</button> </div> </div>`;
2122}
2123
2124window.nextStep = function() {
2125  if (!validateCurrentStep()) return;
2126  saveFieldValues();
2127  if (currentStep < totalSteps) {
2128    currentStep++;
2129    renderStep();
2130  }
2131};
2132
2133window.prevStep = function() {
2134  saveFieldValues();
2135  if (currentStep > 1) {
2136    currentStep--;
2137    renderStep();
2138  } else {
2139    document.getElementById('quiz-container').classList.add('hidden');
2140    document.getElementById('progress-container').classList.add('hidden');
2141    document.getElementById('start-screen').classList.remove('hidden');
2142    document.getElementById('counterparty-banner').classList.add('hidden');    currentStep = 0;
2143  }
2144};
2145
2146function saveFieldValues() {
2147  const d = document.getElementById('details-input');
2148  if (d && !d.readOnly) state.details = d.value.trim();
2149  const dl = document.getElementById('deadline-input');
2150  if (dl && !dl.readOnly) state.deadline = dl.value.trim();
2151  const c = document.getElementById('counterparty-input');
2152  if (c) state.counterparty = c.value.trim();
2153  const m = document.getElementById('my-max-contact-input');
2154  if (m) state.myMaxContact = m.value.trim();
2155  const cm = document.getElementById('comment-input');
2156  if (cm) state.comment = cm.value.trim();
2157  saveState();
2158}
2159
2160// 🎯 ИСПРАВЛЕНО: validateCurrentStep case 5 — проверка myMaxContact для обоих
2161function validateCurrentStep() {
2162  switch(currentStep) {
2163    case 1:
2164      if (!state.role) { showToast('Выберите роль'); return false; }
2165      return true;
2166    case 2:
2167      if (state.isCounterparty) {
2168        if (state.agreements.category === 'pending') {
2169          showToast('Выберите: согласен или предложите своё');
2170          return false;
2171        }
2172        if (state.agreements.category === 'agreed') state.agreements.details = 'agreed';
2173        if (state.agreements.category === 'proposed') {
2174          if (!state.proposals.category) state.proposals.category = state.category;
2175          const d = document.querySelector('#proposal-details');
2176          if (d) state.proposals.details = d.value.trim();
2177          if (!state.proposals.details) {
2178            showToast('Укажите детали в вашем предложении');
2179            return false;
2180          }
2181        }
2182      } else {
2183        if (!state.category) { showToast('Выберите категорию'); return false; }
2184        const d = document.getElementById('details-input')?.value.trim();
2185        if (!d) { showToast('Уточните предмет сделки'); return false; }
2186        state.details = d;
2187      }
2188      return true;
2189    case 3:
2190      if (state.isCounterparty) {
2191        if (state.agreements.amount === 'pending') { showToast('Согласуйте сумму'); return false; }        if (state.agreements.currency === 'pending') { showToast('Согласуйте валюту'); return false; }
2192        if (state.agreements.commissionPayer === 'pending') { showToast('Согласуйте плательщика комиссии'); return false; }
2193        if (state.agreements.amount === 'proposed' && !state.proposals.amount) { showToast('Укажите свою сумму'); return false; }
2194        if (state.agreements.currency === 'proposed' && !state.proposals.currency) { showToast('Выберите свою валюту'); return false; }
2195        if (state.agreements.commissionPayer === 'proposed' && !state.proposals.commissionPayer) { showToast('Выберите свой вариант плательщика'); return false; }
2196      } else {
2197        const i = document.getElementById('amount-input');
2198        const a = parseFloat((i?.value || '0').replace(',', '.')) || 0;
2199        if (a <= 0) { showToast('Укажите корректную сумму'); return false; }
2200        if (a > 1e12) { showToast('Слишком большая сумма'); return false; }
2201        state.amount = a;
2202        
2203        const cd = calculateCommissionData(state.amount, state.currency);
2204        if (cd.amountInUSDT < MIN_DEAL_USDT) {
2205          showToast(`Минимум сделки: ${MIN_DEAL_USDT} USDT`);
2206          return false;
2207        }
2208        
2209        if (!state.commissionPayer) { showToast('Выберите плательщика комиссии'); return false; }
2210      }
2211      return true;
2212    case 4:
2213      if (state.isCounterparty) {
2214        if (state.agreements.deadline === 'pending') { showToast('Согласуйте сроки'); return false; }
2215        if (state.agreements.deadline === 'proposed' && !state.proposals.deadline) { showToast('Укажите свои сроки'); return false; }
2216      } else {
2217        const d = document.getElementById('deadline-input')?.value.trim();
2218        if (!d) { showToast('Укажите сроки'); return false; }
2219        state.deadline = d;
2220      }
2221      return true;
2222    case 5:
2223      // 🎯 Для обоих проверяем myMaxContact
2224      const myContact = document.getElementById('my-max-contact-input')?.value.trim();
2225      if (!myContact) {
2226        showToast('Укажите свой MAX-контакт для идентификации гарантом');
2227        return false;
2228      }
2229      state.myMaxContact = myContact;
2230      
2231      if (!state.isCounterparty) {
2232        const c = document.getElementById('counterparty-input')?.value.trim();
2233        
2234        const isValidLink = c && (c.includes('max.ru/') || c.includes('max.ru/u/'));
2235        const isValidPhone = c && /^[+]?[\d\s\-()]{5,}$/.test(c);
2236        const isValid = isValidLink || isValidPhone || (c && c.length >= 5);
2237        if (c && !isValid) {
2238          showToast('Некорректная MAX-ссылка или номер контрагента');
2239          return false;
2240        }        state.counterparty = c || '';
2241      }
2242      return true;
2243    case 6:
2244      const all = Object.values(state.confirmations).every(v => v);
2245      if (!all) { showToast('Необходимо подтвердить все условия'); return false; }
2246      return true;
2247    default:
2248      return true;
2249  }
2250}
2251
2252// 🎯 ИСПРАВЛЕНО: finalizeDeal — показывает MAX-контакт для обоих
2253window.finalizeDeal = function() {
2254  const cd = calculateCommissionData(state.amount, state.currency);
2255  const f = calculateFinalSums(state.amount, cd.commission, state.commissionPayer);
2256  const cat = dealCategories.find(c => c.id === state.category) || dealCategories[0];
2257  const sym = cd.currency.symbol;
2258  
2259  document.getElementById('modal-summary').innerHTML = `
2260    <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Роль:</span> <span style="font-weight:700">${state.role === 'buyer' ? '🛒 Покупатель' : '💼 Продавец'}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Категория:</span> <span style="font-weight:700">${cat.icon} ${cat.name}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Сумма:</span> <span style="font-weight:700">${formatNumber(state.amount)} ${sym}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Комиссия:</span> <span style="font-weight:700;color:#30D158">${formatNumber(cd.commission)} ${sym} (${(cd.commissionRate * 100).toFixed(1)}%)</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">Плательщик:</span> <span style="font-weight:700">${getPayerLabel(state.commissionPayer)}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">📱 Ваш MAX:</span> <span style="font-weight:700;color:#30D158">${state.myMaxContact || '-'}</span> </div> <div style="display:flex;justify-content:space-between;margin-bottom:8px"> <span style="color:rgba(255,255,255,.6)">${state.isCounterparty ? '👤 Инициатор:' : '👥 Контрагент:'}</span> <span style="font-weight:700;color:#30D158">${state.isCounterparty ? state.initiatorUsername : (state.counterparty || '-')}</span> </div> <div style="display:flex;justify-content:space-between"> <span style="color:rgba(255,255,255,.6)">Сроки:</span> <span style="font-weight:700">${state.deadline}</span> </div>`;
2261  
2262  if (state.isCounterparty) {
2263    document.getElementById('btn-max').classList.remove('hidden');
2264    document.getElementById('btn-invite').classList.add('hidden');
2265    document.getElementById('btn-invite-hint').classList.add('hidden');
2266    
2267    document.getElementById('final-modal-subtitle').textContent = 'Напишите гаранту в MAX со сводкой согласования';
2268    document.getElementById('final-hint-text').innerHTML = 
2269      '1. Нажмите "Открыть MAX" выше<br>' +
2270      '2. Данные сделки скопированы в буфер<br>' +
2271      '3. Вставьте в чат с гарантом<br>' +
2272      '4. Инициатор уже отправил свою заявку<br>' +
2273      '5. Гарант создаст общий чат сделки';
2274    
2275    const s = getAgreementStats();
2276    document.getElementById('agreement-summary-block').classList.remove('hidden');
2277    document.getElementById('agreement-summary-block').innerHTML = `
2278      <div class="glass-light" style="padding:16px;margin-bottom:16px"> <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px"> <div style="font-size:14px;font-weight:700">📊 Сводка согласования:</div> <div style="font-size:14px;font-weight:700;${s.allAgreed ? 'color:#30D158' : 'color:#FF9F0A'}">
2279            ${s.allAgreed ? '✅ Всё согласовано' : `⚠️ ${s.agreedCount}/${s.totalCount} пунктов`}
2280          </div> </div> <div style="font-size:12px;color:rgba(255,255,255,.6)">
2281          ${s.allAgreed 
2282            ? 'Все условия приняты. Гарант получит подтверждение.' 
2283            : 'Есть разногласия. Гарант поможет их урегулировать в MAX.'}
2284        </div> </div>`;
2285  } else {
2286    document.getElementById('btn-max').classList.remove('hidden');
2287    document.getElementById('btn-invite').classList.remove('hidden');
2288    document.getElementById('btn-invite-hint').classList.remove('hidden');
2289    
2290    document.getElementById('final-modal-subtitle').textContent = 'Пригласите контрагента или напишите гаранту';
2291    document.getElementById('final-hint-text').innerHTML = 
2292      '1. Отправьте ссылку контрагенту через MAX<br>' +
2293      '2. Контрагент согласует условия<br>' +
2294      '3. Оба пишете гаранту в MAX<br>' +
2295      '4. Гарант создаст общий чат сделки';
2296    
2297    document.getElementById('agreement-summary-block').classList.add('hidden');
2298  }
2299  
2300  document.getElementById('final-modal').classList.remove('hidden');
2301};
2302window.closeFinalModal = function() {
2303  document.getElementById('final-modal').classList.add('hidden');
2304};
2305
2306// 🎯 ИСПРАВЛЕНО: buildDealMessage — добавлен MAX-контакт для контрагента
2307function buildDealMessage(isInitiatorSending = false) {
2308  const cd = calculateCommissionData(state.amount, state.currency);
2309  const f = calculateFinalSums(state.amount, cd.commission, state.commissionPayer);
2310  const cat = dealCategories.find(c => c.id === state.category) || dealCategories[0];
2311  const r = state.role === 'buyer' ? 'Покупатель' : 'Продавец';
2312  const sym = cd.currency.symbol;
2313  
2314  let m = `🛡️ ЗАЯВКА НА БЕЗОПАСНУЮ СДЕЛКУ\n\n`;
2315  
2316  if (state.isCounterparty) {
2317    m += `📨 ОТ: Контрагент (${r})\n`;
2318    m += `📱 Мой MAX-контакт: ${state.myMaxContact || 'не указан'}\n`;
2319    m += `👤 Инициатор: ${state.initiatorUsername}\n\n`;
2320    m += `═══════════════════════════\n`;
2321    m += `🤝 Я — контрагент, согласовываю условия сделки\n`;
2322    m += `═══════════════════════════\n\n`;
2323  } else {
2324    m += `📨 ОТ: Инициатор (${r})\n`;
2325    m += `📱 Мой MAX-контакт: ${state.myMaxContact || 'не указан'}\n\n`;
2326    m += `═══════════════════════════\n`;
2327    m += `🤝 Я — инициатор сделки, условия следующие\n`;
2328    m += `═══════════════════════════\n\n`;
2329  }
2330  
2331  m += `${cat.icon} Категория: ${cat.name}\n`;
2332  m += `📦 Предмет: ${state.details}\n\n`;
2333  m += `💰 Сумма: ${formatNumber(state.amount)} ${sym}\n`;
2334  m += `💵 Эквивалент: ${formatNumber(cd.amountInUSDT)} USDT\n`;
2335  m += `💎 Комиссия: ${formatNumber(cd.commission)} ${sym} (${(cd.commissionRate * 100).toFixed(1)}%)\n`;
2336  m += `💳 Плательщик комиссии: ${getPayerLabel(state.commissionPayer)}\n\n`;
2337  m += `🛒 Покупатель заплатит: ${formatNumber(f.buyerPays)} ${sym}\n`;
2338  m += `💼 Продавец получит: ${formatNumber(f.sellerGets)} ${sym}\n\n`;
2339  m += `⏰ Сроки: ${state.deadline}\n`;
2340  
2341  if (!state.isCounterparty && state.counterparty) {
2342    m += `👥 Контрагент: ${state.counterparty}\n`;
2343    if (isInitiatorSending) {
2344      m += `📨 Ссылка-приглашение отправлена контрагенту\n`;
2345      m += `⏳ Ожидаю встречную заявку от контрагента\n`;
2346    }
2347  }
2348  
2349  if (state.isCounterparty) {
2350    const s = getAgreementStats();
2351    m += `\n═══════════════════════════\n`;    m += `📊 СТАТУС СОГЛАСОВАНИЯ (${s.agreedCount}/${s.totalCount}):\n`;
2352    m += `═══════════════════════════\n`;
2353    const fs = [
2354      {k: 'category', l: 'Категория'},
2355      {k: 'details', l: 'Детали'},
2356      {k: 'amount', l: 'Сумма'},
2357      {k: 'currency', l: 'Валюта'},
2358      {k: 'commissionPayer', l: 'Плательщик комиссии'},
2359      {k: 'deadline', l: 'Сроки'}
2360    ];
2361    fs.forEach(x => {
2362      const st = state.agreements[x.k];
2363      if (st === 'agreed') {
2364        m += `✅ ${x.l}: согласовано\n`;
2365      } else if (st === 'proposed') {
2366        let pt = '';
2367        if (x.k === 'category') {
2368          const c = dealCategories.find(y => y.id === state.proposals.category);
2369          pt = c?.name || state.proposals.category;
2370        } else if (x.k === 'amount') {
2371          pt = `${formatNumber(state.proposals.amount)} ${state.currency}`;
2372        } else if (x.k === 'currency') {
2373          pt = state.proposals.currency;
2374        } else if (x.k === 'commissionPayer') {
2375          pt = getPayerLabel(state.proposals.commissionPayer);
2376        } else if (x.k === 'deadline') {
2377          pt = state.proposals.deadline;
2378        } else if (x.k === 'details') {
2379          pt = state.proposals.details;
2380        }
2381        m += `⚠️ ${x.l}: инициатор предложил своё, контрагент предлагает: ${pt}\n`;
2382      } else {
2383        m += `⏳ ${x.l}: ожидает решения\n`;
2384      }
2385    });
2386    
2387    if (state.comment) {
2388      m += `\n💬 Комментарий контрагента: ${state.comment}\n`;
2389    }
2390    
2391    m += `\n═══════════════════════════\n`;
2392    m += `✅ Все чекбоксы подтверждения отмечены\n`;
2393    m += `🤝 Прошу создать общий чат сделки в MAX\n`;
2394    m += `═══════════════════════════\n`;
2395  } else {
2396    if (!state.counterparty) {
2397      m += `\n⚠️ Контрагент не указан — устная договорённость\n`;
2398    }
2399    m += `\n═══════════════════════════\n`;
2400    m += `✅ Все условия согласованы с контрагентом\n`;    m += `🤝 Прошу создать общий чат сделки в MAX\n`;
2401    m += `═══════════════════════════\n`;
2402  }
2403  
2404  return m;
2405}
2406
2407function buildSharePayload() {
2408  const p = {
2409    r: state.role,
2410    c: state.category,
2411    d: state.details,
2412    a: state.amount,
2413    cur: state.currency,
2414    cp: state.commissionPayer,
2415    dl: state.deadline,
2416    cpUser: state.counterparty,
2417    initiatorContact: state.myMaxContact || 'пользователь',
2418    ag: state.agreements,
2419    pr: state.proposals,
2420    ts: Date.now()
2421  };
2422  try {
2423    const j = JSON.stringify(p);
2424    const b = new TextEncoder().encode(j);
2425    const s = String.fromCharCode(...b);
2426    return btoa(s);
2427  } catch(e) {
2428    return encodeURIComponent(JSON.stringify(p));
2429  }
2430}
2431
2432window.contactMax = async function() {
2433  const message = buildDealMessage();
2434  
2435  const success = await copyToClipboard(message);
2436  
2437  if (success) {
2438    showToast('✅ Данные скопированы! Открываю MAX...');
2439  } else {
2440    showToast('⚠️ Скопируйте данные вручную. Открываю MAX...');
2441  }
2442  
2443  setTimeout(() => {
2444    window.open(MAX_URL, '_blank');
2445  }, 1000);
2446  
2447  setTimeout(() => {
2448    closeFinalModal();
2449  }, 1500);};
2450
2451window.inviteCounterparty = function() {
2452  if (!state.counterparty) {
2453    showToast('⚠️ Укажите MAX-контакт контрагента на шаге 5');
2454    return;
2455  }
2456  
2457  const payload = buildSharePayload();
2458  const baseUrl = window.location.origin + window.location.pathname;
2459  const inviteUrl = `${baseUrl}?deal=${payload}`;
2460  window.currentInviteLink = inviteUrl;
2461  
2462  document.getElementById('invite-link-display').textContent = inviteUrl;
2463  document.getElementById('final-modal').classList.add('hidden');
2464  document.getElementById('invite-modal').classList.remove('hidden');
2465};
2466
2467window.closeInviteModal = function() {
2468  document.getElementById('invite-modal').classList.add('hidden');
2469  document.getElementById('final-modal').classList.remove('hidden');
2470};
2471
2472window.shareInviteLink = function() {
2473  const link = window.currentInviteLink;
2474  
2475  if (navigator.share) {
2476    navigator.share({
2477      title: 'Приглашение в сделку через ГАРАНТ СДЕЛОК №1',
2478      text: '🤝 Приглашение в безопасную сделку через MAX',
2479      url: link
2480    }).catch(err => {
2481      console.log('Share failed:', err);
2482      copyInviteLink();
2483    });
2484  } else {
2485    copyInviteLink();
2486  }
2487};
2488
2489window.copyInviteLink = async function() {
2490  const link = window.currentInviteLink;
2491  const success = await copyToClipboard(link);
2492  
2493  if (success) {
2494    showToast('✅ Ссылка скопирована!');
2495  } else {
2496    showToast('❌ Не удалось скопировать');
2497  }
2498};
2499window.copyDealData = async function() {
2500  const message = buildDealMessage();
2501  const success = await copyToClipboard(message);
2502  
2503  if (success) {
2504    showToast('✅ Данные скопированы!');
2505  } else {
2506    showToast('❌ Не удалось скопировать');
2507  }
2508};
2509
2510async function copyToClipboard(text) {
2511  if (navigator.clipboard && navigator.clipboard.writeText) {
2512    try {
2513      await navigator.clipboard.writeText(text);
2514      return true;
2515    } catch(e) {
2516      console.warn('Clipboard API failed:', e);
2517    }
2518  }
2519  
2520  try {
2521    const textarea = document.createElement('textarea');
2522    textarea.value = text;
2523    textarea.style.position = 'fixed';
2524    textarea.style.opacity = '0';
2525    textarea.style.top = '0';
2526    textarea.style.left = '0';
2527    document.body.appendChild(textarea);
2528    textarea.focus();
2529    textarea.select();
2530    textarea.setSelectionRange(0, 99999);
2531    
2532    const success = document.execCommand('copy');
2533    document.body.removeChild(textarea);
2534    return success;
2535  } catch(e) {
2536    console.warn('Fallback copy failed:', e);
2537    return false;
2538  }
2539}
2540
2541function showToast(message) {
2542  const existing = document.querySelector('.toast');
2543  if (existing) existing.remove();
2544  
2545  const toast = document.createElement('div');
2546  toast.className = 'toast';
2547  toast.textContent = message;  document.body.appendChild(toast);
2548  
2549  setTimeout(() => toast.remove(), 2500);
2550}
2551
2552const dealIds = ["P-41063", "E-12386", "T-89234", "S-45671", "C-78912", "D-23456", "X-99812", "A-11223", "B-44556", "F-77889"];
2553const dealAmounts = [7101.16, 1789.06, 2450.50, 890.25, 3456.78, 5234.90, 1234.56, 6789.12, 15234.99, 9876.54];
2554
2555let liveDeals = [
2556  {id: "P-41063", amount: 7101.16, status: "Защищена", time: "только что"},
2557  {id: "E-12386", amount: 1789.06, status: "Защищена", time: "2 мин назад"},
2558  {id: "T-89234", amount: 2450.50, status: "Защищена", time: "5 мин назад"}
2559];
2560
2561function updateLiveTicker() {
2562  const newDeal = {
2563    id: dealIds[Math.floor(Math.random() * dealIds.length)],
2564    amount: dealAmounts[Math.floor(Math.random() * dealAmounts.length)],
2565    status: "Защищена",
2566    time: "только что"
2567  };
2568  liveDeals.unshift(newDeal);
2569  if (liveDeals.length > 10) liveDeals.pop();
2570  
2571  const ticker = document.getElementById('live-ticker');
2572  if (ticker) {
2573    ticker.innerHTML = liveDeals.map(d => `
2574      <div class="ticker-item"> <span style="font-size:12px">🔒</span> <span style="font-size:12px;font-weight:600;color:#30D158">Сделка #${d.id}</span> <span style="font-size:12px;color:rgba(255,255,255,.6)">${formatNumber(d.amount)} USDT</span> <span style="font-size:12px;color:#30D158">✓ ${d.status}</span> </div>`).join('');
2575  }
2576}
2577
2578function updateLiveStats() {
2579  const dealsEl = document.getElementById('stat-deals');
2580  const amountEl = document.getElementById('stat-amount');
2581  
2582  if (dealsEl) {
2583    const currentDeals = parseInt(dealsEl.textContent.replace(/,/g, '')) || 10247;
2584    dealsEl.textContent = (currentDeals + Math.floor(Math.random() * 3) + 1).toLocaleString();
2585  }
2586  if (amountEl) {
2587    const amounts = ['$12.4M', '$12.5M', '$12.6M', '$12.7M'];
2588    amountEl.textContent = amounts[Math.floor(Math.random() * amounts.length)];
2589  }
2590}
2591handleUrlParams();
2592fetchLiveRates();
2593setInterval(fetchLiveRates, 5 * 60 * 1000);
2594setInterval(updateLiveTicker, 5000);
2595setInterval(updateLiveStats, 10000);
2596
2597let lastTouchEnd = 0;
2598document.addEventListener('touchend', e => {
2599  const now = Date.now();
2600  if (now - lastTouchEnd <= 300) e.preventDefault();
2601  lastTouchEnd = now;
2602}, false);
2603
2604console.log('🛡️ ГАРАНТ СДЕЛОК MAX v4 — финальная версия с MAX-контактами для обоих');
2605console.log('📱 MAX-ссылка гаранта:', MAX_URL);
2606console.log('📞 Телефон гаранта:', MAX_PHONE_FORMATTED);
2607console.log('💰 Минимум сделки:', MIN_DEAL_USDT, 'USDT');
2608console.log('✅ Исправлено: поле MAX-контакта для контрагента + валидация + сообщение гаранту');
2609})();
2610</script>
2610 <!-- nominify end --> </div> </div> </div> </div> <div id="rec2371180541" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> 
2610<script src="https://public.bnbstatic.com/unpkg/growth-widget/[email protected]" ></script>
2610<div class="binance-widget-marquee" data-cmc-ids="1,1027,52,5426,3408,74,2010,20947,5994,13502,24478,35336" data-theme="dark" data-transparent="false" data-locale="en" data-fiat="USD" data-powered-by="Powered by" data-disclaimer="Disclaimer" ></div> <!-- nominify end --> </div> </div> </div> </div> </div> <!--/allrecords--> <!-- Stat --> <!-- Yandex.Metrika counter 96668743 --> 
2610<script type="text/javascript" data-tilda-cookie-type="analytics">setTimeout(function(){(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");window.mainMetrikaId='96668743';ym(window.mainMetrikaId,"init",{clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:false});},2000);</script>
2610 <noscript><div><img src="https://mc.yandex.ru/watch/96668743" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> 
2610<script type="text/javascript">if(!window.mainTracker) {window.mainTracker='tilda';}
2611window.tildastatcookie='no';window.tildastatscroll='yes';setTimeout(function(){(function(d,w,k,o,g) {var n=d.getElementsByTagName(o)[0],s=d.createElement(o),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.key=k;s.id="tildastatscript";s.src=g;if(w.opera=="[object Opera]") {d.addEventListener("DOMContentLoaded",f,false);} else {f();}})(document,window,'f31f3f37a992862b73e6d239d17af48c','script','https://static.tildacdn.com/js/tilda-stat-1.0.min.js');},2000);</script>
2611 </body> </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.