PageSourceSearch

https://clipchat.ai/en-GB

html clipchat.ai collected 2026-10-05 11:55:30 UTC 276,125 bytes, 3,143 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-GB" dir="ltr">
3<head>
4  <!-- Top.Mail.Ru counter -->
5<script type="text/javascript">
6var _tmr = window._tmr || (window._tmr = []);
7_tmr.push({id: "3788553", type: "pageView", start: (new Date()).getTime(), pid: "USER_ID"});
8(function (d, w, id) {
9if (d.getElementById(id)) return;
10var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;
11ts.src = "https://top-fwz1.mail.ru/js/code.js";
12var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};
13if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
14})(document, window, "tmr-code");
15</script>
15
16<noscript><div><img src="https://top-fwz1.mail.ru/counter?id=3788553;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div></noscript>
17<!-- /Top.Mail.Ru counter -->
18
19  <meta charset="utf-8">
20  <meta name="viewport" content="width=device-width, initial-scale=1">
21  <title>AI Music Video Generator for Finished Songs | ClipChat</title>
22  <meta name="description" content="ClipChat analyses the music, develops a concept, generates shots and edits a publication-ready music video" />
23  
24  <link rel="canonical" href="https://clipchat.ai/en-GB" />
25  <meta property="og:type" content="website" />
26  <meta property="og:title" content="AI Music Video Generator for Finished Songs | ClipChat" />
27  <meta property="og:description" content="ClipChat analyses the music, develops a concept, generates shots and edits a publication-ready music video" />
28  <meta property="og:url" content="https://clipchat.ai/en-GB" />
29  <meta property="og:image" content="https://clipchat.ai/og/clipchat-og.png" />
30  <meta name="twitter:card" content="summary_large_image" />
31  
31<script src="/lp/homepage-v5/desktop2/support.js?v=1786532709"></script>
31
32  
32<script src="/lp/clipchat-media.js?v=1789575453"></script>
32
33  
33<script defer src="/lp/clipchat-intro-offer.js?v=1789220134"></script>
33
34  <!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 34-35
34
35<script async src="https://www.googletagmanager.com/gtag/js?id=
35G-FMWKD01EQ9
vendor: 12 bytes, line 35
35"></script>
36<script>
37  
vendor: 134 bytes, lines 37-41
37window.dataLayer = window.dataLayer || [];
38  function gtag(){dataLayer.push(arguments);}
39  gtag('js', new Date());
40
41  gtag('config', '
41G-FMWKD01EQ9
vendor: 4 bytes, line 41
41');
42</script>
42
43
44  <!-- Google tag (gtag.js) - Google Ads -->
vendor: 64 bytes, lines 44-45
44
45<script async src="https://www.googletagmanager.com/gtag/js?id=
45AW-17789712385
vendor: 12 bytes, line 45
45"></script>
46<script>
47  window.dataLayer = window.dataLayer || [];
48  function gtag(){dataLayer.push(arguments);}
49  gtag('js', new Date());
50
51  // conversion_linker: stores the gclid/wbraid in a first-party _gcl_* cookie so the
52  // click survives the landing -> /sign -> checkout hop (it is Google's default, set
53  // explicitly so nobody "cleans it up" later).
54  // allow_enhanced_conversions: lets us send hashed first-party data (email) alongside
55  // the click; the server-side twin (offline conversion upload) needs a Google
56  // Ads developer token, which we do not have yet — see the note above.
57  gtag('config', 'AW-17789712385', {
58    conversion_linker: true,
59    allow_enhanced_conversions: true
60  });
61</script>
61
62
63  <!-- Meta Pixel Code -->
64<script>
vendor: 399 bytes, lines 64-73
64
65!function(f,b,e,v,n,t,s)
66{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
67n.callMethod.apply(n,arguments):n.queue.push(arguments)};
68if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
69n.queue=[];t=b.createElement(e);t.async=!0;
70t.src=v;s=b.getElementsByTagName(e)[0];
71s.parentNode.insertBefore(t,s)}(window, document,'script',
72'https://connect.facebook.net/en_US/fbevents.js');
73fbq('init', '
731060257096470271
vendor: 30 bytes, lines 73-74
73');
74fbq('track', 'PageView');
75</script>
75
76<!-- End Meta Pixel Code -->
77
78  <!-- Yandex.Metrika counter -->
79<script type="text/javascript">
vendor: 430 bytes, lines 79-86
79
80      (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
81        m[i].l=1*new Date();
82        for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
83        k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
84      (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
85
86      ym(
86111369311
vendor: 157 bytes, lines 86-92
86, "init", {
87        clickmap:true,
88        trackLinks:true,
89        accurateTrackBounce:true,
90        webvisor:true,
91        ecommerce:"dataLayer"
92      });
93</script>
93
94<!-- /Yandex.Metrika counter -->
95
96  
96<script>
97  !function(w,d){
98    if(!w.rdt){
99      var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};
100      p.callQueue=[];
101      var t=d.createElement("script");
102      t.src="https://www.redditstatic.com/ads/pixel.js";t.async=!0;
103      var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)
104    }
105  }(window,document);
106  rdt('init','a2_gg0xwdw735in');
107  rdt('track', 'PageVisit');
108</script>
108
109
110  <style>
111  /* ===== Modal overlay wrapper (doitong auth) ===== */
112  .dtam-overlay {
113    position: fixed; inset: 0;
114    z-index: 9999;
115    display: none;
116    align-items: center; justify-content: center;
117    background: rgba(0,0,0,0.72);
118    backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
119    padding: 20px;
120    opacity: 0;
121    transition: opacity 0.2s ease;
122  }
123  .dtam-overlay.open { display: flex; opacity: 1; }
124  .dtam-card {
125    position: relative;
126    width: 100%; max-width: 420px;
127    background: #0E0E12;
128    border: 1px solid rgba(255,255,255,0.08);
129    border-radius: 24px;
130    padding: 36px 28px 28px;
131    display: flex; flex-direction: column; align-items: center;
132    max-height: 90vh; overflow-y: auto;
133    box-shadow: 0 32px 80px rgba(0,0,0,0.6);
134    transform: translateY(8px);
135    transition: transform 0.25s cubic-bezier(.4,0,.2,1);
136  }
137  .dtam-overlay.open .dtam-card { transform: translateY(0); }
138  .dtam-close {
139    position: absolute; top: 14px; right: 14px;
140    width: 32px; height: 32px; border-radius: 50%;
141    background: rgba(255,255,255,0.05);
142    border: 1px solid rgba(255,255,255,0.08);
143    color: rgba(255,255,255,0.6);
144    display: flex; align-items: center; justify-content: center;
145    cursor: pointer; transition: all 0.15s;
146    font-size: 16px; line-height: 1;
147  }
148  .dtam-close:hover { background: rgba(255,255,255,0.1); color: #fff; }
149
150  /* Lock icon on top */
151  .paywall-lock-icon {
152    width: 64px; height: 64px; border-radius: 50%;
153    background: rgba(255,255,255,0.04);
154    border: 1.5px solid rgba(255,255,255,0.08);
155    display: flex; align-items: center; justify-content: center;
156    margin-bottom: 18px;
157  }
158  .paywall-title {
159    font-size: 20px; font-weight: 700; color: #fff;
160    margin-bottom: 6px; text-align: center;
161    font-family: 'Montserrat', 'Inter', -apple-system, sans-serif;
162  }
163  .paywall-subtitle {
164    font-size: 13px; color: rgba(255,255,255,0.6);
165    margin-bottom: 22px; text-align: center;
166    max-width: 320px; line-height: 1.5;
167  }
168
169  /* Button base */
170  .pw-btn {
171    display: flex; align-items: center; justify-content: center;
172    gap: 8px; width: 100%; padding: 13px 20px;
173    border-radius: 12px; font-weight: 600; font-size: 14.5px;
174    cursor: pointer; transition: all 0.2s; border: none;
175    font-family: inherit;
176  }
177  .pw-btn-primary {
178    background: linear-gradient(135deg, #FF6F61 0%, #E85A4F 100%);
179    color: #fff;
180    box-shadow: 0 4px 18px rgba(255,111,97,0.3);
181  }
182  .pw-btn-primary:hover { transform: translateY(-1px); box-shadow: 0 6px 22px rgba(255,111,97,0.45); }
183  .pw-btn-primary:disabled { opacity: 0.55; cursor: not-allowed; transform: none; }
184
185  /* Error/loading shared */
186  .pw-error {
187    display: none;
188    font-size: 13px; color: #ff6b6b;
189    text-align: center; padding: 8px 0 0; line-height: 1.4;
190  }
191  .pw-error.visible { display: block; }
192  .pw-spinner {
193    display: inline-block; width: 14px; height: 14px;
194    border: 2px solid rgba(255,255,255,0.3);
195    border-top-color: #fff; border-radius: 50%;
196    animation: dtam-spin 0.6s linear infinite;
197  }
198  @keyframes dtam-spin { to { transform: rotate(360deg); } }
199
200  /* ===== Inline auth form ===== */
201  .auth-step { display: none; width: 100%; max-width: 340px; }
202  .auth-step.active { display: block; }
203  .auth-form { display: flex; flex-direction: column; gap: 10px; }
204  .auth-input {
205    width: 100%; padding: 14px 16px;
206    border-radius: 12px;
207    border: 1px solid rgba(255,255,255,0.15);
208    background: rgba(255,255,255,0.04);
209    color: #fff; font-size: 15px; outline: none;
210    transition: border-color 0.2s; box-sizing: border-box;
211    font-family: inherit;
212  }
213  .auth-input::placeholder { color: rgba(255,255,255,0.35); }
214  .auth-input:focus { border-color: #FF6F61; }
215  .auth-password-wrap { position: relative; width: 100%; }
216  .auth-password-wrap .auth-input { padding-right: 48px; }
217  .auth-eye-btn {
218    position: absolute; right: 12px; top: 50%;
219    transform: translateY(-50%);
220    background: none; border: none;
221    color: rgba(255,255,255,0.4); cursor: pointer;
222    padding: 4px; display: flex; align-items: center;
223  }
224  .auth-eye-btn:hover { color: rgba(255,255,255,0.7); }
225  .auth-hint {
226    font-size: 12px; color: rgba(255,255,255,0.35); margin-top: -2px;
227  }
228  .auth-email-header {
229    display: flex; align-items: center; gap: 8px;
230    padding: 10px 14px;
231    background: rgba(255,255,255,0.04);
232    border-radius: 10px;
233    border: 1px solid rgba(255,255,255,0.08);
234    margin-bottom: 12px;
235  }
236  .auth-email-header span {
237    font-size: 13px; color: rgba(255,255,255,0.6);
238    flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
239  }
240  .auth-back-btn {
241    background: none; border: none;
242    color: rgba(255,255,255,0.5);
243    cursor: pointer; padding: 2px;
244    display: flex; align-items: center;
245  }
246  .auth-back-btn:hover { color: #fff; }
247  .auth-forgot-link { text-align: right; margin-top: -2px; }
248  .auth-forgot-link a {
249    font-size: 12.5px; color: #FF6F61;
250    cursor: pointer; text-decoration: none;
251  }
252  .auth-forgot-link a:hover { text-decoration: underline; }
253  .auth-divider {
254    display: flex; align-items: center; gap: 12px;
255    margin: 16px 0 12px; width: 100%; max-width: 340px;
256  }
257  .auth-divider::before, .auth-divider::after {
258    content: ''; flex: 1; height: 1px;
259    background: rgba(255,255,255,0.1);
260  }
261  .auth-divider span {
262    font-size: 12px; color: rgba(255,255,255,0.35);
263  }
264  .auth-oauth {
265    display: flex; flex-direction: column; gap: 10px;
266    width: 100%; max-width: 340px;
267  }
268  .auth-oauth-btn {
269    display: flex; align-items: center; justify-content: center;
270    gap: 10px; width: 100%; padding: 12px 20px;
271    border-radius: 12px;
272    background: transparent;
273    color: rgba(255,255,255,0.85);
274    border: 1px solid rgba(255,255,255,0.15);
275    font-size: 14px; font-weight: 500;
276    cursor: pointer; transition: all 0.2s;
277    font-family: inherit;
278  }
279  .auth-oauth-btn:hover {
280    border-color: rgba(255,255,255,0.3);
281    background: rgba(255,255,255,0.05);
282  }
283  .auth-oauth-btn svg { flex-shrink: 0; }
284  .auth-create-box {
285    text-align: center; padding: 16px;
286    margin-bottom: 14px;
287    border-radius: 16px;
288    border: 1px solid rgba(74,222,128,0.22);
289    background: linear-gradient(135deg, rgba(74,222,128,0.06) 0%, rgba(74,222,128,0.02) 100%);
290  }
291  .auth-create-icon {
292    width: 42px; height: 42px; border-radius: 50%;
293    background: rgba(74,222,128,0.12);
294    display: flex; align-items: center; justify-content: center;
295    margin: 0 auto 8px;
296  }
297  .auth-success-msg {
298    padding: 14px 16px; border-radius: 12px;
299    background: rgba(74,222,128,0.1);
300    border: 1px solid rgba(74,222,128,0.22);
301    color: #4ade80; font-size: 13px;
302    text-align: center; line-height: 1.5;
303  }
304</style>
305
306    <link rel="alternate" hreflang="en-US" href="https://clipchat.ai/" />
307    <link rel="alternate" hreflang="en-GB" href="https://clipchat.ai/en-GB/" />
308    <link rel="alternate" hreflang="ru" href="https://clipchat.ai/ru/" />
309    <link rel="alternate" hreflang="ar" href="https://clipchat.ai/ar/" />
310    <link rel="alternate" hreflang="bn" href="https://clipchat.ai/bn/" />
311    <link rel="alternate" hreflang="cs" href="https://clipchat.ai/cs/" />
312    <link rel="alternate" hreflang="cy" href="https://clipchat.ai/cy/" />
313    <link rel="alternate" hreflang="da" href="https://clipchat.ai/da/" />
314    <link rel="alternate" hreflang="de" href="https://clipchat.ai/de/" />
315    <link rel="alternate" hreflang="el" href="https://clipchat.ai/el/" />
316    <link rel="alternate" hreflang="es-ES" href="https://clipchat.ai/es-ES/" />
317    <link rel="alternate" hreflang="es-MX" href="https://clipchat.ai/es-MX/" />
318    <link rel="alternate" hreflang="fa" href="https://clipchat.ai/fa/" />
319    <link rel="alternate" hreflang="fi" href="https://clipchat.ai/fi/" />
320    <link rel="alternate" hreflang="fil" href="https://clipchat.ai/fil/" />
321    <link rel="alternate" hreflang="fr-CA" href="https://clipchat.ai/fr-CA/" />
322    <link rel="alternate" hreflang="fr-FR" href="https://clipchat.ai/fr-FR/" />
323    <link rel="alternate" hreflang="ga" href="https://clipchat.ai/ga/" />
324    <link rel="alternate" hreflang="gd" href="https://clipchat.ai/gd/" />
325    <link rel="alternate" hreflang="he" href="https://clipchat.ai/he/" />
326    <link rel="alternate" hreflang="hi" href="https://clipchat.ai/hi/" />
327    <link rel="alternate" hreflang="hr" href="https://clipchat.ai/hr/" />
328    <link rel="alternate" hreflang="hu" href="https://clipchat.ai/hu/" />
329    <link rel="alternate" hreflang="id" href="https://clipchat.ai/id/" />
330    <link rel="alternate" hreflang="is" href="https://clipchat.ai/is/" />
331    <link rel="alternate" hreflang="it" href="https://clipchat.ai/it/" />
332    <link rel="alternate" hreflang="ja" href="https://clipchat.ai/ja/" />
333    <link rel="alternate" hreflang="kk" href="https://clipchat.ai/kk/" />
334    <link rel="alternate" hreflang="ko" href="https://clipchat.ai/ko/" />
335    <link rel="alternate" hreflang="lb" href="https://clipchat.ai/lb/" />
336    <link rel="alternate" hreflang="lt" href="https://clipchat.ai/lt/" />
337    <link rel="alternate" hreflang="lv" href="https://clipchat.ai/lv/" />
338    <link rel="alternate" hreflang="mi" href="https://clipchat.ai/mi/" />
339    <link rel="alternate" hreflang="ms" href="https://clipchat.ai/ms/" />
340    <link rel="alternate" hreflang="mt" href="https://clipchat.ai/mt/" />
341    <link rel="alternate" hreflang="nl" href="https://clipchat.ai/nl/" />
342    <link rel="alternate" hreflang="no" href="https://clipchat.ai/no/" />
343    <link rel="alternate" hreflang="pa" href="https://clipchat.ai/pa/" />
344    <link rel="alternate" hreflang="pl" href="https://clipchat.ai/pl/" />
345    <link rel="alternate" hreflang="pt-BR" href="https://clipchat.ai/pt-BR/" />
346    <link rel="alternate" hreflang="pt-PT" href="https://clipchat.ai/pt-PT/" />
347    <link rel="alternate" hreflang="rm" href="https://clipchat.ai/rm/" />
348    <link rel="alternate" hreflang="rom" href="https://clipchat.ai/rom/" />
349    <link rel="alternate" hreflang="se" href="https://clipchat.ai/se/" />
350    <link rel="alternate" hreflang="sl" href="https://clipchat.ai/sl/" />
351    <link rel="alternate" hreflang="sv" href="https://clipchat.ai/sv/" />
352    <link rel="alternate" hreflang="sw" href="https://clipchat.ai/sw/" />
353    <link rel="alternate" hreflang="ta" href="https://clipchat.ai/ta/" />
354    <link rel="alternate" hreflang="th" href="https://clipchat.ai/th/" />
355    <link rel="alternate" hreflang="tr" href="https://clipchat.ai/tr/" />
356    <link rel="alternate" hreflang="ur" href="https://clipchat.ai/ur/" />
357    <link rel="alternate" hreflang="vi" href="https://clipchat.ai/vi/" />
358    <link rel="alternate" hreflang="yi" href="https://clipchat.ai/yi/" />
359    <link rel="alternate" hreflang="zh-CN" href="https://clipchat.ai/zh-CN/" />
360    <link rel="alternate" hreflang="zh-TW" href="https://clipchat.ai/zh-TW/" />
361  <link rel="alternate" hreflang="x-default" href="https://clipchat.ai/" />
362</head>
363<body>
364<x-dc>
365<helmet data-dc-atomics>
366  <link rel="preconnect" href="https://fonts.googleapis.com" />
367  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
368  <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,[email protected],300..800&amp;family=Instrument+Sans:wght@400;500;600&amp;family=Instrument+Serif:ital@0;1&amp;family=Space+Mono:wght@400;700&amp;display=swap" rel="stylesheet" />
369  <style>
370    :root{--bg:#0A0A0C;--panel:#121215;--panel2:#17171B;--ink:#F4F1EA;--dim:#8B8B95;--dark:#55555E;--acc:#FF3D2E;--acc2:#FF8A5C;--line:rgba(244,241,234,0.09);--line2:rgba(244,241,234,0.16)}
371    body{margin:0;background:var(--bg);color:var(--ink);font-family:'Instrument Sans',sans-serif;-webkit-font-smoothing:antialiased}
372    a{color:var(--acc)}
373    a:hover{color:var(--acc2)}
374    .is-hidden{display:none !important}
375    @media (prefers-reduced-motion: no-preference){.pulse{animation:pulse .9s ease-in-out infinite alternate}}
376    @keyframes floatA{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(18px,-26px,0) scale(1.12)}}
377    @keyframes floatB{0%,100%{transform:translate3d(0,0,0) scale(1.05)}50%{transform:translate3d(-22px,20px,0) scale(0.94)}}
378    @keyframes riseIn{from{opacity:0;transform:translateY(22px);filter:blur(8px)}to{opacity:1;transform:none;filter:blur(0)}}
379    @keyframes marq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
380    @keyframes shine{0%{transform:translateX(-140%) skewX(-18deg)}55%,100%{transform:translateX(260%) skewX(-18deg)}}
381    @keyframes spin{to{transform:rotate(1turn)}}
382    @keyframes noteGlow{0%,100%{box-shadow:0 0 0 1px rgba(255,61,46,0.35),0 0 34px rgba(255,61,46,0.10)}50%{box-shadow:0 0 0 1px rgba(255,61,46,0.7),0 0 54px rgba(255,61,46,0.26)}}
383    @keyframes ticker{to{background-position:-260px 0}}
384    @keyframes eqmini{0%,100%{transform:scaleY(0.3)}50%{transform:scaleY(1)}}
385    @keyframes wipeIn{from{clip-path:inset(0 100% 0 0);opacity:0;transform:scale(1.07)}to{clip-path:inset(0 0 0 0);opacity:1;transform:none}}
386    @keyframes scan{0%{transform:translateX(-120%);opacity:0}12%{opacity:1}88%{opacity:1}100%{transform:translateX(120%);opacity:0}}
387    @keyframes lockRing{0%{box-shadow:0 0 0 0 rgba(255,61,46,0.55)}70%{box-shadow:0 0 0 12px rgba(255,61,46,0)}100%{box-shadow:0 0 0 0 rgba(255,61,46,0)}}
388    @keyframes pop{from{opacity:0;transform:scale(0.4) rotate(-18deg)}to{opacity:1;transform:none}}
389    @keyframes eq{0%,100%{transform:scaleY(0.22)}50%{transform:scaleY(1)}}
390    @keyframes ctaGlow{0%,100%{box-shadow:0 0 28px rgba(255,61,46,0.35)}50%{box-shadow:0 0 52px rgba(255,61,46,0.62)}}
391    button:active{transform:scale(0.975)}
392    button{transition:transform .12s ease,opacity .2s ease,filter .2s ease}
393    button:disabled{cursor:progress;transform:none}
394    button:focus-visible,a:focus-visible{outline:2px solid #FF3D2E;outline-offset:3px;border-radius:8px}
395    @keyframes ring{to{transform:rotate(1turn)}}
396    @keyframes tmIn{from{transform:translate3d(-26px,32px,0) scale(0.96);filter:blur(6px)}to{transform:none;filter:blur(0)}}
397    @keyframes tileIn{from{opacity:0;transform:translateY(34px) scale(0.94);clip-path:inset(0 0 100% 0);filter:blur(12px)}to{opacity:1;transform:none;clip-path:inset(0 0 0 0);filter:blur(0)}}
398    @keyframes tileSweep{0%{transform:translateX(-140%)}100%{transform:translateX(340%)}}
399    html{scroll-behavior:smooth}
400    ::selection{background:#FF3D2E;color:#16090A}
401    ::-webkit-scrollbar{width:11px}
402    ::-webkit-scrollbar-track{background:#0A0A0C}
403    ::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#3A2320,#1E1512);border:3px solid #0A0A0C;border-radius:999px}
404    ::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#FF6A4D,#C42A1B)}
405    @keyframes preOut{to{opacity:0;visibility:hidden}}
406    @keyframes preIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
407    @keyframes lane{from{transform:translateX(0)}to{transform:translateX(-50%)}}
408    @keyframes laneBack{from{transform:translateX(-50%)}to{transform:translateX(0)}}
409    @keyframes faceScan{0%{top:-2%;opacity:0}12%{opacity:1}88%{opacity:1}100%{top:100%;opacity:0}
409}
410    @keyframes markerIn{0%,8%{opacity:0;transform:scale(0.4)}18%{opacity:1;transform:scale(1)}92%{opacity:1;transform:scale(1)}100%{opacity:0.5;transform:scale(1)}}
411    @keyframes linkFlow{to{stroke-dashoffset:-40}}
412    @keyframes lightOn{from{clip-path:inset(100% 0 0 0);opacity:0.2}to{clip-path:inset(0 0 0 0);opacity:1}}
413    @keyframes monIn{from{opacity:0;transform:scale(1.06);clip-path:inset(0 0 100% 0)}to{opacity:1;transform:scale(1);clip-path:inset(0 0 0 0)}}
414    @keyframes idRise{from{opacity:0;transform:translateY(26px) scale(0.97);clip-path:inset(14% 0 0 0);filter:blur(10px)}to{opacity:1;transform:none;clip-path:inset(0 0 0 0);filter:blur(0)}}
415    @keyframes idSweep{0%{transform:translateX(-140%)}100%{transform:translateX(320%)}}
416    @keyframes lockPulse{0%,100%{opacity:0.35;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}
417    @keyframes whiteGlow{0%,100%{box-shadow:0 0 20px rgba(244,241,234,0.18),inset 0 0 12px rgba(244,241,234,0.06)}50%{box-shadow:0 0 38px rgba(244,241,234,0.34),inset 0 0 18px rgba(244,241,234,0.12)}}
418    @keyframes ctaPulseBlue{0%,100%{box-shadow:0 10px 30px rgba(20,42,110,0.6),0 0 0 0 rgba(55,95,205,0.36)}55%{box-shadow:0 14px 42px rgba(30,60,150,0.72),0 0 0 14px rgba(55,95,205,0)}}
419    @keyframes blueGlow{0%,100%{box-shadow:0 0 22px rgba(96,140,255,0.28),inset 0 0 14px rgba(96,140,255,0.10)}50%{box-shadow:0 0 40px rgba(96,140,255,0.5),inset 0 0 20px rgba(96,140,255,0.18)}}
420    @keyframes stepPrint{0%,6%{opacity:0}14%{opacity:0.85}62%{opacity:0.85}100%{opacity:0}}
421    @keyframes coinFlip{0%,72%,100%{transform:rotateY(0deg) scaleX(1)}80%{transform:rotateY(0deg) scaleX(0.08)}88%{transform:rotateY(0deg) scaleX(1)}}
422    @keyframes stickerBob{0%,100%{transform:rotate(-9deg) translateY(0)}50%{transform:rotate(-9deg) translateY(-6px)}}
423    @keyframes statIn{from{opacity:0;transform:translateY(14px) scale(0.94);clip-path:inset(100% 0 0 0)}to{opacity:1;transform:translateY(0) scale(1);clip-path:inset(0 0 0 0)}}
424    @keyframes statSheen{0%{transform:translateX(-120%)}55%,100%{transform:translateX(320%)}}
425    @keyframes ruleGrow{from{transform:scaleY(0)}to{transform:scaleY(1)}}
426    @keyframes underSwipe{from{transform:scaleX(0)}to{transform:scaleX(1)}}
427    @keyframes ctaPulse{0%,100%{box-shadow:0 10px 30px rgba(255,61,46,0.35),0 0 0 0 rgba(255,61,46,0.35)}55%{box-shadow:0 14px 40px rgba(255,61,46,0.5),0 0 0 14px rgba(255,61,46,0)}}
428    @keyframes auraDrift{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(0,-14px,0) scale(1.06)}}
429    @keyframes lineUp{from{transform:translateY(108%) rotate(2.2deg)}to{transform:translateY(0) rotate(0)}}
430    @keyframes fadeSoft{from{opacity:0}to{opacity:1}}
431    @keyframes pickMe{0%,62%,100%{transform:scale(1);box-shadow:0 0 34px rgba(255,61,46,0.24)}68%{transform:scale(0.94);box-shadow:0 0 14px rgba(255,61,46,0.5)}76%{transform:scale(1.035);box-shadow:0 0 58px rgba(255,61,46,0.55)}84%{transform:scale(1)}}
432    @keyframes pickRing{0%,64%{opacity:0;transform:scale(0.9)}72%{opacity:0.7;transform:scale(1)}100%{opacity:0;transform:scale(1.45)}}
433    @keyframes cursorTap{0%,58%{transform:translate(6px,10px) scale(1);opacity:0}62%{opacity:1}70%{transform:translate(0,0) scale(0.82);opacity:1}80%{transform:translate(0,0) scale(1);opacity:1}92%,100%{opacity:0}}
434    @keyframes flowDot{0%{top:-6px;opacity:0}12%{opacity:1}88%{opacity:1}100%{top:100%;opacity:0}}
435    @keyframes barPulse{0%,100%{transform:scaleY(0.35)}50%{transform:scaleY(1)}}
436    @keyframes lineGlow{0%,100%{opacity:0.35}50%{opacity:1}}
437    @keyframes perf{to{background-position:-32px 0}}
438    @keyframes pulse{from{transform:scale(.75);opacity:.6}to{transform:scale(1.15);opacity:1}}
439    @keyframes carouselCardLoop{from{transform:translateX(1764px)}to{transform:translateX(-252px)}}
440    [data-carousel-scroll]{touch-action:pan-y;-webkit-user-select:none;user-select:none}
441    [data-carousel-scroll] img,[data-carousel-scroll] video{-webkit-user-drag:none;user-drag:none}
442    [data-carousel-scroll]:hover,[data-carousel-scroll]:focus-within{cursor:grab}
443    [data-carousel-scroll][data-dragging="1"]{cursor:grabbing}
444    [data-carousel-scroll]:hover [data-carousel-card],[data-carousel-scroll]:focus-within [data-carousel-card],[data-carousel-scroll][data-dragging="1"] [data-carousel-card]{animation-play-state:paused!important}
445    [data-showcase-play]:focus-visible,[data-showcase-play][aria-pressed="true"]:hover{opacity:1!important}
446    [data-carousel-edge]{position:absolute;top:0;bottom:0;z-index:7;width:min(12vw,150px);pointer-events:none}
447    [data-carousel-edge="left"]{left:0;background:linear-gradient(90deg,#0A0A0C,rgba(10,10,12,.82) 32%,transparent)}
448    [data-carousel-edge="right"]{right:0;background:linear-gradient(270deg,#0A0A0C,rgba(10,10,12,.82) 32%,transparent)}
449    @media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}[data-carousel-card]{animation-play-state:paused!important}}
450  </style>
451</helmet>
452<div style="min-height:100vh;background:#0A0A0C;box-sizing:border-box;position:relative;overflow-x:clip">
453  <div data-vignette="1" style="position:fixed;inset:0;z-index:58;pointer-events:none;opacity:0.55;transition:opacity .6s ease;background:radial-gradient(120% 90% at 50% 50%,transparent 55%,rgba(0,0,0,0.5) 100%)"></div>
454  <div data-preloader="1" style="position:fixed;inset:0;z-index:200;background:#0A0A0C;display:flex;align-items:center;justify-content:center;pointer-events:none;animation:preOut .45s ease .4s forwards">
455    <span style="display:inline-flex;align-items:center;gap:10px;animation:preIn .35s cubic-bezier(.2,.8,.3,1) both">
456      <span style="width:9px;height:9px;border-radius:50%;background:var(--acc);box-shadow:0 0 20px rgba(255,61,46,0.8)"></span>
457      <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:20px;letter-spacing:-0.03em;color:var(--ink)">ClipChat<span style="color:var(--acc)">.ai</span></span>
458    </span>
459  </div>
460  <div data-cursor="1" style="position:fixed;top:0;left:0;width:26px;height:26px;margin:-13px 0 0 -13px;border-radius:50%;border:1px solid rgba(244,241,234,0.5);pointer-events:none;z-index:190;opacity:0;transform:translate3d(-100px,-100px,0);transition:width .25s ease,height .25s ease,margin .25s ease,background .25s ease,border-color .25s ease,opacity .25s ease;display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.1em;color:#16090A;mix-blend-mode:normal"><span data-cursorlabel="1" style="opacity:0;transition:opacity .2s ease"></span></div>
461  <div style="position:fixed;inset:0;pointer-events:none;z-index:60;opacity:0.05;background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.6'/%3E%3C/svg%3E&quot;)"></div>
462  <nav data-nav="1" style="position:fixed;top:0;left:0;right:0;box-sizing:border-box;z-index:50;backdrop-filter:blur(14px) saturate(1.2);background:rgba(10,10,12,0.78);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:14px max(32px, calc((100% - 1480px) / 2))" data-screen-label="Nav">
463    <a href="#top" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.02em;color:var(--ink);text-decoration:none">Clip<i style="font-style:normal;color:var(--acc)">Chat</i></a>
464    <div style="display:flex;align-items:center;gap:32px">
465      <a href="#examples" style="font-family:'Space Mono',monospace;font-size:11px;letter-spacing:0.14em;color:var(--dim);text-decoration:none;text-transform:uppercase">Examples</a>
466      <a href="#how" style="font-family:'Space Mono',monospace;font-size:11px;letter-spacing:0.14em;color:var(--dim);text-decoration:none;text-transform:uppercase">How it works</a>
467      <a href="#pricing" style="font-family:'Space Mono',monospace;font-size:11px;letter-spacing:0.14em;color:var(--dim);text-decoration:none;text-transform:uppercase">Pricing</a>
468      <div style="position:relative;display:flex;align-items:center">
469        <button type="button" data-v5-globe aria-haspopup="true" aria-expanded="false" aria-label="Language" style="display:flex;align-items:center;gap:6px;background:transparent;border:none;padding:6px;cursor:pointer;color:var(--dim);transition:color .15s">
470          <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c2.5 2.7 2.5 15.3 0 18M12 3c-2.5 2.7-2.5 15.3 0 18"/></svg>
471          <span style="font-family:'Space Mono',monospace;font-size:11px;letter-spacing:0.08em;text-transform:uppercase">EN</span>
472        </button>
473        <div data-v5-langs style="position:absolute;top:calc(100% + 10px);right:0;z-index:60;min-width:190px;max-height:min(70vh,520px);overflow-y:auto;padding:8px;border-radius:12px;background:rgba(14,14,18,0.97);border:1px solid var(--line2);box-shadow:0 24px 60px rgba(0,0,0,0.6);backdrop-filter:blur(10px)">
474            <a href="/" hreflang="en-US" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">English</a>
475            <a href="/en-GB" hreflang="en-GB" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--acc)">English (UK)</a>
476            <a href="/ru" hreflang="ru" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Русский</a>
477            <a href="/ar" hreflang="ar" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">العربية</a>
478            <a href="/bn" hreflang="bn" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">বাংলা</a>
479            <a href="/cs" hreflang="cs" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Čeština</a>
480            <a href="/cy" hreflang="cy" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Cymraeg</a>
481            <a href="/da" hreflang="da" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Dansk</a>
482            <a href="/de" hreflang="de" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Deutsch</a>
483            <a href="/el" hreflang="el" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Ελληνικά</a>
484            <a href="/es-ES" hreflang="es-ES" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Español (España)</a>
485            <a href="/es-MX" hreflang="es-MX" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Español (México)</a>
486            <a href="/fa" hreflang="fa" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">فارسی</a>
487            <a href="/fi" hreflang="fi" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Suomi</a>
488            <a href="/fil" hreflang="fil" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Filipino</a>
489            <a href="/fr-CA" hreflang="fr-CA" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Français (Canada)</a>
490            <a href="/fr-FR" hreflang="fr-FR" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Français (France)</a>
491            <a href="/ga" hreflang="ga" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Gaeilge</a>
492            <a href="/gd" hreflang="gd" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">
492Gàidhlig</a>
493            <a href="/he" hreflang="he" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">עברית</a>
494            <a href="/hi" hreflang="hi" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">हिन्दी</a>
495            <a href="/hr" hreflang="hr" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Hrvatski</a>
496            <a href="/hu" hreflang="hu" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Magyar</a>
497            <a href="/id" hreflang="id" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Bahasa Indonesia</a>
498            <a href="/is" hreflang="is" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Íslenska</a>
499            <a href="/it" hreflang="it" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Italiano</a>
500            <a href="/ja" hreflang="ja" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">日本語</a>
501            <a href="/kk" hreflang="kk" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Қазақша</a>
502            <a href="/ko" hreflang="ko" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">한국어</a>
503            <a href="/lb" hreflang="lb" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Lëtzebuergesch</a>
504            <a href="/lt" hreflang="lt" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Lietuvių</a>
505            <a href="/lv" hreflang="lv" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Latviešu</a>
506            <a href="/mi" hreflang="mi" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Māori</a>
507            <a href="/ms" hreflang="ms" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Bahasa Melayu</a>
508            <a href="/mt" hreflang="mt" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Malti</a>
509            <a href="/nl" hreflang="nl" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Nederlands</a>
510            <a href="/no" hreflang="no" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Norsk</a>
511            <a href="/pa" hreflang="pa" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">ਪੰਜਾਬੀ</a>
512            <a href="/pl" hreflang="pl" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Polski</a>
513            <a href="/pt-BR" hreflang="pt-BR" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Português (Brasil)</a>
514            <a href="/pt-PT" hreflang="pt-PT" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Português (Portugal)</a>
515            <a href="/rm" hreflang="rm" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Rumantsch</a>
516            <a href="/rom" hreflang="rom" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Romani</a>
517            <a href="/se" hreflang="se" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Davvisámegiella</a>
518            <a href="/sl" hreflang="sl" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Slovenščina</a>
519            <a href="/sv" hreflang="sv" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Svenska</a>
520            <a href="/sw" hreflang="sw" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Kiswahili</a>
521            <a href="/ta" hreflang="ta" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">தமிழ்</a>
522            <a href="/th" hreflang="th" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">ไทย</a>
523            <a href="/tr" hreflang="tr" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Türkçe</a>
524            <a href="/ur" hreflang="ur" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">اردو</a>
525            <a href="/vi" hreflang="vi" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">Tiếng Việt</a>
526            <a href="/yi" hreflang="yi" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">ייִדיש</a>
527            <a href="/zh-CN" hreflang="zh-CN" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">简体中文</a>
528            <a href="/zh-TW" hreflang="zh-TW" style="display:block;padding:8px 10px;border-radius:8px;font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.04em;text-decoration:none;color:var(--ink)">繁體中文</a>
529        </div>
530      </div>
531      <a class="v5-signin" href="/create/clipboard" data-open-auth data-v5-signin style="font-family:'Space Mono',monospace;font-size:12px;letter-spacing:0.08em;text-transform:uppercase;color:var(--dim);text-decoration:none;white-space:nowrap;transition:color .15s" onmouseover="this.style.color='var(--ink)'" onmouseout="this.style.color='var(--dim)'">Sign in</a>
532      <button onClick="{{ startDemo }}" style="background:linear-gradient(180deg,#FF6A4D 0%,#FF3D2E 52%,#E22A1D 100%);color:#FFFFFF;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:13px;letter-spacing:-0.01em;padding:11px 20px;border-radius:9px;border:none;cursor:pointer;box-shadow:0 0 22px rgba(255,61,46,0.3)">Create a music video</button>
533    </div>
534  </nav>
535  
536  <div class="{{ menuOverlayCls }}" style="display:none;position:fixed;top:64px;bottom:0;left:0;right:0;box-sizing:border-box;background:rgba(10,10,12,0.97);z-index:49;padding:24px max(32px, calc((100% - 1480px) / 2));display:flex;flex-direction:column;gap:16px">
537    <a href="#examples" onClick="{{ toggleMenu }}" style="font-family:'Space Mono',monospace;font-size:13px;letter-spacing:0.1em;color:var(--ink);text-decoration:none;text-transform:uppercase;padding:12px 0;border-bottom:1px solid var(--line)">Examples</a>
538    <a href="#how" onClick="{{ toggleMenu }}" style="font-family:'Space Mono',monospace;font-size:13px;letter-spacing:0.1em;color:var(--ink);text-decoration:none;text-transform:uppercase;padding:12px 0;border-bottom:1px solid var(--line)">How it works</a>
539    <a href="#pricing" onClick="{{ toggleMenu }}" style="font-family:'Space Mono',monospace;font-size:13px;letter-spacing:0.1em;color:var(--ink);text-decoration:none;text-transform:uppercase;padding:12px 0;border-bottom:1px solid var(--line)">Pricing</a>
540    <button onClick="{{ startDemoAndClose }}" style="margin-top:8px;background:linear-gradient(180deg,#FF6A4D 0%,#FF3D2E 52%,#E22A1D 100%);color:#16090A;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;box-shadow:0 0 26px rgba(255,61,46,0.4);padding:16px 24px;border-radius:10px;border:none">Create a music video</button>
541  </div>
542
543  <header id="top" style="position:relative;overflow:hidden;min-height:82vh;display:flex;flex-direction:column;justify-content:flex-end;padding:clamp(72px,9vh,140px) 48px clamp(60px,calc(6vh + 20px),116px) 48px" data-screen-label="Hero">
544    <div style="position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:0">
545      <span style="position:absolute;inset:0;z-index:2;pointer-events:none;mix-blend-mode:screen;background:linear-gradient(90deg,rgba(255,61,46,0.16),transparent 14%,transparent 86%,rgba(96,140,255,0.16))"></span>
546      <video data-bgvideo="1" poster="https://content.doitong.com/video/clipchat_landing_v2/w2_hd.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="width:100%;height:100%;object-fit:cover;transform:none;filter:brightness(1.35) saturate(1.12);opacity:1;transition:opacity .6s ease"></video>
547      <div data-bgveil="1" style="position:absolute;inset:0;opacity:1;transition:opacity .6s ease;background:linear-gradient(180deg,rgba(10,10,12,0.25) 0%,rgba(10,10,12,0.35) 42%,rgba(10,10,12,0.9) 100%)"></div>
548    </div>
549    <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;padding:16px 0;overflow:hidden;background:linear-gradient(0deg,rgba(10,10,12,0.72),transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)">
550      <div style="position:absolute;top:10px;left:50%;transform:translateX(-50%);font-family:'Space Mono',monospace;font-size:8.5px;letter-spacing:0.24em;color:var(--dim);text-transform:uppercase;pointer-events:none;z-index:2;display:none">Under the hood</div>
551      <div style="display:flex;width:max-content;animation:marq 38s linear infinite">
552        <span style="display:inline-flex"><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Claude</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Seedance 2.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Minimax H3</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Gemini 3.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">GPT Image 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Nano Banana 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Sedreem 5 Pro</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Claude</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Seedance 2.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Minimax H3</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Gemini 3.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">GPT Image 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Nano Banana 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Sedreem 5 Pro</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span></span>
553        <span style="display:inline-flex"><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Claude</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Seedance 2.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Minimax H3</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Gemini 3.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">GPT Image 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Nano Banana 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Sedreem 5 Pro</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Claude</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Seedance 2.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Minimax H3</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Gemini 3.5</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">GPT Image 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Nano Banana 2</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span><span style="display:inline-flex;align-items:baseline;gap:10px;padding-right:26px;white-space:nowrap"><span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:22px;letter-spacing:-0.03em;color:var(--ink)">Sedreem 5 Pro</span><span style="color:var(--acc);font-size:9px;line-height:1;padding-left:16px">✦</span></span></span>
554      </div>
555    </div>
556    <div style="position:relative;max-width:1480px;margin:0 auto">
557    <div style="position:absolute;top:-140px;left:50%;width:520px;height:420px;margin-left:-260px;pointer-events:none;background:radial-gradient(closest-side,rgba(255,61,46,0.14),rgba(255,61,46,0.03) 52%,transparent 78%),radial-gradient(closest-side at 62% 68%,rgba(96,140,255,0.14),transparent 70%);
557filter:blur(6px);animation:auraDrift 9s ease-in-out infinite"></div>
558    <div style="position:absolute;top:120px;left:-90px;width:320px;height:320px;pointer-events:none;background:radial-gradient(closest-side,rgba(120,160,255,0.14),transparent 72%);filter:blur(4px)"></div>
559    <label style="position:absolute;bottom:18px;right:max(32px, calc((100% - 1480px) / 2));z-index:4;display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:rgba(10,10,12,0.72);border:1px solid var(--line2);font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dim);text-transform:uppercase;cursor:pointer">Background video<input type="file" accept="video/*" data-val="9" onChange="{{ onFile }}" style="display:none" /></label>
560
561    <div style="max-width:980px">
562      <div style="text-align:left">
563    <h1 style="position:relative;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(48px,4.7vw,74px);line-height:0.96;letter-spacing:-0.04em;margin:0;text-align:left;max-width:1060px;text-wrap:balance">
564      <span style="display:block;overflow:hidden;padding-bottom:0.1em"><span style="display:inline-block;color:var(--ink);animation:lineUp .9s cubic-bezier(.16,.84,.28,1) .05s both">Upload your track - get a finished AI music video</span></span>
565    </h1>
566    <p style="position:relative;margin:22px 0 0 0;max-width:680px;font-size:18px;line-height:1.5;letter-spacing:-0.012em;color:rgba(244,241,234,0.78);text-wrap:balance;animation:fadeSoft .7s ease-out .4s both">ClipChat analyses the music, develops a concept, generates shots and edits a publication-ready music video</p>
567        <div style="position:relative;margin:28px 0 0 0;max-width:420px;animation:riseIn .8s cubic-bezier(.2,.7,.3,1) .28s both">
568      <button data-magnet="1" onClick="{{ startDemo }}" disabled="{{ dzBusy }}" aria-busy="{{ dzBusy }}" style="position:relative;width:100%;overflow:hidden;border:none;border-radius:14px;padding:16px 18px;display:flex;align-items:center;gap:14px;text-align:left;cursor:pointer;background:linear-gradient(180deg,#FF6A4D 0%,#FF3D2E 52%,#E22A1D 100%);animation:ctaPulse 3.4s ease-in-out infinite" style-before="content:'';position:absolute;top:0;left:-45%;width:45%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.45),transparent);animation:shine 4.4s ease-in-out infinite">
569        <span style="{{ dzIconSt }}">{{ dzIcon }}</span>
570        <span style="display:flex;flex-direction:column;gap:3px;min-width:0;flex:1">
571          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:20px;letter-spacing:-0.025em;color:#FFFFFF;text-shadow:0 1px 2px rgba(90,14,8,0.45)">{{ dzBtnLabel }}</span>
572          <span style="{{ dzHintSt }}">{{ dzHint }}</span>
573        </span>
574        <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:19px;color:#FFFFFF;opacity:0.8">→</span>
575      </button>
576      <div style="margin-top:12px;display:flex;align-items:center;gap:14px;flex-wrap:wrap">
577        <a href="https://suno.com/" target="_blank" rel="noopener noreferrer" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.14em;color:var(--ink);text-transform:uppercase;text-decoration:underline;text-underline-offset:3px;cursor:pointer">No track? Go to Suno</a>
578      </div>
579      <div style="margin-top:14px;display:inline-flex;align-items:center;gap:9px">
580        <span class="pulse" style="display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--acc)"></span>
581        <span style="font-family:'Space Mono',monospace;font-size:10px;letter-spacing:0.12em;color:var(--dim);text-transform:uppercase">rendering right now <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;color:var(--acc);letter-spacing:0">{{ liveNow }}</span> clips</span>
582      </div>
583    </div>
584    <div data-hero-route="1" aria-label="Track; AI analysis; Concept; Storyboard; Scenes; Finished video" style="position:relative;margin-top:32px;max-width:1080px;padding:15px 0 14px;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));border-top:1px solid rgba(244,241,234,0.16);border-bottom:1px solid rgba(244,241,234,0.16);animation:riseIn .8s cubic-bezier(.2,.7,.3,1) .45s both">
585        <div style="position:relative;min-width:0;padding:0 24px 0 0px">
586          <span style="display:block;margin-bottom:7px;font-family:'Space Mono',monospace;font-size:9px;line-height:1;color:var(--acc)">01</span>
587          <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:14px;line-height:1.14;letter-spacing:-0.02em;color:var(--ink)">Track</strong>
588          <span aria-hidden="true" style="position:absolute;right:4px;top:25px;width:18px;height:1px;background:linear-gradient(90deg,var(--acc),rgba(244,241,234,0.2))"></span>
589        </div>
590        <div style="position:relative;min-width:0;padding:0 24px 0 16px">
591          <span style="display:block;margin-bottom:7px;font-family:'Space Mono',monospace;font-size:9px;line-height:1;color:rgba(244,241,234,0.46)">02</span>
592          <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:14px;line-height:1.14;letter-spacing:-0.02em;color:var(--ink)">AI analysis</strong>
593          <span aria-hidden="true" style="position:absolute;right:4px;top:25px;width:18px;height:1px;background:rgba(244,241,234,0.16)"></span>
594        </div>
595        <div style="position:relative;min-width:0;padding:0 24px 0 16px">
596          <span style="display:block;margin-bottom:7px;font-family:'Space Mono',monospace;font-size:9px;line-height:1;color:rgba(244,241,234,0.46)">03</span>
597          <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:14px;line-height:1.14;letter-spacing:-0.02em;color:var(--ink)">Concept</strong>
598          <span aria-hidden="true" style="position:absolute;right:4px;top:25px;width:18px;height:1px;background:rgba(244,241,234,0.16)"></span>
599        </div>
600        <div style="position:relative;min-width:0;padding:0 24px 0 16px">
601          <span style="display:block;margin-bottom:7px;font-family:'Space Mono',monospace;font-size:9px;line-height:1;color:rgba(244,241,234,0.46)">04</span>
602          <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:14px;line-height:1.14;letter-spacing:-0.02em;color:var(--ink)">Storyboard</strong>
603          <span aria-hidden="true" style="position:absolute;right:4px;top:25px;width:18px;height:1px;background:rgba(244,241,234,0.16)"></span>
604        </div>
605        <div style="position:relative;min-width:0;padding:0 24px 0 16px">
606          <span style="display:block;margin-bottom:7px;font-family:'Space Mono',monospace;font-size:9px;line-height:1;color:rgba(244,241,234,0.46)">05</span>
607          <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:14px;line-height:1.14;letter-spacing:-0.02em;color:var(--ink)">Scenes</strong>
608          <span aria-hidden="true" style="position:absolute;right:4px;top:25px;width:18px;height:1px;background:rgba(244,241,234,0.16)"></span>
609        </div>
610        <div style="position:relative;min-width:0;padding:0 24px 0 16px">
611          <span style="display:block;margin-bottom:7px;font-family:'Space Mono',monospace;font-size:9px;line-height:1;color:rgba(244,241,234,0.46)">06</span>
612          <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:14px;line-height:1.14;letter-spacing:-0.02em;color:var(--ink)">Finished video</strong>
613          
614        </div>
615    </div>
616    </div>
617      </div>
618    </div>
619    </div>
620    <div style="margin:28px 0 0 0;display:flex;flex-direction:column;align-items:center;gap:10px">
621      <span style="display:inline-flex;align-items:center;gap:8px;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.24em;color:var(--dim);text-transform:uppercase"><span style="width:18px;height:1px;background:var(--line2)"></span>Examples<span style="width:18px;height:1px;background:var(--line2)"></span></span>
622      <p style="margin:0;text-align:center;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(36px,3.8vw,54px);line-height:1.0;letter-spacing:-0.045em;text-wrap:balance;background:linear-gradient(180deg,#FFFFFF 0%,#FFFFFF 44%,#A9A2A7 100%);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 12px 30px rgba(0,0,0,0.5)">What you can create with <span style="-webkit-text-fill-color:var(--acc);color:var(--acc);text-shadow:0 0 34px rgba(255,61,46,0.45)">ClipChat</span>
623</p>
624      <p style="margin:44px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(20px,1.9vw,26px);line-height:1.1;letter-spacing:-0.03em;color:var(--dim);text-align:center;text-wrap:balance">Music videos and vertical content for the music you love or your own tracks</p>
625      <p style="margin:14px auto 0 auto;max-width:900px;padding:0 8px;font-size:18px;line-height:1.5;letter-spacing:-0.012em;color:var(--dim);text-align:center;text-wrap:balance">Upload a track, describe your idea (or leave it to ClipChat) and add a hero. ClipChat combines scenes, lip sync and editing into one complete video - from a short vertical clip to a full visual story.</p>
626    </div>
627    <div style="position:relative">
628      <div style="position:relative;width:100%;overflow:hidden;margin:44px 0 0">
629    <div id="examples" data-carousel-scroll="1" tabindex="0" style="position:relative;height:419px;overflow:hidden" data-screen-label="Hero examples carousel" aria-label="Clip examples. Hover to pause; drag or use the left and right arrow keys">
630          <article data-clip="a-0" data-carousel-card="1" data-carousel-base-delay="-35.28" aria-label="UNETHICAL" style="--carousel-index:0;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-35.28s;border-radius:14px;overflow:hidden;background:#571E15;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
631            <video data-val="0" data-src="https://s3.regru.cloud/doitong/video/clipchat_landing_assets/unethical-2.mp4" poster="/lp/homepage-v5/assets/unethical-2-poster.jpg" loop="{{ true }}
631" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#000"></video>
632            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
633            <button type="button" data-showcase-play="1" data-val="0" data-play-label="Play clip: UNETHICAL" data-pause-label="Pause clip: UNETHICAL" onClick="{{ toggleSound }}" aria-label="Play clip: UNETHICAL" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd0 }}</button>
634            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
635              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">UNETHICAL</div>
636              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
637                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">MUSIC VIDEO</span><span style="color:rgba(244,241,234,0.6)">0:46</span><span style="color:var(--acc)">9:16</span>
638              </div>
639            </div>
640          </article>
641          <article data-clip="a-1" data-carousel-card="1" data-carousel-base-delay="-30.24" aria-label="NEON PETROL" style="--carousel-index:1;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-30.24s;border-radius:14px;overflow:hidden;background:#242423;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
642            <video data-val="1" data-src="https://content.doitong.com/video/clipchat_landing/clip1.mp4" poster="https://content.doitong.com/video/clipchat_landing/poster1.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
643            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
644            <button type="button" data-showcase-play="1" data-val="1" data-play-label="Play clip: NEON PETROL" data-pause-label="Pause clip: NEON PETROL" onClick="{{ toggleSound }}" aria-label="Play clip: NEON PETROL" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd1 }}</button>
645            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
646              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">NEON PETROL</div>
647              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
648                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">PHONK</span><span style="color:rgba(244,241,234,0.6)">0:30</span><span style="color:var(--acc)">MUSIC VIDEO</span>
649              </div>
650            </div>
651          </article>
652          <article data-clip="a-2" data-carousel-card="1" data-carousel-base-delay="-25.20" aria-label="HORIZON" style="--carousel-index:2;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-25.20s;border-radius:14px;overflow:hidden;background:#15414A;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);
652transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
653            <video data-val="2" data-src="https://content.doitong.com/video/clipchat_landing/clip2.mp4" poster="https://content.doitong.com/video/clipchat_landing/poster2.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
654            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
655            <button type="button" data-showcase-play="1" data-val="2" data-play-label="Play clip: HORIZON" data-pause-label="Pause clip: HORIZON" onClick="{{ toggleSound }}" aria-label="Play clip: HORIZON" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd2 }}</button>
656            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
657              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">HORIZON</div>
658              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
659                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">INDIE</span><span style="color:rgba(244,241,234,0.6)">0:27</span><span style="color:var(--acc)">MUSIC VIDEO</span>
660              </div>
661            </div>
662          </article>
663          <article data-clip="a-3" data-carousel-card="1" data-carousel-base-delay="-20.16" aria-label="RITA UP" style="--carousel-index:3;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-20.16s;border-radius:14px;overflow:hidden;background:#8B4E2E;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
664            <video data-val="3" data-src="https://content.doitong.com/video/clipchat_demos/rita_up.mp4" poster="https://content.doitong.com/images/clipchat_demos/rita_up.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
665            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
666            <button type="button" data-showcase-play="1" data-val="3" data-play-label="Play clip: RITA UP" data-pause-label="Pause clip: RITA UP" onClick="{{ toggleSound }}" aria-label="Play clip: RITA UP" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd3 }}</button>
667            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
668              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">RITA UP</div>
669              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
670                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">POP</span><span style="color:rgba(244,241,234,0.6)">0:24</span><span style="color:var(--acc)">MUSIC VIDEO</span>
671              </div>
672            </div>
673          </article>
674          <article data-clip="a-4" data-carousel-card="1" data-carousel-base-delay="-15.12" aria-label="SILVER RIOT" style="--carousel-index:4;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-15.12s;border-radius:14px;overflow:hidden;background:#4D2A61;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
675            <video data-val="4" data-src="https://content.doitong.com/video/clipchat_demos/silver_riot.mp4" poster="https://content.doitong.com/images/clipchat_demos/silver_riot.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
676            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
677            <button type="button" data-showcase-play="1" data-val="4" data-play-label="Play clip: SILVER RIOT" data-pause-label="Pause clip: SILVER RIOT" onClick="{{ toggleSound }}" aria-label="Play clip: SILVER RIOT" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd4 }}</button>
678            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
679              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">SILVER RIOT</div>
680              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
681                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">GLAM ROCK</span><span style="color:rgba(244,241,234,0.6)">0:30</span><span style="color:var(--acc)">MUSIC VIDEO</span>
682              </div>
683            </div>
684          </article>
685          <article data-clip="a-5" data-carousel-card="1" data-carousel-base-delay="-10.08" aria-label="SKYLINE DIAMONDS" style="--carousel-index:5;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-10.08s;border-radius:14px;overflow:hidden;background:#233A4E;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
686            <video data-val="5" data-src="https://content.doitong.com/video/clipchat_demos/skyline_diamonds.mp4" poster="https://content.doitong.com/images/clipchat_demos/skyline_diamonds.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
687            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
688            <button type="button" data-showcase-play="1" data-val="5" data-play-label="Play clip: SKYLINE DIAMONDS" data-pause-label="Pause clip: SKYLINE DIAMONDS" onClick="{{ toggleSound }}" aria-label="Play clip: SKYLINE DIAMONDS" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd5 }}</button>
689            <div style="position:absolute;
689left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
690              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">SKYLINE DIAMONDS</div>
691              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
692                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">R&amp;B</span><span style="color:rgba(244,241,234,0.6)">0:30</span><span style="color:var(--acc)">MUSIC VIDEO</span>
693              </div>
694            </div>
695          </article>
696          <article data-clip="a-6" data-carousel-card="1" data-carousel-base-delay="-5.04" aria-label="CAFÉ BLANC" style="--carousel-index:6;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-5.04s;border-radius:14px;overflow:hidden;background:#6A452C;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
697            <video data-val="6" data-src="https://content.doitong.com/video/clipchat_demos/cafe_blanc.mp4" poster="https://content.doitong.com/images/clipchat_demos/cafe_blanc.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
698            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
699            <button type="button" data-showcase-play="1" data-val="6" data-play-label="Play clip: CAFÉ BLANC" data-pause-label="Pause clip: CAFÉ BLANC" onClick="{{ toggleSound }}" aria-label="Play clip: CAFÉ BLANC" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd6 }}</button>
700            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
701              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">CAFÉ BLANC</div>
702              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
703                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">POP</span><span style="color:rgba(244,241,234,0.6)">0:30</span><span style="color:var(--acc)">MUSIC VIDEO</span>
704              </div>
705            </div>
706          </article>
707          <article data-clip="a-7" data-carousel-card="1" data-carousel-base-delay="-0.00" aria-label="SUGAR STATIC" style="--carousel-index:7;position:absolute;top:26px;left:max(24px,calc((100vw - 1480px) / 2));width:236px;aspect-ratio:9/14;transform:translateX(calc(var(--carousel-index) * 252px));animation:carouselCardLoop 40.32s linear infinite;animation-delay:-0.00s;border-radius:14px;overflow:hidden;background:#4A1A57;border:1px solid var(--line);box-shadow:0 28px 56px rgba(0,0,0,0.52);transition:box-shadow .24s ease" style-hover="box-shadow:0 38px 70px rgba(0,0,0,0.62)">
708            <video data-val="7" data-src="https://content.doitong.com/video/clipchat_landing/clip3.mp4" poster="https://content.doitong.com/video/clipchat_landing/poster3.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000"></video>
709            <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.08),transparent 40%,rgba(10,10,12,0.92) 100%)"></span>
710            <button type="button" data-showcase-play="1" data-val="7" data-play-label="Play clip: SUGAR STATIC" data-pause-label="Pause clip: SUGAR STATIC" onClick="{{ toggleSound }}" aria-label="Play clip: SUGAR STATIC" aria-pressed="false" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:rgba(10,10,12,0.55);border:1px solid rgba(244,241,234,0.35);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--ink);cursor:pointer;z-index:4;transition:opacity .16s ease">{{ snd7 }}</button>
711            <div style="position:absolute;left:14px;right:14px;bottom:14px;z-index:3;pointer-events:none">
712              <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:17px;letter-spacing:-0.03em;color:#F4F1EA;text-shadow:0 1px 10px rgba(0,0,0,0.7)">SUGAR STATIC</div>
713              <div style="margin-top:7px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.14em">
714                <span style="color:rgba(244,241,234,0.92);text-transform:uppercase;border:1px solid rgba(244,241,234,0.28);border-radius:999px;padding:3px 8px">HYPERPOP</span><span style="color:rgba(244,241,234,0.6)">0:30</span><span style="color:var(--acc)">MUSIC VIDEO</span>
715              </div>
716            </div>
717          </article>
718      <span data-carousel-edge="left" aria-hidden="true"></span>
719      <span data-carousel-edge="right" aria-hidden="true"></span>
720    </div>
721      </div>
722    </div>
723  <section style="position:relative;padding:64px max(32px, calc((100% - 1480px) / 2));background:radial-gradient(70% 90% at 22% 6%,#FFFFFF,transparent 62%),radial-gradient(60% 80% at 88% 96%,rgba(255,61,46,0.10),transparent 66%),linear-gradient(168deg,#F7F4ED 0%,#EDE8DE 52%,#E3DED2 100%);color:#12100F;margin:0;overflow:hidden;animation:lightOn 1.1s cubic-bezier(.76,0,.24,1) both;animation-play-state:paused" data-idreveal="1" data-screen-label="Video lesson">
724    <span style="position:absolute;top:0;left:0;right:0;height:120px;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.35),transparent)"></span>
725    <span style="position:absolute;bottom:0;left:0;right:0;height:120px;pointer-events:none;background:linear-gradient(0deg,rgba(10,10,12,0.35),transparent)"></span>
726    <span style="position:absolute;inset:0;pointer-events:none;opacity:0.55;background-image:radial-gradient(rgba(18,16,15,0.22) 0.5px,transparent 0.5px);background-size:4px 4px"></span>
727    <span style="position:absolute;inset:0;pointer-events:none;background:radial-gradient(120% 90% at 50% 45%,transparent 52%,rgba(18,16,15,0.16) 100%)"></span>
728    <div style="position:relative;display:grid;grid-template-columns:minmax(0,1060px);justify-content:center;align-items:center;gap:44px">
729      <div data-lesson-switcher="1" style="position:relative;z-index:2;min-width:0">
730      <div data-lift="1" data-lesson-panel="full" style="cursor:pointer;position:relative;z-index:2;aspect-ratio:16/9;border-radius:10px;overflow:hidden;background:#12100F;transform:perspective(1400px) rotateY(-3.5deg) rotateX(1.5deg);transition:transform .9s cubic-bezier(.2,.8,.3,1),box-shadow .9s ease;box-shadow:0 48px 96px rgba(18,16,15,0.42),0 12px 28px rgba(18,16,15,0.18),0 0 0 1px rgba(255,255,255,0.6),0 2px 0 rgba(255,255,255,0.85)" style-hover="transform:perspective(1400px) rotateY(0deg) rotateX(0deg) translateY(-6px);box-shadow:0 60px 120px rgba(18,16,15,0.48),0 0 0 1px rgba(196,26,10,0.4),0 0 60px rgba(255,61,46,0.18)">
731          <video controls="{{ true }}" playsInline="{{ true }}" preload="none" src="https://s3.regru.cloud/doitong/video/clipchat_lessons/clipchat-full-lesson-en-20260912.mp4" poster="https://s3.regru.cloud/doitong/images/clipchat_lessons/clipchat-full-lesson-en-20260912.jpg" style="display:block;width:100%;height:100%;object-fit:cover;background:#12100F"></video>
732      </div>
733      </div>
734    </div>
735    <p style="position:relative;z-index:2;max-width:1060px;margin:28px auto 0;padding:16px 18px;border-left:3px solid #FF3D2E;background:rgba(255,255,255,0.58);box-shadow:0 10px 30px rgba(18,16,15,0.08);font-family:'Space Mono',monospace;font-size:12px;font-weight:700;line-height:1.65;letter-spacing:0.035em;color:#403B36">Important: the ClipChat interface keeps evolving. Seedance 2 is currently available as Seedance -&gt; Quality, and Seedance 2.5 as Seedance -&gt; Detailed. To regenerate one scene, open its card. To generate every remaining scene, use the bottom bar. The rest of the workflow is unchanged.</p>
736  </section>
737
738  <section style="position:relative;overflow:hidden;padding:64px max(32px, calc((100% - 1480px) / 2)) 64px;background:radial-gradient(80% 100% at 50% 0%,rgba(255,61,46,0.10),transparent 62%),linear-gradient(180deg,#0F0F14 0%,#101016 46%,#0A0A0C 100%);border-top:1px solid var(--line);border-bottom:1px solid var(--line)" data-screen-label="Monetization">
739    <span style="position:absolute;top:0;left:0;right:0;height:1px;pointer-events:none;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.55),transparent)"></span>
740    <span style="position:absolute;inset:-8% -14%;pointer-events:none;background:radial-gradient(42% 34% at 84% 14%,rgba(255,61,46,0.10),transparent 72%),radial-gradient(38% 32% at 10% 88%,rgba(96,140,255,0.09),transparent 72%);filter:blur(42px);animation:auraDrift 19s ease-in-out infinite"></span>
741    <div style="text-align:center">
742      <div style="display:inline-flex;align-items:center;gap:10px;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.22em;color:var(--dim);text-transform:uppercase"><span style="width:22px;height:1px;background:var(--line2)"></span>What one track can become<span style="width:22px;height:1px;background:var(--line2)"></span></div>
743      <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(32px,3.4vw,54px);line-height:1.0;letter-spacing:-0.045em;margin:14px 0 0 0;color:var(--ink);text-wrap:balance">One track is more <span style="font-family:&#39;Instrument Serif&#39;,serif;font-style:italic;font-weight:400;color:var(--acc)">than one music video</span>
744</h2>
745      <p style="margin:16px auto 0;max-width:760px;font-size:17px;line-height:1.5;color:var(--dim)">Turn one track into a full music video and vertical content for different platforms</p>
746    </div>
747
748    <div style="margin:42px auto 0 auto;max-width:1480px">
749      <div style="position:relative;max-width:1080px;margin:0 auto;display:flex;align-items:center;justify-content:center;gap:22px;flex-wrap:wrap">
750        <div style="display:flex;flex-direction:column;align-items:center;gap:10px">
751          <span style="width:72px;height:72px;border-radius:50%;border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-size:24px;color:var(--dim)">♪</span>
752          <span style="font-family:'Space Mono',monospace;font-size:8.5px;letter-spacing:0.18em;color:var(--dark);text-transform:uppercase">Track</span>
753        </div>
754        <span style="width:64px;height:1px;background:repeating-linear-gradient(90deg,var(--line2) 0 5px,transparent 5px 10px)"></span>
755        <div style="display:flex;flex-direction:column;align-items:center;gap:10px">
756          <span style="position:relative;width:88px;height:88px;border-radius:50%;border:1px solid rgba(255,61,46,0.55);background:radial-gradient(closest-side,rgba(255,61,46,0.16),transparent 78%);color:var(--ink);display:flex;align-items:center;justify-content:center;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;letter-spacing:-0.03em">Clip<span style="position:absolute;inset:-6px;border-radius:50%;border:1px solid rgba(255,61,46,0.22)"></span></span>
757          <span style="font-family:'Space Mono',monospace;font-size:8.5px;letter-spacing:0.18em;color:var(--acc);text-transform:uppercase">30 minutes</span>
758        </div>
759        <span style="width:64px;height:1px;background:repeating-linear-gradient(90deg,var(--line2) 0 5px,transparent 5px 10px)"></span>
760        <div style="display:flex;flex-direction:column;align-items:flex-start;gap:6px;max-width:16ch">
761          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:16px;letter-spacing:-0.03em;color:var(--ink);line-height:1.15">Three formats</span>
762          <span style="font-size:12.5px;line-height:1.4;color:var(--dim)">One track for different platforms</span>
763        </div>
764      </div>
765
766      <div style="margin-top:42px;display:grid;grid-template-columns:repeat(3,1fr);gap:22px">
767      <div data-aud="1" data-idreveal="1" style="position:relative;aspect-ratio:5/4;animation:tileIn .95s cubic-bezier(.18,.85,.28,1) 0.00s both;animation-play-state:paused;border-radius:18px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);box-shadow:0 20px 44px rgba(0,0,0,0.5);transition:transform .5s cubic-bezier(.2,.8,.3,1),border-color .4s ease,box-shadow .5s ease" style-hover="transform:translateY(-8px);border-color:#FF3D2E;box-shadow:0 34px 70px rgba(0,0,0,0.62)">
768        <div data-audimg="1" style="position:absolute;inset:0;transition:transform 1.2s cubic-bezier(.2,.8,.3,1)">
769          <img src="https://content.doitong.com/video/clipchat_landing_v2/land2.jpg" alt="" loading="lazy" style="display:block;width:100%;height:100%;object-fit:cover" />
770          <span data-idreveal="1" style="position:absolute;top:0;bottom:0;left:0;width:34%;pointer-events:none;z-index:4;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.28),transparent);animation:tileSweep 1.5s ease-in-out 0.30s both;animation-play-state:paused"></span>
771        </div>
772        <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.25) 0%,rgba(10,10,12,0.05) 38%,rgba(10,10,12,0.94) 100%)"></span>
773        <span style="position:absolute;top:16px;left:18px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-weight:700;font-size:12px;letter-spacing:0.22em;color:rgba(244,241,234,0.85);text-shadow:0 2px 10px rgba(0,0,0,0.9)">01</span>
774        <span style="position:absolute;top:14px;right:16px;z-index:3;pointer-events:none;display:flex;align-items:baseline;gap:7px;padding:7px 10px;border-radius:12px;background:rgba(10,10,12,0.76);box-shadow:0 8px 22px rgba(0,0,0,0.28);font-family:'Space Mono',monospace;text-transform:uppercase"><strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:23px;line-height:1;color:#FF6A4D;letter-spacing:-0.04em">+30%</strong><span style="font-size:8px;letter-spacing:0.12em;color:rgba(244,241,234,0.72)">listeners</span></span>
775        <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;pointer-events:none;padding:28px 26px 26px 26px">
776          <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:24px;line-height:1.1;letter-spacing:-0.032em;color:#F4F1EA;text-wrap:balance">Full music video</div>
777          <p style="margin:14px 0 0;padding-top:12px;border-top:1px solid rgba(244,241,234,0.22);font-size:14px;line-height:1.5;color:rgba(244,241,234,0.72)">A complete visual story set to your chosen music</p>
778        </div>
779      </div>
780      <div data-aud="1" data-idreveal="1" style="position:relative;aspect-ratio:5/4;animation:tileIn .95s cubic-bezier(.18,.85,.28,1) 0.14s both;animation-play-state:paused;border-radius:18px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);box-shadow:0 20px 44px rgba(0,0,0,0.5);transition:transform .5s cubic-bezier(.2,.8,.3,1),border-color .4s ease,box-shadow .5s ease" style-hover="transform:translateY(-8px);border-color:#F4F1EA;box-shadow:0 34px 70px rgba(0,0,0,0.62)">
781        <div data-audimg="1" style="position:absolute;inset:0;transition:transform 1.2s cubic-bezier(.2,.8,.3,1)">
782          <img src="https://content.doitong.com/video/clipchat_landing_v2/land1.jpg" alt="" loading="lazy" style="display:block;width:100%;height:100%;object-fit:cover" />
783          <span data-idreveal="1" style="position:absolute;top:0;bottom:0;left:0;width:34%;pointer-events:none;z-index:4;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.28),transparent);animation:tileSweep 1.5s ease-in-out 0.44s both;animation-play-state:paused"></span>
784        </div>
785        <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.25) 0%,rgba(10,10,12,0.05) 38%,rgba(10,10,12,0.94) 100%)"></span>
786        <span style="position:absolute;top:16px;left:18px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-weight:700;font-size:12px;letter-spacing:0.22em;color:rgba(244,241,234,0.85);text-shadow:0 2px 10px rgba(0,0,0,0.9)">02</span>
787        <span style="position:absolute;top:14px;right:16px;z-index:3;pointer-events:none;display:flex;align-items:baseline;gap:7px;padding:7px 10px;border-radius:12px;background:rgba(10,10,12,0.76);box-shadow:0 8px 22px rgba(0,0,0,0.28);font-family:'Space Mono',monospace;text-transform:uppercase"><strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:23px;line-height:1;color:#F4F1EA;letter-spacing:-0.04em">×4</strong><span style="font-size:8px;letter-spacing:0.12em;color:rgba(244,241,234,0.72)">completed views</span></span>
788        <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;pointer-events:none;padding:28px 26px 26px 26px">
789          <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:24px;line-height:1.1;letter-spacing:-0.032em;color:#F4F1EA;text-wrap:balance">Short videos</div>
790          <p style="margin:14px 0 0;padding-top:12px;border-top:1px solid rgba(244,241,234,0.22);font-size:14px;line-height:1.5;color:rgba(244,241,234,0.72)">Vertical content for Reels, Shorts, TikTok and other platforms</p>
791        </div>
792      </div>
793      <div data-aud="1" data-idreveal="1" style="position:relative;aspect-ratio:5/4;animation:tileIn .95s cubic-bezier(.18,.85,.28,1) 0.28s both;animation-play-state:paused;border-radius:18px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);box-shadow:0 20px 44px rgba(0,0,0,0.5);transition:transform .5s cubic-bezier(.2,.8,.3,1),border-color .4s ease,box-shadow .5s ease" style-hover="transform:translateY(-8px);border-color:#8CB0FF;box-shadow:0 34px 70px rgba(0,0,0,0.62)">
794        <div data-audimg="1" style="position:absolute;inset:0;transition:transform 1.2s cubic-bezier(.2,.8,.3,1)">
795          <img src="https://content.doitong.com/video/clipchat_landing_v2/land3.jpg" alt="" loading="lazy" style="display:block;width:100%;height:100%;object-fit:cover" />
796          <span data-idreveal="1" style="position:absolute;top:0;bottom:0;left:0;width:34%;pointer-events:none;z-index:4;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.28),transparent);animation:tileSweep 1.5s ease-in-out 0.58s both;animation-play-state:paused"></span>
797        </div>
798        <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.25) 0%,rgba(10,10,12,0.05) 38%,rgba(10,10,12,0.94) 100%)"></span>
799        <span style="position:absolute;top:16px;left:18px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-weight:700;font-size:12px;letter-spacing:0.22em;color:rgba(244,241,234,0.85);text-shadow:0 2px 10px rgba(0,0,0,0.9)">03</span>
800        <span style="position:absolute;top:14px;right:16px;z-index:3;pointer-events:none;display:flex;align-items:baseline;gap:7px;padding:7px 10px;border-radius:12px;background:rgba(10,10,12,0.76);box-shadow:0 8px 22px rgba(0,0,0,0.28);font-family:'Space Mono',monospace;text-transform:uppercase"><strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:23px;line-height:1;color:#8CB0FF;letter-spacing:-0.04em">7/10</strong><span style="font-size:8px;letter-spacing:0.12em;color:rgba(244,241,234,0.72)">through video</span></span>
801        <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;pointer-events:none;padding:28px 26px 26px 26px">
802          <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:24px;line-height:1.1;letter-spacing:-0.032em;color:#F4F1EA;text-wrap:balance">A content series</div>
803          <p style="margin:14px 0 0;padding-top:12px;border-top:1px solid rgba(244,241,234,0.22);font-size:14px;line-height:1.5;color:rgba(244,241,234,0.72)">Use different scenes and visual hooks for future posts</p>
804        </div>
805      </div>
806    </div>
807    </div>
808  </section>
809
810  <section id="how" style="position:relative;overflow:hidden;padding:64px max(32px, calc((100% - 1480px) / 2));
810color:var(--ink)" data-screen-label="How it works">
811    <span style="position:absolute;inset:0;pointer-events:none;opacity:0.5;background-image:radial-gradient(rgba(244,241,234,0.14) 0.6px,transparent 0.6px);background-size:5px 5px"></span>
812    <span style="position:absolute;inset:0;pointer-events:none;opacity:0.35;background-image:radial-gradient(rgba(255,61,46,0.3) 1px,transparent 1px);background-size:64px 64px;background-position:12px 20px"></span>
813    <span style="position:absolute;inset:-10% -16%;pointer-events:none;background:radial-gradient(38% 32% at 78% 16%,rgba(96,140,255,0.10),transparent 72%),radial-gradient(34% 30% at 14% 84%,rgba(255,61,46,0.09),transparent 72%);filter:blur(46px);animation:auraDrift 21s ease-in-out infinite"></span>
814    <span style="position:absolute;top:0;bottom:0;left:max(32px, calc((100% - 1480px) / 2));right:max(32px, calc((100% - 1480px) / 2));pointer-events:none;opacity:0.5;background-image:linear-gradient(90deg,rgba(244,241,234,0.055) 1px,transparent 1px);background-size:calc(100% / 5) 100%"></span>
815    <span style="position:absolute;top:8%;right:6%;width:280px;height:280px;border-radius:50%;border:1px solid rgba(244,241,234,0.07);pointer-events:none"></span>
816    <span style="position:absolute;top:8%;right:6%;width:280px;height:280px;border-radius:50%;border:1px solid rgba(255,61,46,0.10);transform:translate(-58px,44px);pointer-events:none"></span>
817    <span style="position:absolute;bottom:-90px;left:-60px;width:340px;height:340px;pointer-events:none;background:radial-gradient(closest-side,rgba(244,241,234,0.05),transparent 74%);filter:blur(10px)"></span>
818    <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,#0A0A0C 0%,transparent 16%,transparent 84%,#0A0A0C 100%)"></span>
819    <div style="display:inline-flex;align-items:center;gap:8px;border-left:2px solid var(--acc);padding-left:10px;font-family:'Space Mono',monospace;font-weight:700;font-size:9.5px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase">How it works</div>
820    <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(34px,3.4vw,52px);line-height:0.97;letter-spacing:-0.035em;margin:16px 0 0 0;text-wrap:balance;color:var(--ink);text-align:left">5 simple steps <span style="font-family:&#39;Instrument Serif&#39;,serif;font-style:italic;color:var(--acc);display:block">to create a music video</span>
821</h2>
822    <div data-steps="1" style="position:relative;margin-top:48px;padding-top:2px;display:grid;grid-template-columns:repeat(5,1fr);align-items:start;gap:0;border-top:1px solid var(--line2)">
823      <div data-stepsbar="1" style="position:absolute;left:0;top:-1px;height:2px;width:0%;background:var(--acc);box-shadow:0 0 12px rgba(255,61,46,0.6)"></div>
824      <div style="min-width:0;padding:28px 20px 40px 18px;border-right:1px solid var(--line);position:relative;background:linear-gradient(180deg,rgba(244,241,234,0.04),transparent)"><span style="display:inline-flex;align-items:baseline;gap:5px;font-family:'Space Mono',monospace;font-weight:700;color:rgba(255,61,46,0.45)"><span style="font-size:21px">01</span></span><h3 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.03em;color:var(--ink);margin:8px 0 8px 0">You upload a track</h3><p style="font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);margin:0">Add a song you love or your own track. ClipChat analyses its rhythm, mood and structure.</p></div>
825      <div style="min-width:0;padding:28px 20px 40px 18px;border-right:1px solid var(--line);position:relative;background:linear-gradient(180deg,rgba(244,241,234,0.04),transparent)"><span style="display:inline-flex;align-items:baseline;gap:5px;font-family:'Space Mono',monospace;font-weight:700;color:rgba(255,61,46,0.62)"><span style="font-size:21px">02</span></span><h3 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.03em;color:var(--ink);margin:8px 0 8px 0">Describe your idea</h3><p style="font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);margin:0">Describe the music video you want in plain language: mood, style, hero and key wishes. Or let AI suggest an idea, review it and discuss it in chat.</p></div>
826      <div style="min-width:0;padding:28px 20px 40px 18px;border-right:1px solid var(--line);position:relative;background:linear-gradient(180deg,rgba(244,241,234,0.04),transparent)"><span style="display:inline-flex;align-items:baseline;gap:5px;font-family:'Space Mono',monospace;font-weight:700;color:rgba(255,61,46,0.8)"><span style="font-size:21px">03</span></span><h3 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.03em;color:var(--ink);margin:8px 0 8px 0">Review the scene plan</h3><p style="font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);margin:0">Before generation, you see the visual direction, sequence of scenes and characters. If something feels wrong, adjust it in advance.</p></div>
827      <div style="min-width:0;padding:28px 20px 40px 18px;border-right:1px solid var(--line);position:relative;background:linear-gradient(180deg,rgba(244,241,234,0.04),transparent)"><span style="display:inline-flex;align-items:baseline;gap:5px;font-family:'Space Mono',monospace;font-weight:700;color:rgba(255,61,46,0.94)"><span style="font-size:21px">04</span></span><h3 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.03em;color:var(--ink);margin:8px 0 8px 0">Start generating scenes</h3><p style="font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);margin:0">ClipChat creates scenes from the approved plan and keeps the hero recognisable from shot to shot.</p></div>
828      <div style="min-width:0;padding:28px 20px 40px 18px;position:relative;background:linear-gradient(180deg,rgba(244,241,234,0.04),transparent)"><span style="display:inline-flex;align-items:baseline;gap:5px;font-family:'Space Mono',monospace;font-weight:700;color:#FF3D2E"><span style="font-size:21px">05</span></span><h3 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.03em;color:var(--ink);margin:8px 0 8px 0">You get a finished clip</h3><p style="font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);margin:0">Get a complete video with scenes, lip sync and editing. Download the finished result for publication and get access to the private community.</p></div>
829    </div>
830  </section>
831
832  <section style="position:relative;overflow:hidden;padding:8px max(32px, calc((100% - 1480px) / 2)) 0" data-screen-label="You star in it">
833    <div style="display:flex;align-items:flex-end;justify-content:space-between;gap:48px;flex-wrap:wrap">
834      <div style="min-width:0">
835        <div style="display:inline-flex;align-items:center;gap:8px;border-left:2px solid var(--acc);padding-left:10px;font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase">Identity</div>
836        <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(34px,3.4vw,52px);line-height:0.97;letter-spacing:-0.04em;margin:18px 0 0 0;text-wrap:balance;color:var(--ink);text-align:left">One face — <span style="font-family:&#39;Instrument Serif&#39;,serif;font-style:italic;font-weight:400;color:var(--acc);text-shadow:0 0 44px rgba(255,61,46,0.4)">
836in every scene</span>
837</h2>
838        <p style="font-size:17px;line-height:1.5;letter-spacing:-0.011em;color:var(--dim);max-width:none;white-space:nowrap;margin:18px 0 0 0;text-align:left">Add the hero&#39;s photo once - ClipChat keeps the face and look recognisable from the first scene to the last.</p>
839      </div>
840      <div style="display:flex;align-items:center;gap:20px;flex-wrap:wrap">
841        <span style="display:inline-flex;align-items:center;gap:9px;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase"><span class="pulse" style="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--acc)"></span>REC</span>
842        <span style="width:1px;height:22px;background:var(--line2)"></span>
843        <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.18em;color:var(--dark);text-transform:uppercase">f/1.8 · 24mm · ISO 400</span>
844      </div>
845    </div>
846  </section>
847
848  <section style="position:relative;overflow:hidden;padding:8px max(32px, calc((100% - 1480px) / 2)) 64px" data-screen-label="Identity cards">
849    <span style="position:absolute;inset:-12% -18%;pointer-events:none;background:radial-gradient(46% 40% at 50% 42%,rgba(96,140,255,0.16),transparent 74%);filter:blur(56px)"></span>
850    <div style="margin-top:40px;display:grid;grid-template-columns:0.86fr 1.14fr;align-items:start;gap:24px">
851
852      <div style="position:relative;min-width:0;border-radius:16px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);box-shadow:0 28px 62px rgba(0,0,0,0.55)">
853        <div style="position:relative;aspect-ratio:3/4">
854          <img data-photo="face-front" src="/lp/homepage-v5/desktop2/assets/face-front.jpg" alt="" data-idreveal="1" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 22%;animation:idRise .9s cubic-bezier(.18,.85,.28,1) 0s both;animation-play-state:paused" /><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
855          <span style="position:absolute;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.95),transparent);box-shadow:0 0 22px rgba(255,61,46,0.8);z-index:6;pointer-events:none;animation:faceScan 5s cubic-bezier(.5,0,.5,1) infinite"></span>
856          <span style="position:absolute;left:38%;top:34%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;border:1.5px solid rgba(255,61,46,0.95);background:rgba(255,61,46,0.25);box-shadow:0 0 12px rgba(255,61,46,0.7);z-index:5;pointer-events:none;animation:markerIn 5s ease-in-out 0.35s infinite"></span><span style="position:absolute;left:62%;top:34%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;border:1.5px solid rgba(255,61,46,0.95);background:rgba(255,61,46,0.25);box-shadow:0 0 12px rgba(255,61,46,0.7);z-index:5;pointer-events:none;animation:markerIn 5s ease-in-out 0.47s infinite"></span><span style="position:absolute;left:50%;top:52%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;border:1.5px solid rgba(255,61,46,0.95);background:rgba(255,61,46,0.25);box-shadow:0 0 12px rgba(255,61,46,0.7);z-index:5;pointer-events:none;animation:markerIn 5s ease-in-out 0.59s infinite"></span><span style="position:absolute;left:50%;top:68%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;border:1.5px solid rgba(255,61,46,0.95);background:rgba(255,61,46,0.25);box-shadow:0 0 12px rgba(255,61,46,0.7);z-index:5;pointer-events:none;animation:markerIn 5s ease-in-out 0.71s infinite"></span><span style="position:absolute;left:30%;top:58%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;border:1.5px solid rgba(255,61,46,0.95);background:rgba(255,61,46,0.25);box-shadow:0 0 12px rgba(255,61,46,0.7);z-index:5;pointer-events:none;animation:markerIn 5s ease-in-out 0.83s infinite"></span><span style="position:absolute;
856left:70%;top:58%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;border:1.5px solid rgba(255,61,46,0.95);background:rgba(255,61,46,0.25);box-shadow:0 0 12px rgba(255,61,46,0.7);z-index:5;pointer-events:none;animation:markerIn 5s ease-in-out 0.95s infinite"></span>
857          <span style="position:absolute;top:12px;left:12px;width:16px;height:16px;border-left:1.5px solid rgba(255,61,46,0.8);border-top:1.5px solid rgba(255,61,46,0.8);z-index:7;pointer-events:none"></span>
858          <span style="position:absolute;top:12px;right:12px;width:16px;height:16px;border-right:1.5px solid rgba(255,61,46,0.8);border-top:1.5px solid rgba(255,61,46,0.8);z-index:7;pointer-events:none"></span>
859          <span style="position:absolute;bottom:12px;left:12px;width:16px;height:16px;border-left:1.5px solid rgba(255,61,46,0.8);border-bottom:1.5px solid rgba(255,61,46,0.8);z-index:7;pointer-events:none"></span>
860          <span style="position:absolute;bottom:12px;right:12px;width:16px;height:16px;border-right:1.5px solid rgba(255,61,46,0.8);border-bottom:1.5px solid rgba(255,61,46,0.8);z-index:7;pointer-events:none"></span>
861          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 58%,rgba(10,10,12,0.9) 100%)"></span>
862          <div style="position:absolute;left:20px;right:20px;bottom:18px;z-index:8;pointer-events:none;display:flex;align-items:flex-end;justify-content:space-between;gap:14px">
863            <div>
864              <div style="display:inline-flex;align-items:baseline;gap:5px;font-family:'Space Mono',monospace;font-weight:700;color:var(--acc)"><span style="font-size:22px">01</span></div>
865              <div style="margin-top:6px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:24px;letter-spacing:-0.035em;color:#F4F1EA">Your photo</div>
866            </div>
867            <span style="display:inline-flex;align-items:center;gap:7px;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.9);text-transform:uppercase;background:rgba(10,10,12,0.62);border:1px solid var(--line2);border-radius:999px;padding:5px 11px;white-space:nowrap"><span style="width:6px;height:6px;border-radius:50%;background:var(--acc);animation:lockPulse 2.2s ease-in-out infinite"></span>Face locked</span>
868          </div>
869        </div>
870      </div>
871
872      <div style="min-width:0;display:flex;flex-direction:column;gap:18px">
873        <div style="display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap">
874          <span style="display:inline-flex;align-items:center;gap:10px;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase"><span style="width:26px;height:1px;background:var(--acc)"></span>One anchor for every scene</span>
875          <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dark);text-transform:uppercase">6 of 6 matches</span>
876        </div>
877        <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:12px">
878        <div data-scenetile="0" style="{{ st0 }}">
879          <video data-scenevideo data-src="https://content.doitong.com/video/clipchat_landing_v2/v6.mp4" poster="/lp/homepage-v5/desktop2/assets/scene-stage.jpg" loop playsinline preload="none" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 34%"></video><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
880          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 46%,rgba(10,10,12,0.86) 100%)"></span>
881          <span style="position:absolute;
881left:10px;bottom:9px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.95);text-transform:uppercase">SCENE 01</span>
882          <span style="{{ sm0 }}"></span>
883        </div>
884        <div data-scenetile="1" style="{{ st1 }}">
885          <video data-scenevideo data-src="https://content.doitong.com/video/clipchat_landing_v2/v1.mp4" poster="/lp/homepage-v5/desktop2/assets/scene-car.jpg" loop playsinline preload="none" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 34%"></video><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
886          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 46%,rgba(10,10,12,0.86) 100%)"></span>
887          <span style="position:absolute;left:10px;bottom:9px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.95);text-transform:uppercase">SCENE 02</span>
888          <span style="{{ sm1 }}"></span>
889        </div>
890        <div data-scenetile="2" style="{{ st2 }}">
891          <video data-scenevideo data-src="https://content.doitong.com/video/clipchat_landing_v2/v5.mp4" poster="/lp/homepage-v5/desktop2/assets/scene-desert.jpg" loop playsinline preload="none" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 34%"></video><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
892          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 46%,rgba(10,10,12,0.86) 100%)"></span>
893          <span style="position:absolute;left:10px;bottom:9px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.95);text-transform:uppercase">SCENE 03</span>
894          <span style="{{ sm2 }}"></span>
895        </div>
896        <div data-scenetile="3" style="{{ st3 }}">
897          <video data-scenevideo data-src="https://content.doitong.com/video/clipchat_landing_v2/v2.mp4" poster="/lp/homepage-v5/desktop2/assets/face-34.jpg" loop playsinline preload="none" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 34%"></video><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
898          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 46%,rgba(10,10,12,0.86) 100%)"></span>
899          <span style="position:absolute;left:10px;bottom:9px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.95);text-transform:uppercase">SCENE 04</span>
900          <span style="{{ sm3 }}"></span>
901        </div>
902        <div data-scenetile="4" style="{{ st4 }}">
903          <video data-scenevideo data-src="https://content.doitong.com/video/clipchat_landing_v2/v4.mp4" poster="/lp/homepage-v5/desktop2/assets/face-profile.jpg" loop playsinline preload="none" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 34%"></video><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
904          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 46%,rgba(10,10,12,0.86) 100%)"></span>
905          <span style="position:absolute;left:10px;bottom:9px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.95);text-transform:uppercase">SCENE 05</span>
906          <span style="{{ sm4 }}"></span>
907        </div>
908        <div data-scenetile="5" style="{{ st5 }}">
909          <video data-scenevideo data-src="https://content.doitong.com/video/clipchat_landing_v2/v3.mp4" poster="/lp/homepage-v5/desktop2/assets/face-back.jpg" loop playsinline preload="none" style="display:block;width:100%;height:100%;object-fit:cover;object-position:50% 34%"></video><label style="position:absolute;top:8px;right:8px;z-index:8;width:26px;height:26px;border-radius:50%;background:rgba(10,10,12,0.75);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:13px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label>
910          <span style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 46%,rgba(10,10,12,0.86) 100%)"></span>
911          <span style="position:absolute;left:10px;bottom:9px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.16em;color:rgba(244,241,234,0.95);text-transform:uppercase">SCENE 06</span>
912          <span style="{{ sm5 }}"></span>
913        </div>
914        </div>
915        <p style="margin:0;font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);max-width:52ch">One reference anchors the hero&#39;s appearance. Angles, emotions and surroundings change from scene to scene, but the character stays recognisable.</p>
916      </div>
917    </div>
918  </section>
919
920  <section style="padding:64px max(32px, calc((100% - 1480px) / 2)) 64px" data-screen-label="Who it's for">
921    <div style="display:flex;align-items:flex-end;justify-content:space-between;gap:48px;flex-wrap:wrap">
922      <div>
923        <div style="display:inline-flex;align-items:center;gap:8px;border-left:2px solid var(--acc);padding-left:10px;font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase">Who it&#39;s for</div>
924        <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;line-height:0.97;letter-spacing:-0.035em;margin:16px 0 0 0;white-space:nowrap;font-size:clamp(30px,3vw,46px);color:var(--ink);text-align:left">Who can use <span style="color:var(--acc)">ClipChat</span>
925</h2>
926      </div>
927      </div>
928
929    <div style="margin-top:40px;display:grid;grid-template-columns:repeat(3,1fr);align-items:start;gap:20px">
930      <div data-aud="1" data-audk="0" onMouseEnter="{{ hoverAud }}" onMouseLeave="{{ leaveAud }}" style="position:relative;min-width:0;aspect-ratio:3/4;border-radius:14px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);cursor:pointer;transition:transform .55s cubic-bezier(.2,.8,.3,1),border-color .4s ease,box-shadow .55s ease;box-shadow:0 20px 44px rgba(0,0,0,0.5);animation:riseIn .9s cubic-bezier(.2,.7,.3,1) 0.05s both" style-hover="transform:translateY(-10px);border-color:rgba(255,61,46,0.6);box-shadow:0 34px 70px rgba(0,0,0,0.6),0 0 46px rgba(255,61,46,0.18)">
931        <div data-audimg="1" style="position:absolute;inset:0;transition:transform 1.6s cubic-bezier(.2,.8,.3,1);transform:scale({{ az0 }})">
932          <img src="/lp/homepage-v5/desktop2/assets/aud-1.jpg" alt="" style="display:block;width:100%;height:100%;object-fit:cover" />
933        </div>
934        <div style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.15) 0%,rgba(10,10,12,0.05) 42%,rgba(10,10,12,0.92) 100%)"></div>
935        <span style="position:absolute;top:16px;left:18px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-weight:700;font-size:11px;letter-spacing:0.22em;color:rgba(244,241,234,0.85);text-shadow:0 2px 10px rgba(0,0,0,0.9)">01</span>
936        <span style="position:absolute;top:14px;right:16px;z-index:3;pointer-events:none;width:26px;height:26px;border-radius:50%;border:1px solid rgba(244,241,234,0.3);display:flex;align-items:center;justify-content:center;font-size:11px;color:rgba(244,241,234,0.8)">↗</span>
937        <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;pointer-events:none;padding:24px 20px 22px 20px">
938          <div style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.22em;color:var(--acc);text-transform:uppercase">Social</div>
939          <h3 style="margin:10px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(20px,1.8vw,26px);line-height:1.02;letter-spacing:-0.035em;color:#F4F1EA;text-wrap:balance">I want to star in my music video</h3>
940          <p style="margin:10px 0 0;font-size:13px;line-height:1.4;color:rgba(244,241,234,0.72)">Choose a track you love, add your photo and become the hero of your own visual story.</p>
941          <div style="margin-top:14px;height:2px;width:34px;background:var(--acc);border-radius:2px;box-shadow:0 0 14px rgba(255,61,46,0.7)"></div>
942        </div>
943      </div>
944      <div data-aud="1" data-audk="1" onMouseEnter="{{ hoverAud }}" onMouseLeave="{{ leaveAud }}" style="position:relative;min-width:0;aspect-ratio:3/4;border-radius:14px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);cursor:pointer;transition:transform .55s cubic-bezier(.2,.8,.3,1),border-color .4s ease,box-shadow .55s ease;box-shadow:0 20px 44px rgba(0,0,0,0.5);animation:riseIn .9s cubic-bezier(.2,.7,.3,1) 0.14s both" style-hover="transform:translateY(-10px);border-color:rgba(255,61,46,0.6);box-shadow:0 34px 70px rgba(0,0,0,0.6),0 0 46px rgba(255,61,46,0.18)">
945        <div data-audimg="1" style="position:absolute;inset:0;transition:transform 1.6s cubic-bezier(.2,.8,.3,1);transform:scale({{ az1 }})">
946          <img src="/lp/homepage-v5/desktop2/assets/aud-2.jpg" alt="" style="display:block;width:100%;height:100%;object-fit:cover" />
947        </div>
948        <div style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.15) 0%,rgba(10,10,12,0.05) 42%,rgba(10,10,12,0.92) 100%)"></div>
949        <span style="position:absolute;top:16px;left:18px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-weight:700;font-size:11px;letter-spacing:0.22em;color:rgba(244,241,234,0.85);text-shadow:0 2px 10px rgba(0,0,0,0.9)">02</span>
950        <span style="position:absolute;top:14px;right:16px;z-index:3;pointer-events:none;width:26px;height:26px;border-radius:50%;border:1px solid rgba(244,241,234,0.3);display:flex;align-items:center;justify-content:center;font-size:11px;color:rgba(244,241,234,0.8)">↗</span>
951        <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;pointer-events:none;padding:24px 20px 22px 20px">
952          <div style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.22em;color:var(--acc);text-transform:uppercase">Releases</div>
953          <h3 style="margin:10px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(20px,1.8vw,26px);line-height:1.02;letter-spacing:-0.035em;color:#F4F1EA;text-wrap:balance">I need content for social media</h3>
954          <p style="margin:10px 0 0;font-size:13px;line-height:1.4;color:rgba(244,241,234,0.72)">Create music videos and short videos for Reels, Shorts and TikTok without filming or editing by hand</p>
955          <div style="margin-top:14px;height:2px;width:34px;background:var(--acc);border-radius:2px;box-shadow:0 0 14px rgba(255,61,46,0.7)"></div>
956        </div>
957      </div>
958      <div data-aud="1" data-audk="2" onMouseEnter="{{ hoverAud }}" onMouseLeave="{{ leaveAud }}" style="position:relative;min-width:0;aspect-ratio:3/4;border-radius:14px;overflow:hidden;background:#0B0B0E;border:1px solid var(--line);cursor:pointer;transition:transform .55s cubic-bezier(.2,.8,.3,1),border-color .4s ease,box-shadow .55s ease;box-shadow:0 20px 44px rgba(0,0,0,0.5);animation:riseIn .9s cubic-bezier(.2,.7,.3,1) 0.23s both" style-hover="transform:translateY(-10px);border-color:rgba(255,61,46,0.6);box-shadow:0 34px 70px rgba(0,0,0,0.6),0 0 46px rgba(255,61,46,0.18)">
959        <div data-audimg="1" style="position:absolute;inset:0;transition:transform 1.6s cubic-bezier(.2,.8,.3,1);transform:scale({{ az2 }})">
960          <img src="/lp/homepage-v5/desktop2/assets/aud-3.jpg" alt="" style="display:block;width:100%;height:100%;object-fit:cover" />
961        </div>
962        <div style="position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(10,10,12,0.15) 0%,rgba(10,10,12,0.05) 42%,rgba(10,10,12,0.92) 100%)"></div>
963        <span style="position:absolute;top:16px;left:18px;z-index:3;pointer-events:none;font-family:'Space Mono',monospace;font-weight:700;font-size:11px;letter-spacing:0.22em;color:rgba(244,241,234,0.85);text-shadow:0 2px 10px rgba(0,0,0,0.9)">03</span>
964        <span style="position:absolute;top:14px;right:16px;z-index:3;pointer-events:none;width:26px;height:26px;border-radius:50%;border:1px solid rgba(244,241,234,0.3);display:flex;align-items:center;justify-content:center;font-size:11px;color:rgba(244,241,234,0.8)">↗</span>
965        <div style="position:absolute;left:0;right:0;bottom:0;z-index:3;pointer-events:none;padding:24px 20px 22px 20px">
966          <div style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.22em;color:var(--acc);text-transform:uppercase">Beats</div>
967          <h3 style="margin:10px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(20px,1.8vw,26px);line-height:1.02;letter-spacing:-0.035em;color:#F4F1EA;text-wrap:balance">I have my own track</h3>
968          <p style="margin:10px 0 0;font-size:13px;line-height:1.4;color:rgba(244,241,234,0.72)">Turn a song into a complete visual - from the idea and scenes to the finished music video</p>
969          <div style="margin-top:14px;height:2px;width:34px;background:var(--acc);border-radius:2px;box-shadow:0 0 14px rgba(255,61,46,0.7)"></div>
970        </div>
971      </div>
972    </div>
973
974    <div style="position:relative;margin-top:20px;overflow:hidden;border-radius:14px;border:1px solid rgba(18,16,15,0.10);background:radial-gradient(70% 120% at 18% 0%,#FFFFFF,transparent 62%),linear-gradient(168deg,#F7F4ED 0%,#EDE8DE 62%,#E5E0D4 100%);padding:26px 32px;display:flex;align-items:center;justify-content:space-between;gap:28px;flex-wrap:wrap;box-shadow:0 22px 48px rgba(0,0,0,0.4)">
975      <span style="position:absolute;inset:0;pointer-events:none;opacity:0.5;background-image:radial-gradient(rgba(18,16,15,0.20) 0.5px,transparent 0.5px);background-size:4px 4px"></span>
976      <div style="position:relative;z-index:2;display:flex;align-items:center;gap:22px;flex:1;min-width:0;flex-wrap:wrap">
977        <span style="display:inline-flex;align-items:center;gap:8px;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.2em;color:#6B655C;text-transform:uppercase;white-space:nowrap;font-weight:700"><span class="pulse" style="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--acc)"></span>And the main thing</span>
978        <span style="width:1px;height:34px;background:rgba(18,16,15,0.16)"></span>
979        <div style="min-width:0">
980          <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(22px,2.1vw,30px);line-height:1.02;letter-spacing:-0.04em;color:#12100F">Can&#39;t edit video? <span style="font-family:'Instrument Serif',serif;font-style:italic;font-weight:400;color:#C41A0A">You don&#39;t need to</span></div>
981          <p style="margin:8px 0 0 0;font-size:15px;line-height:1.45;font-weight:500;letter-spacing:-0.006em;color:#3E3A34;max-width:62ch">You upload a track — the AI does the rest. No editing, no settings, no experience with AI needed.</p>
982        </div>
983      </div>
984      <span style="position:relative;z-index:2;display:inline-flex;align-items:baseline;gap:10px;flex-shrink:0;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;letter-spacing:-0.035em;color:#16090A;color:#F7F4ED;background:linear-gradient(180deg,#1E1B17 0%,#12100F 100%);border:1px solid rgba(18,16,15,0.3);border-radius:12px;padding:14px 24px;box-shadow:0 14px 30px rgba(18,16,15,0.28)">
985        <span style="font-size:24px;line-height:1">Beginner</span>
986        <span style="font-family:'Space Mono',monospace;font-weight:700;font-size:9px;letter-spacing:0.14em;text-transform:uppercase;opacity:0.8">and that&#39;s enough</span>
987        
988      </span>
989    </div>
990  </section>
991
992  <div style="height:1px;margin:32px 16px;background:linear-gradient(90deg,transparent,var(--line2) 18%,var(--line2) 82%,transparent)"></div>
993
994  <div style="height:1px;margin:32px 16px;background:linear-gradient(90deg,transparent,var(--line2) 18%,var(--line2) 82%,transparent)"></div>
995
996  
997  
998  <section style="position:relative;overflow:hidden;padding:64px max(32px, calc((100% - 1480px) / 2));background:#0C0C0F;border-top:1px solid var(--line);border-bottom:1px solid var(--line)" data-screen-label="Testimonials">
999    <span style="position:absolute;top:-120px;left:-100px;width:420px;height:420px;pointer-events:none;background:radial-gradient(closest-side,rgba(255,61,46,0.10),transparent 74%);filter:blur(16px);animation:auraDrift 15s ease-in-out infinite"></span>
1000    <div style="position:relative;display:flex;align-items:flex-end;justify-content:space-between;gap:48px;flex-wrap:wrap">
1001      <div style="min-width:0">
1002        <div style="display:inline-flex;align-items:center;gap:8px;border-left:2px solid var(--acc);padding-left:10px;font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase">Reviews</div>
1003        <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(34px,3.4vw,52px);line-height:0.97;letter-spacing:-0.04em;margin:18px 0 0 0;text-wrap:balance;color:var(--ink);text-align:left">What <span style="font-family:&#39;Instrument Serif&#39;,serif;font-style:italic;font-weight:400;color:var(--acc)">users</span> say
1004</h2>
1005      </div>
1006      <div style="display:flex;align-items:center;gap:18px">
1007        <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:44px;line-height:1;letter-spacing:-0.045em;color:var(--ink)">4.8</span>
1008        <span style="display:flex;flex-direction:column;gap:5px">
1009          <span style="display:flex;gap:2px;color:#FFC531;font-size:14px;line-height:1">★★★★★</span>
1010          <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dim);text-transform:uppercase">Average rating</span>
1011        </span>
1012      </div>
1013    </div>
1014
1015    <div style="position:relative;margin-top:32px;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));align-items:start;gap:16px">
1016<figure data-tm="0" onClick="{{ nextTm }}" style="{{ tms0 }}">
1017        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.5),transparent)"></span>
1018        <div>
1019          <div style="display:flex;gap:2px;color:#FFC531;font-size:12px;line-height:1" data-stars="1"><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.00s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.08s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.16s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.24s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.32s both;animation-play-state:paused">★</span></div>
1020          <blockquote style="margin:16px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:16px;line-height:1.3;letter-spacing:-0.028em;color:var(--ink);text-wrap:pretty">I usually piece a video together across different tools. Here I uploaded the track and got a complete story right away. Best of all, the face stays consistent from scene to scene.</blockquote>
1021        </div>
1022        <figcaption style="display:flex;align-items:center;gap:14px;border-top:1px solid var(--line);padding-top:14px">
1023          <span style="position:relative;width:44px;height:44px;flex-shrink:0;border-radius:50%;border:1px solid var(--line2)"><span style="position:absolute;inset:0;border-radius:50%;overflow:hidden;display:block"><img data-photo="av1" src="/lp/homepage-v5/desktop2/assets/av1.jpg" alt="" style="width:100%;height:100%;object-fit:cover;display:block" /></span><label style="position:absolute;bottom:-2px;right:-2px;z-index:6;width:22px;height:22px;border-radius:50%;background:rgba(10,10,12,0.85);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:11px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label></span>
1024          <span style="display:flex;flex-direction:column;gap:3px;min-width:0">
1025            <a href="{{ igUrl1 }}" target="_blank" rel="noopener" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-decoration:none">@{{ igNick1 }}</a>
1026            <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dim);text-transform:uppercase">AI creator</span>
1027          </span>
1028        </figcaption>
1029      </figure>
1030      
1031      <figure data-tm="1" onClick="{{ nextTm }}" style="{{ tms1 }}">
1032        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.5),transparent)"></span>
1033        <div>
1034          <div style="display:flex;gap:2px;color:#FFC531;font-size:12px;line-height:1" data-stars="1"><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.00s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.08s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.16s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.24s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.32s both;animation-play-state:paused">★</span></div>
1035          <blockquote style="margin:16px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:16px;line-height:1.3;letter-spacing:-0.028em;color:var(--ink);text-wrap:pretty">I liked that you can rebuild a single scene instead of paying for the whole clip again.</blockquote>
1036        </div>
1037        <figcaption style="display:flex;align-items:center;gap:14px;border-top:1px solid var(--line);padding-top:14px">
1038          <span style="position:relative;width:44px;height:44px;flex-shrink:0;border-radius:50%;border:1px solid var(--line2)"><span style="position:absolute;inset:0;border-radius:50%;overflow:hidden;display:block"><img data-photo="av2" src="/lp/homepage-v5/desktop2/assets/av2.jpg" alt="" style="width:100%;height:100%;object-fit:cover;display:block" /></span><label style="position:absolute;bottom:-2px;right:-2px;z-index:6;width:22px;height:22px;border-radius:50%;background:rgba(10,10,12,0.85);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:11px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label></span>
1039          <span style="display:flex;flex-direction:column;gap:3px;min-width:0">
1040            <a href="{{ igUrl2 }}" target="_blank" rel="noopener" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-decoration:none">@{{ igNick2 }}</a>
1041            <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dim);text-transform:uppercase">songwriter</span>
1042          </span>
1043        </figcaption>
1044      </figure>
1045      <figure data-tm="2" onClick="{{ nextTm }}" style="{{ tms2 }}">
1046        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.5),transparent)"></span>
1047        <div>
1048          <div style="display:flex;gap:2px;color:#FFC531;font-size:12px;line-height:1" data-stars="1"><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.00s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.08s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.16s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.24s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.32s both;animation-play-state:paused">★</span></div>
1049          <blockquote style="margin:16px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:16px;line-height:1.3;letter-spacing:-0.028em;color:var(--ink);text-wrap:pretty">A convenient workflow and a broad set of tools for working on video. The whole process can be built in one place instead of jumping between a dozen services.</blockquote>
1050        </div>
1051        <figcaption style="display:flex;align-items:center;gap:14px;border-top:1px solid var(--line);padding-top:14px">
1052          <span style="position:relative;width:44px;height:44px;flex-shrink:0;border-radius:50%;border:1px solid var(--line2)"><span style="position:absolute;inset:0;border-radius:50%;overflow:hidden;display:block"><img data-photo="av3" src="/lp/homepage-v5/desktop2/assets/av3.jpg" alt="" style="width:100%;height:100%;object-fit:cover;display:block" /></span><label style="position:absolute;bottom:-2px;right:-2px;z-index:6;width:22px;height:22px;border-radius:50%;background:rgba(10,10,12,0.85);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:11px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label></span>
1053          <span style="display:flex;flex-direction:column;gap:3px;min-width:0">
1054            <a href="{{ igUrl3 }}" target="_blank" rel="noopener" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-decoration:none">@{{ igNick3 }}</a>
1055            <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dim);text-transform:uppercase">music and AI video creator</span>
1056          </span>
1057        </figcaption>
1058      </figure>
1059      <figure data-tm="3" onClick="{{ nextTm }}" style="{{ tms3 }}">
1060        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.5),transparent)"></span>
1061        <div>
1062          <div style="display:flex;gap:2px;color:#FFC531;font-size:12px;line-height:1" data-stars="1"><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.00s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.08s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.16s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.24s both;animation-play-state:paused">★</span><span style="animation:pop .45s cubic-bezier(.2,.9,.3,1.4) 0.32s both;animation-play-state:paused">★</span></div>
1063          <blockquote style="margin:16px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:16px;line-height:1.3;letter-spacing:-0.028em;color:var(--ink);text-wrap:pretty">Honestly, I expected a steep learning curve. But I uploaded the track, reviewed the storyboard, tweaked a couple of scenes, and only then started generating. It&#39;s so much easier when you know what you&#39;re getting up front.</blockquote>
1064        </div>
1065        <figcaption style="display:flex;align-items:center;gap:14px;border-top:1px solid var(--line);padding-top:14px">
1066          <span style="position:relative;width:44px;height:44px;flex-shrink:0;border-radius:50%;border:1px solid var(--line2)"><span style="position:absolute;inset:0;border-radius:50%;overflow:hidden;display:block"><img data-photo="av4" src="/lp/homepage-v5/desktop2/assets/av4.jpg" alt="" style="width:100%;height:100%;object-fit:cover;display:block" /></span><label style="position:absolute;bottom:-2px;right:-2px;z-index:6;width:22px;height:22px;border-radius:50%;background:rgba(10,10,12,0.85);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:'Space Mono',monospace;font-size:11px;color:var(--ink);cursor:pointer" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)">+<input type="file" accept="image/*" onChange="{{ onPhoto }}" style="display:none" /></label></span>
1067          <span style="display:flex;flex-direction:column;gap:3px;min-width:0">
1068            <a href="{{ igUrl4 }}" target="_blank" rel="noopener" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-decoration:none">@{{ igNick4 }}</a>
1069            <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.16em;color:var(--dim);text-transform:uppercase">AI and video editing expert</span>
1070          </span>
1071        </figcaption>
1072      </figure>
1073      </div>
1074
1075      <div style="margin:20px auto 0 auto;display:flex;gap:8px;justify-content:center;position:relative;z-index:12">
1076        <span data-val="0" onClick="{{ pickTm }}" style="{{ tmd0 }}"></span>
1077        <span data-val="1" onClick="{{ pickTm }}" style="{{ tmd1 }}"></span>
1078        <span data-val="2" onClick="{{ pickTm }}" style="{{ tmd2 }}"></span>
1079        <span data-val="3" onClick="{{ pickTm }}" style="{{ tmd3 }}"></span>
1080      </div>
1081
1082</div></div>
1083
1084</section>
1085
1086  <section id="pricing-overview" style="position:relative;overflow:hidden;padding:64px max(32px, calc((100% - 1480px) / 2));background:#08080A" data-screen-label="Pricing">
1087    <div style="display:none">
1088      <div style="width:80px;height:80px;border-radius:50%;background:linear-gradient(150deg,#FFD86B 0%,#F5A623 48%,#C97A11 100%);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;box-shadow:0 0 34px rgba(245,166,35,0.45),0 14px 28px rgba(0,0,0,0.5);animation:coinFlip 5.5s ease-in-out infinite">
1089        <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:26px;letter-spacing:-0.04em;line-height:1;color:#3A2404">$27</span>
1090        <span style="font-family:'Space Mono',monospace;font-size:7.5px;letter-spacing:0.16em;text-transform:uppercase;color:#5A3A08">START</span>
1091      </div>
1092
1093    </div>
1094    <div style="display:inline-flex;align-items:center;gap:8px;border-left:2px solid var(--acc);padding-left:10px;font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase">
1094Pricing</div>
1095    <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(34px,3.4vw,52px);line-height:0.97;letter-spacing:-0.035em;margin:16px 0 0 0;text-wrap:balance;background:linear-gradient(180deg,#FFFFFF 0%,#F4F1EA 46%,#A49BA1 100%);-webkit-background-clip:text;background-clip:text;color:transparent;;text-align:left">Know the price before <span style="font-family:'Instrument Serif',serif;font-style:italic;color:var(--acc)">you press play</span></h2>
1096    <p style="font-size:17px;line-height:1.5;letter-spacing:-0.011em;color:var(--dim);max-width:40ch;margin:16px 0 0 0;text-align:left">Turn one track into a full music video and vertical content for different platforms</p>
1097      <div data-clipchat-intro-offer data-expires-at="2026-10-05T14:55:29Z" data-expired-label="The discount has ended" style="margin-top:28px;padding:16px 18px;border:1px solid rgba(255,61,46,0.48);border-radius:12px;background:#171012;color:var(--ink);display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap" role="status" aria-live="polite">
1098    <div style="min-width:0">
1099      <strong style="display:block;font-family:'Bricolage Grotesque',sans-serif;font-size:17px;line-height:1.25">Lock in your new-user price</strong>
1100      <span style="display:block;margin-top:4px;font-family:'Instrument Sans',sans-serif;font-size:14px;line-height:1.4;color:var(--dim)">50% off — the timer will not restart</span>
1101    </div>
1102    <div style="display:flex;align-items:center;gap:10px">
1103      <span data-clipchat-intro-badge style="font-family:'Space Mono',monospace;font-size:11px;font-weight:700;letter-spacing:0.08em;color:#16090A;background:var(--acc);border-radius:999px;padding:5px 10px">-50%</span>
1104      <time data-clipchat-intro-timer style="font-family:'Space Mono',monospace;font-size:20px;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:0.04em">03:00:00</time>
1105    </div>
1106  </div>
1107
1108    <style>
1109  [data-clipchat-plan-calculator] input[type="range"]:focus-visible { outline:2px solid #FF3D2E;outline-offset:4px;border-radius:4px }
1110</style>
1111<div data-clipchat-plan-calculator="1" style="margin-top:24px;max-width:920px;background:#FFFFFF;border:1px solid rgba(18,16,15,0.12);border-radius:6px;padding:28px 30px">
1112  <div style="display:flex;align-items:flex-end;justify-content:space-between;gap:16px">
1113    <label for="clipchat-calculator-minutes" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:20px;letter-spacing:-0.025em;color:#12100F;line-height:1.15">Clip minutes</label>
1114    <output for="clipchat-calculator-minutes" aria-live="polite" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:42px;line-height:0.9;letter-spacing:-0.04em;color:#12100F;font-variant-numeric:tabular-nums">{{ calcMin }}<span style="font-size:15px;font-weight:600;color:#6F6964;letter-spacing:-0.01em"> min</span></output>
1115  </div>
1116  <input id="clipchat-calculator-minutes" type="range" min="1" max="24" step="1" value="{{ calcMin }}" onInput="{{ setCalc }}" style="width:100%;min-height:44px;margin-top:14px;accent-color:#FF3D2E;cursor:pointer" />
1117  <p style="margin:12px 0 0;font-family:'Instrument Sans',sans-serif;font-size:14px;line-height:1.4;color:#12100F">Recommended plan — what&#39;s included</p>
1118  <div style="margin-top:12px;padding-top:16px;border-top:1px solid rgba(18,16,15,0.12);display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr) auto;align-items:end;gap:28px">
1119    <div style="display:flex;flex-direction:column;gap:4px;min-width:0">
1120      <span style="font-family:'Instrument Sans',sans-serif;font-size:12px;line-height:1.25;color:#6F6964">Number of videos</span>
1121      <strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:16px;line-height:1.25;letter-spacing:-0.02em;color:#12100F">{{ calcPlanVideos }}</strong>
1122    </div>
1123    <div style="display:flex;flex-direction:column;gap:4px;min-width:0">
1124      <span style="font-family:'Instrument Sans',sans-serif;font-size:12px;line-height:1.25;color:#6F6964">Credits a month</span>
1125      <strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:16px;line-height:1.25;letter-spacing:-0.02em;color:#12100F;font-variant-numeric:tabular-nums">{{ calcPlanCredits }}</strong>
1126    </div>
1127    <strong aria-live="polite" style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:16px;line-height:1.2;letter-spacing:-0.02em;color:var(--acc);text-align:right;white-space:nowrap">{{ calcPlan }}</strong>
1128  </div>
1129</div>
1130<script>
1131  window.ClipChatLandingCalculator = function (minutes, dictionary = {}) {
1132    // Package estimates select a plan; they are not a generation credit rate.
1133    const plans = [{"approximate_minutes":5,"credits":142000,"approximate_videos":15,"video_seconds":20},{"approximate_minutes":10,"credits":260000,"approximate_videos":30,"video_seconds":20},{"approximate_minutes":24,"credits":600000,"approximate_videos":72,"video_seconds":20}];
1134    const requested = Number(minutes);
1135    const selectedMinutes = Number.isFinite(requested) && requested > 0 ? requested : plans[0].approximate_minutes;
1136    const index = plans.findIndex(plan => selectedMinutes <= plan.approximate_minutes);
1137    const tier = (index < 0 ? plans.length - 1 : index) + 1;
1138    const plan = plans[tier - 1];
1139    const deadline = Date.parse(dictionary.introOfferExpiresAt);
1140    const expired = dictionary.introOfferExpiresAt !== undefined &&
1141      (!Number.isFinite(deadline) || Date.now() >= deadline);
1142    const priceLabel = dictionary['p' + tier + (expired ? 'BaseLabel' : 'Label')];
1143
1144    return {
1145      credits: dictionary['p' + tier + 'Cr'] || String(plan.credits),
1146      videos: dictionary['p' + tier + 'Videos'] || ('≈' + plan.approximate_videos + ' × ' + plan.video_seconds + 's'),
1147      plan: priceLabel || dictionary['p' + tier + 'Name'] || ['Start', 'Pro', 'Max'][tier - 1]
1148    };
1149  };
1150</script>
1150
1151
1152    <div id="pricing" data-clipchat-tariffs="1" style="scroll-margin-top:100px">
1153    <h3 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(34px,3.4vw,52px);line-height:0.97;letter-spacing:-0.035em;color:var(--ink);margin:32px 0 0 0;text-transform:uppercase">Plans</h3>
1154    <div style="display:grid;grid-template-columns:repeat(3,1fr);align-items:start;gap:20px;margin-top:40px">
1155      <div style="position:relative;overflow:hidden;background:radial-gradient(110% 80% at 22% 0%,rgba(96,140,255,0.18),transparent 62%),linear-gradient(168deg,#161A26 0%,#0E0F14 68%);border:1px solid rgba(96,140,255,0.42);border-radius:6px;padding:24px;display:flex;flex-direction:column;gap:0;box-shadow:0 0 44px rgba(96,140,255,0.14),0 14px 32px rgba(0,0,0,0.45)">
1156        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(140,175,255,0.85),transparent)"></span>
1157        <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
1158          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:0.02em;text-transform:uppercase;color:var(--dim)">START</span>
1159          
1160        </div>
1161        <div style="margin-top:14px;display:flex;align-items:flex-end;gap:8px">
1162          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:42px;line-height:0.85;letter-spacing:-0.045em;color:var(--ink)">  <span data-clipchat-intro-price style="display:inline-flex;flex-direction:column;align-items:flex-start;gap:5px">
1163    <span data-clipchat-intro-base style="font-family:'Instrument Sans',sans-serif;font-size:0.42em;line-height:1;color:var(--dim);text-decoration:line-through;text-decoration-thickness:1px">$27</span>
1164    <span data-clipchat-intro-sale>$13.50</span>
1165  </span>
1166</span>
1167          <span style="font-family:'Instrument Sans',sans-serif;font-size:13px;color:var(--dim);padding-bottom:3px">/ mo</span>
1168        </div>
1169        <div style="margin-top:16px;padding-top:14px;border-top:1px solid rgba(244,241,234,0.10);display:flex;flex-direction:column;gap:8px">
1170          <div style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1171            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Clip minutes</span>
1172            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink)">~5 min</span>
1173          </div>
1174          <div data-plan-videos="growth" style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1175            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Number of videos</span>
1176            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-align:right">≈15 × 20s</span>
1177          </div>
1178          <div style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1179            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Credits a month</span>
1180            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--acc)" data-plan-credits="growth">142,000</span>
1181          </div>
1182        </div>
1183        <div data-plan-summary="growth" style="margin-top:18px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;line-height:1.18;letter-spacing:-0.025em;color:var(--ink)">Discover ClipChat</div>
1184        <p style="margin:6px 0 0 0;font-size:14px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim)">Ideal for creating your first full music video, several vertical videos and getting to know ClipChat.</p>
1185        <a href="/clipchat/checkout?plan=growth&amp;period=monthly&amp;lang=en-GB" data-clipchat-plan="growth" style="display:block;box-sizing:border-box;text-align:center;text-decoration:none;margin-top:18px;width:100%;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.01em;color:var(--ink);background:transparent;border:1px solid rgba(244,241,234,0.24);border-radius:6px;padding:14px 16px;cursor:pointer">Choose</a>
1186      </div>
1187      <div style="position:relative;overflow:hidden;background:linear-gradient(168deg,#1D100E 0%,#0E0E11 68%);border:1px solid rgba(255,61,46,0.55);border-radius:6px;padding:24px;display:flex;flex-direction:column;gap:0;box-shadow:0 0 48px rgba(255,61,46,0.12),0 18px 40px rgba(0,0,0,0.5)">
1188        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.9),transparent)"></span>
1189        <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
1190          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:0.02em;text-transform:uppercase;color:var(--acc)">PRO</span>
1191          <span style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.14em;text-transform:uppercase;color:#16090A;background:var(--acc);border-radius:999px;padding:4px 10px;white-space:nowrap">Recommended</span>
1192        </div>
1193        <div style="margin-top:14px;display:flex;align-items:flex-end;gap:8px">
1194          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:42px;line-height:0.85;letter-spacing:-0.045em;color:var(--ink)">  <span data-clipchat-intro-price style="display:inline-flex;flex-direction:column;align-items:flex-start;gap:5px">
1195    <span data-clipchat-intro-base style="font-family:'Instrument Sans',sans-serif;font-size:0.42em;line-height:1;color:var(--dim);text-decoration:line-through;text-decoration-thickness:1px">$49</span>
1196    <span data-clipchat-intro-sale>$24.50</span>
1197  </span>
1198</span>
1199          <span style="font-family:'Instrument Sans',sans-serif;font-size:13px;color:var(--dim);padding-bottom:3px">/ mo</span>
1200        </div>
1201        <div style="margin-top:16px;padding-top:14px;border-top:1px solid rgba(244,241,234,0.10);display:flex;flex-direction:column;gap:8px">
1202          <div style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1203            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Clip minutes</span>
1204            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink)">~10 min</span>
1205          </div>
1206          <div data-plan-videos="pro" style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1207            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Number of videos</span>
1208            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-align:right">≈30 × 20s</span>
1209          </div>
1210          <div style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1211            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Credits a month</span>
1212            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--acc)" data-plan-credits="pro">260,000</span>
1213          </div>
1214        </div>
1215        <div data-plan-summary="pro" style="margin-top:18px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;line-height:1.18;letter-spacing:-0.025em;color:var(--ink)">Core plan</div>
1216        <p style="margin:6px 0 0 0;font-size:14px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim)">Create a full music video and short video formats for social media.</p>
1217        <a href="/clipchat/checkout?plan=pro&amp;period=monthly&amp;lang=en-GB" data-clipchat-plan="pro" style="display:block;box-sizing:border-box;text-align:center;text-decoration:none;margin-top:18px;width:100%;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.01em;color:#16090A;background:var(--acc);border:1px solid var(--acc);border-radius:6px;padding:14px 16px;cursor:pointer">Choose</a>
1218      </div>
1219      <div style="position:relative;overflow:hidden;background:radial-gradient(110% 80% at 22% 0%,rgba(96,140,255,0.18),transparent 62%),linear-gradient(168deg,#161A26 0%,#0E0F14 68%);border:1px solid rgba(96,140,255,0.42);border-radius:6px;padding:24px;display:flex;flex-direction:column;gap:0;box-shadow:0 0 44px rgba(96,140,255,0.14),0 14px 32px rgba(0,0,0,0.45)">
1220        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(140,175,255,0.85),transparent)"></span>
1221        <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
1222          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:0.02em;text-transform:uppercase;color:var(--dim)">MAX</span>
1223          
1224        </div>
1225        <div style="margin-top:14px;display:flex;align-items:flex-end;gap:8px">
1226          <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:42px;line-height:0.85;letter-spacing:-0.045em;color:var(--ink)">  <span data-clipchat-intro-price style="display:inline-flex;flex-direction:column;align-items:flex-start;gap:5px">
1227    <span data-clipchat-intro-base style="font-family:'Instrument Sans',sans-serif;font-size:0.42em;line-height:1;color:var(--dim);text-decoration:line-through;text-decoration-thickness:1px">$120</span>
1228    <span data-clipchat-intro-sale>$60</span>
1229  </span>
1230</span>
1231          <span style="font-family:'Instrument Sans',sans-serif;font-size:13px;color:var(--dim);padding-bottom:3px">/ mo</span>
1232        </div>
1233        <div style="margin-top:16px;padding-top:14px;border-top:1px solid rgba(244,241,234,0.10);display:flex;flex-direction:column;gap:8px">
1234          <div style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1235            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Clip minutes</span>
1236            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink)">~24 min</span>
1237          </div>
1238          <div data-plan-videos="massive" style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1239            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Number of videos</span>
1240            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--ink);text-align:right">≈72 × 20s</span>
1241          </div>
1242          <div style="display:flex;align-items:baseline;justify-content:space-between;gap:12px">
1243            <span style="font-family:'Instrument Sans',sans-serif;font-size:14px;color:var(--dim)">Credits a month</span>
1244            <span style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.02em;color:var(--acc)" data-plan-credits="massive">600,000</span>
1245          </div>
1246        </div>
1247        <div data-plan-summary="massive" style="margin-top:18px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;line-height:1.18;letter-spacing:-0.025em;color:var(--ink)">Professional plan</div>
1248        <p style="margin:6px 0 0 0;font-size:14px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim)">For regular production, multiple projects, client work or a large volume of content.</p>
1249        <a href="/clipchat/checkout?plan=massive&amp;period=monthly&amp;lang=en-GB" data-clipchat-plan="massive" style="display:block;box-sizing:border-box;text-align:center;text-decoration:none;margin-top:18px;width:100%;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.01em;color:var(--ink);background:transparent;border:1px solid rgba(244,241,234,0.24);border-radius:6px;padding:14px 16px;cursor:pointer">Choose</a>
1250      </div>
1251    </div>
1252    <div data-clipchat-funnel-choice="1" aria-hidden="true"
1253     style="display:none;margin-top:28px;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;border:1px solid rgba(255,61,46,.42);border-radius:10px;padding:22px;background:linear-gradient(145deg,rgba(255,61,46,.12),rgba(12,12,15,.92))">
1254  <div style="grid-column:1/-1">
1255    <div style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:var(--acc)">ClipChat</div>
1256    <h3 style="margin:8px 0 0;font-family:'Bricolage Grotesque',sans-serif;font-size:28px;line-height:1.05;color:var(--ink)">Create a music video</h3>
1257    <p style="margin:8px 0 0;font-size:14px;line-height:1.5;color:var(--dim)">Review the visuals before full generation</p>
1258  </div>
1259
1260  <a href="/create/clipboard?show=pricing&amp;plan=pro&amp;period=monthly&amp;lang=en-GB"
1261     data-clipchat-funnel-action="buy_now"
1262     style="display:flex;min-height:86px;box-sizing:border-box;flex-direction:column;justify-content:space-between;padding:16px;border:1px solid rgba(244,241,234,.18);border-radius:8px;color:var(--ink);text-decoration:none;background:rgba(244,241,234,.04)">
1263    <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:.14em;color:var(--acc)">01</span>
1264    <strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:18px">Plans →</strong>
1265  </a>
1266  <a href="/create/clipboard" data-clipchat-funnel-action="storyboard_first"
1267     style="display:flex;min-height:86px;box-sizing:border-box;flex-direction:column;justify-content:space-between;padding:16px;border:1px solid var(--acc);border-radius:8px;color:#16090A;text-decoration:none;background:var(--acc)">
1268    <span style="font-family:'Space Mono',monospace;font-size:9px;letter-spacing:.14em;color:#16090A">02</span>
1269    <strong style="font-family:'Bricolage Grotesque',sans-serif;font-size:18px">See the scene plan first →</strong>
1270  </a>
1271</div>
1272
1273    <aside data-clipchat-community="1" aria-labelledby="clipchat-community-title" style="box-sizing:border-box;margin-top:24px;max-width:920px;padding:clamp(20px,3vw,28px);border:1px solid #FF6A4D;border-radius:14px;background:#271410;color:#F4F1EA">
1274  <div style="display:flex;align-items:center;gap:12px">
1275    <svg aria-hidden="true" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#FF8A5C" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" style="flex:none">
1276      <circle cx="9" cy="8" r="3" />
1277      <path d="M3 20v-2a6 6 0 0 1 12 0v2M16 5a3 3 0 0 1 0 6M21 20v-2a6 6 0 0 0-4-5.66" />
1278    </svg>
1279    <h3 id="clipchat-community-title" style="min-width:0;margin:0;font-family:'Bricolage Grotesque',sans-serif;font-size:1.125rem;line-height:1.3;font-weight:800;color:#FF8A5C;text-wrap:balance;overflow-wrap:anywhere">Private community — included with Pro and Max</h3>
1280  </div>
1281  <p style="max-width:70ch;margin:12px 0 0;font-family:'Instrument Sans',sans-serif;font-size:1rem;line-height:1.55;color:#F4D9CE;overflow-wrap:anywhere">After payment, you get access to the private ClipChat community: help with your first video, examples, support, promotion ideas and ways to earn. The join button appears immediately after successful payment.</p>
1282</aside>
1283
1284    
1285
1286    <div style="margin-top:16px">
1287      <a href="/en-GB/pricing" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--acc);text-decoration:none;text-transform:uppercase">All plans and limits →</a>
1288    </div>
1289    <div data-clipchat-payment-methods="foreign" style="margin-top:24px;color:var(--ink);font-size:14px;line-height:1.5">
1290  <span>Payment:</span>
1291    <div data-payment-method="stripe_card" style="display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:10px">
1292        <span data-payment-label="Visa" role="img" aria-label="Visa" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#1434CB;color:#FFFFFF;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">Visa</span>
1293        <span data-payment-label="Mastercard" role="img" aria-label="Mastercard" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#EB001B;color:#FFFFFF;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">Mastercard</span>
1294        <span data-payment-label="Amex" role="img" aria-label="Amex" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#006FCF;color:#FFFFFF;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">Amex</span>
1295        <span data-payment-label="JCB" role="img" aria-label="JCB" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#146A42;color:#FFFFFF;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">JCB</span>
1296        <span data-payment-label="Apple Pay" role="img" aria-label="Apple Pay" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#FFFFFF;color:#000000;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">Apple Pay</span>
1297        <span data-payment-label="Link" role="img" aria-label="Link" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#00D66F;color:#151717;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">Link</span>
1298        <span data-payment-label="Amazon Pay" role="img" aria-label="Amazon Pay" dir="ltr" style="display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(255,255,255,.28);border-radius:7px;padding:4px 11px;background:#FFD814;color:#232F3E;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:800;letter-spacing:-0.02em;line-height:1;white-space:nowrap;box-shadow:0 3px 10px rgba(0,0,0,.18)">Amazon Pay</span>
1299    </div>
1300</div>
1301
1302    </div>
1303    </section>
1304
1305  <div style="height:1px;margin:12px 16px;background:linear-gradient(90deg,transparent,var(--line2) 18%,var(--line2) 82%,transparent)"></div>
1306
1307  
1308  <section style="position:relative;display:flex;align-items:flex-end;overflow:hidden;padding:64px max(32px, calc((100% - 1480px) / 2)) 64px" data-screen-label="Final CTA">
1309    <div style="position:absolute;inset:0;z-index:0">
1310      <video data-finalvideo="1" poster="https://content.doitong.com/video/clipchat_landing_v2/w1_hd.jpg" loop="{{ true }}" playsInline="{{ true }}" preload="metadata" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:1;transition:opacity .6s ease"></video>
1311      <label style="position:absolute;top:24px;right:24px;z-index:5;display:inline-flex;align-items:center;gap:9px;height:38px;padding:0 18px;border-radius:999px;background:rgba(10,10,12,0.72);border:1px solid rgba(244,241,234,0.35);font-family:'Space Mono',monospace;font-weight:700;font-size:9px;letter-spacing:0.16em;text-transform:uppercase;color:var(--ink);cursor:pointer;backdrop-filter:blur(6px)" style-hover="background:var(--acc);color:#16090A;border-color:var(--acc)"><span style="font-size:14px;line-height:1">+</span>
1311Upload a clip<input type="file" accept="video/*" data-val="8" onChange="{{ onFile }}" style="display:none" /></label>
1312      <span style="position:absolute;inset:0;pointer-events:none;background:radial-gradient(80% 70% at 50% 45%,rgba(10,10,12,0.62) 0%,rgba(10,10,12,0.86) 55%,#0A0A0C 100%)"></span>
1313      <span style="position:absolute;top:0;left:0;right:0;height:140px;pointer-events:none;background:linear-gradient(180deg,#0A0A0C,transparent)"></span>
1314      <span style="position:absolute;bottom:0;left:0;right:0;height:180px;pointer-events:none;background:linear-gradient(0deg,#0A0A0C,transparent)"></span>
1315    </div>
1316
1317    <div style="position:relative;z-index:2;width:100%;text-align:center">
1318      <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(52px,6.2vw,92px);line-height:0.9;letter-spacing:-0.05em;margin:26px 0 0 0;text-wrap:balance;color:var(--ink)">Favorite track.<br /><span style="font-family:'Instrument Serif',serif;font-style:italic;font-weight:400;color:var(--acc);text-shadow:0 0 60px rgba(255,61,46,0.45)">Finished music video.</span></h2>
1319
1320      <div style="margin-top:34px;display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap">
1321        <button onClick="{{ startDemo }}" style="background:linear-gradient(180deg,#FF6A4D 0%,#FF3D2E 52%,#E22A1D 100%);color:#16090A;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;letter-spacing:-0.015em;padding:20px 40px;border-radius:12px;border:none;position:relative;overflow:hidden;cursor:pointer;box-shadow:0 18px 48px rgba(255,61,46,0.4)" style-before="content:'';position:absolute;top:0;left:0;width:42%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.42),transparent);animation:shine 4.6s ease-in-out infinite">Create a music video</button>
1322        
1323      </div>
1324
1325      <div style="margin:44px auto 0 auto;max-width:900px;display:flex;gap:14px;flex-wrap:wrap;justify-content:center">
1326        <div style="flex:1;
1326min-width:200px;position:relative;border:1px solid var(--line2);border-radius:12px;padding:20px 22px;background:rgba(10,10,12,0.5);backdrop-filter:blur(6px);text-align:left">
1327          <div style="font-family:'Space Mono',monospace;font-size:8.5px;letter-spacing:0.2em;color:var(--acc);text-transform:uppercase">01</div>
1328          <div style="margin-top:10px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.035em;color:var(--ink)">See the scene plan first</div>
1329          <div style="margin-top:5px;font-size:13px;line-height:1.45;color:var(--dim)">Review the visuals before full generation</div>
1330        </div>
1331        <div style="flex:1;min-width:200px;position:relative;border:1px solid var(--line2);border-radius:12px;padding:20px 22px;background:rgba(10,10,12,0.5);backdrop-filter:blur(6px);text-align:left">
1332          <div style="font-family:'Space Mono',monospace;font-size:8.5px;letter-spacing:0.2em;color:var(--acc);text-transform:uppercase">02</div>
1333          <div style="margin-top:10px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.035em;color:var(--ink)">No card</div>
1334          <div style="margin-top:5px;font-size:13px;line-height:1.45;color:var(--dim)">Nothing to link up front</div>
1335        </div>
1336        <div style="flex:1;
1336min-width:200px;position:relative;border:1px solid var(--line2);border-radius:12px;padding:20px 22px;background:rgba(10,10,12,0.5);backdrop-filter:blur(6px);text-align:left">
1337          <div style="font-family:'Space Mono',monospace;font-size:8.5px;letter-spacing:0.2em;color:var(--acc);text-transform:uppercase">03</div>
1338          <div style="margin-top:10px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.035em;color:var(--ink)">60 seconds</div>
1339          <div style="margin-top:5px;font-size:13px;line-height:1.45;color:var(--dim)">That&#39;s how long the track analysis takes</div>
1340        </div>
1341      </div>
1342    </div>
1343  </section>
1344
1345  <section style="padding:24px max(32px, calc((100% - 1480px) / 2)) 64px" data-screen-label="FAQ">
1346    <div style="display:inline-flex;align-items:center;gap:8px;border-left:2px solid var(--acc);padding-left:10px;font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.2em;color:var(--dim);text-transform:uppercase">Questions</div>
1347    <h2 style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(34px,3.4vw,52px);line-height:0.97;letter-spacing:-0.035em;margin:16px 0 0 0;text-wrap:balance;background:linear-gradient(180deg,#FFFFFF 0%,#F4F1EA 46%,#A49BA1 100%);-webkit-background-clip:text;background-clip:text;color:transparent;;text-align:left">Your biggest questions before your first <span style="font-family:&#39;Instrument Serif&#39;,serif;font-style:italic;color:var(--acc)">music video</span>
1348</h2>
1349    <div style="margin-top:44px;display:grid;grid-template-columns:1fr;max-width:1480px">
1350
1351      <div style="position:relative;overflow:hidden;border:1px solid rgba(255,61,46,0.42);border-radius:14px;padding:32px 34px;margin-bottom:32px;background:radial-gradient(90% 150% at 12% 0%,rgba(255,61,46,0.16),transparent 62%),linear-gradient(168deg,#1A100E 0%,#0D0D10 74%);box-shadow:0 0 52px rgba(255,61,46,0.12)">
1352        <span style="position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,61,46,0.9),transparent)"></span>
1353        <span style="display:inline-flex;align-items:center;gap:8px;font-family:'Space Mono',monospace;font-size:9px;letter-spacing:0.2em;color:var(--acc);text-transform:uppercase"><span class="pulse" style="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--acc)"></span>Asked most often</span>
1354        <h3 style="margin:16px 0 0 0;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:clamp(24px,2.4vw,34px);line-height:1.05;letter-spacing:-0.04em;color:var(--ink);text-wrap:balance">Will it look AI-made?</h3>
1355        <p style="margin:14px 0 0 0;font-size:17px;line-height:1.55;letter-spacing:-0.011em;color:var(--dim);max-width:52ch">ClipChat first builds a consistent visual concept and scene plan, so the music video feels coherent rather than like a collection of random shots. Before generation, you can review the direction and adjust the scenes.</p>
1356      </div>
1357
1358      <div style="border-top:1px solid var(--line);display:grid;grid-template-columns:repeat(3,1fr);column-gap:44px;align-items:start">
1359      <div style="border-bottom:1px solid var(--line)">
1360        <button data-val="1" onClick="{{ faqTap }}" style="width:100%;text-align:left;background:transparent;border:none;color:var(--ink);font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:21px;letter-spacing:-0.03em;padding:26px 44px 26px 0;cursor:pointer;position:relative">Who owns the uploaded track and the finished video?<span style="{{ f1symSt }}">+</span></button>
1361        <p style="{{ a1st }}">You retain the rights to the track you upload. You can use the finished video in accordance with the terms of service, including commercially, provided you have the necessary rights to the source materials. ClipChat does not use uploaded tracks to train models.</p>
1362      </div>
1363      <div style="border-bottom:1px solid var(--line)">
1364        <button data-val="2" onClick="{{ faqTap }}" style="width:100%;text-align:left;background:transparent;border:none;color:var(--ink);font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:21px;letter-spacing:-0.03em;padding:26px 44px 26px 0;cursor:pointer;position:relative">How long does it take to create a music video?<span style="{{ f2symSt }}">+</span></button>
1365        <p style="{{ a2st }}">Track analysis takes about a minute. The total creation time depends on the length of the music video and the number of scenes: usually no more than 30 minutes.</p>
1366      </div>
1367      <div style="border-bottom:1px solid var(--line)">
1368        <button data-val="4" onClick="{{ faqTap }}" style="width:100%;text-align:left;background:transparent;border:none;color:var(--ink);font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:21px;letter-spacing:-0.03em;padding:26px 44px 26px 0;cursor:pointer;position:relative">Will I be charged automatically?<span style="{{ f4symSt }}">+</span></button>
1369        <p style="{{ a4st }}">Yes. Your plan renews automatically every month; you can cancel any time before the next charge.</p>
1370      </div>
1371      <div style="border-bottom:1px solid var(--line)">
1372        <button data-val="5" onClick="{{ faqTap }}" style="width:100%;text-align:left;background:transparent;border:none;color:var(--ink);font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:21px;letter-spacing:-0.03em;padding:26px 44px 26px 0;cursor:pointer;position:relative">Can I legally upload my track?<span style="{{ f5symSt }}">+</span></button>
1373        <p style="{{ a5st }}">If you wrote it or hold the rights — yes, no limits. For a cover or a licensed track, clearing the rights stays on you.</p>
1374      </div>
1375      <div style="border-bottom:1px solid var(--line)">
1376        <button data-val="6" onClick="{{ faqTap }}" style="width:100%;text-align:left;background:transparent;border:none;color:var(--ink);font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:21px;letter-spacing:-0.03em;padding:26px 44px 26px 0;cursor:pointer;position:relative">If something breaks, is there anyone to ask?<span style="{{ f6symSt }}">+</span></button>
1377        <p style="{{ a6st }}">Yes. Contact support in chat or by email. After payment, you also get access to the private ClipChat community for help with the service and your first music video. <a href="https://t.me/doitong_support_bot" target="_blank" rel="noopener" style="color:var(--acc)">Support chat</a> · <a href="mailto:[email protected]?subject=%5BClipChat.ai%5D%20" style="color:var(--acc)">[email protected]</a></p>
1378      </div>
1379      <div style="border-bottom:1px solid var(--line)">
1380        <button data-val="3" onClick="{{ faqTap }}" style="width:100%;text-align:left;background:transparent;border:none;color:var(--ink);font-family:'Bricolage Grotesque',sans-serif;font-weight:700;font-size:21px;letter-spacing:-0.03em;padding:26px 44px 26px 0;cursor:pointer;position:relative">What if I don&#39;t like a scene?<span style="{{ f3symSt }}">+</span></button>
1381        <p style="{{ a3st }}">You can regenerate only the selected scene without rebuilding the entire music video. The other scenes stay unchanged.</p>
1382      </div>
1383      </div>
1384
1385      <div style="margin-top:36px;display:flex;align-items:center;justify-content:space-between;gap:28px;flex-wrap:wrap;border:1px solid var(--line);border-radius:14px;padding:26px 30px;background:linear-gradient(168deg,#141418 0%,#0B0B0E 74%)">
1386        <div style="min-width:0">
1387          <div style="font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:21px;letter-spacing:-0.03em;color:var(--ink)">Didn&#39;t find your question?</div>
1388          <p style="margin:8px 0 0 0;font-size:15px;line-height:1.5;color:var(--dim);max-width:44ch">Contact support - we&#39;ll help with creating a video, plans and using the service.</p>
1389        </div>
1390        <a href="https://t.me/doitong_support_bot" target="_blank" rel="noopener noreferrer" style="flex-shrink:0;background:linear-gradient(180deg,#FF6A4D 0%,#FF3D2E 52%,#E22A1D 100%);color:#16090A;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;letter-spacing:-0.01em;padding:16px 28px;border-radius:10px;text-decoration:none;box-shadow:0 0 28px rgba(255,61,46,0.35)">Contact support</a>
1391      </div>
1392    </div>
1393  </section>
1394
1395  <footer id="contacts" style="border-top:1px solid var(--line);padding:48px max(32px, calc((100% - 1480px) / 2)) 64px" data-screen-label="Footer">
1396    <div style="display:flex;flex-direction:column;gap:16px">
1397      <span style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dark);text-transform:uppercase">© 2026 CLIPCHAT INC. — AN AI FILM STUDIO FOR MUSIC</span>
1398      <div style="display:flex;gap:16px;flex-wrap:wrap">
1399        <a href="#examples" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Examples</a>
1400        <a href="#pricing" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Pricing</a>
1401        <a href="/en-GB/policy" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Privacy</a>
1402        <a href="mailto:[email protected]?subject=%5BClipChat.ai%5D%20" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Contact</a>
1403        <a href="#contacts" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Support</a>
1404      </div>
1405      <div style="display:flex;gap:16px;flex-wrap:wrap">
1406        <a href="https://t.me/doitong_support_bot" target="_blank" rel="noopener" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.08em;color:var(--acc);text-decoration:none">Support chat</a>
1407        <a href="mailto:[email protected]?subject=%5BClipChat.ai%5D%20" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.08em;color:var(--acc);text-decoration:none">[email protected]</a>
1408      </div>
1409      <div style="display:flex;gap:16px;flex-wrap:wrap;padding-top:4px">
1410          <a href="/ai-music-video-generator" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">AI music video generator</a>
1411          <a href="/suno-to-music-video" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Suno to video</a>
1412          <a href="/udio-to-music-video" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Udio to video</a>
1413          <a href="/mp3-to-music-video" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">MP3 to video</a>
1414          <a href="/lyric-video-generator" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">Lyric video</a>
1415          <a href="/free-ai-music-video-generator" style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dim);text-decoration:none;text-transform:uppercase">AI storyboard</a>
1416      </div>
1417      <span style="font-family:'Space Mono',monospace;font-size:9.5px;letter-spacing:0.12em;color:var(--dark);text-transform:uppercase">POWERED BY DOITONG</span>
1418    </div>
1419  </footer>
1420
1421  <div style="display:none">
1422    <button data-magnet="1" onClick="{{ startDemo }}" style="width:100%;background:linear-gradient(180deg,#FF6A4D 0%,#FF3D2E 52%,#E22A1D 100%);color:#16090A;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:15px;box-shadow:0 0 26px rgba(255,61,46,0.4);padding:16px 16px;border-radius:10px;border:none;position:relative;overflow:hidden;box-shadow:0 0 28px rgba(255,61,46,0.35)" style-before="content:'';position:absolute;top:0;left:0;width:42%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.42),transparent);animation:shine 4.6s ease-in-out infinite">Create a music video</button>
1423  </div>
1424</div>
1425
1426</x-dc>
1427
1428
1429
1430
1431
1432<style>
1433  [data-v5-langs] { display: none; }
1434  html[data-v5-langs-open] [data-v5-langs] { display: block; }
1435  [data-v5-globe]:hover { color: var(--ink) !important; }
1436  [data-v5-langs] a:hover { background: rgba(255,255,255,0.07); }
1437</style>
1438<script>
1439(function () {
1440  var OPEN = 'data-v5-langs-open';
1441  document.addEventListener('click', function (e) {
1442    var t = e.target;
1443    var globe = t && t.closest ? t.closest('[data-v5-globe]') : null;
1444    if (globe) {
1445      e.preventDefault();
1446      var open = document.documentElement.hasAttribute(OPEN);
1447      if (open) { document.documentElement.removeAttribute(OPEN); }
1448      else { document.documentElement.setAttribute(OPEN, '1'); }
1449      globe.setAttribute('aria-expanded', String(!open));
1450      return;
1451    }
1452    var link = t && t.closest ? t.closest('a[hreflang]') : null;
1453    if (link) {
1454      // Кука — та же, что читает determine_language: путь задаёт язык этой
1455      // страницы, кука закрепляет выбор на следующие заходы.
1456      try {
1457        document.cookie = 'language=' + link.getAttribute('hreflang') +
1458                          '; path=/; max-age=31536000; SameSite=Lax';
1459      } catch (err) {}
1460      return;
1461    }
1462    document.documentElement.removeAttribute(OPEN);
1463  }, true);
1464  document.addEventListener('keydown', function (e) {
1465    if (e.key === 'Escape') { document.documentElement.removeAttribute(OPEN); }
1466  });
1467})();
1468</script>
1468
1469
1470<script>window.V5MEDIA = {
1471  hero:  "https://content.doitong.com/video/clipchat_landing_v2/w2_hd.mp4",
1472  final: "https://content.doitong.com/video/clipchat_landing_v2/w1_hd.mp4"
1473};</script>
1473
1474<style>
1475  /* Публичная витрина показывает только примеры ClipChat. Оставшиеся от
1476     дизайн-прототипа file controls не должны быть доступны посетителям. */
1477  label:has(input[type="file"]) { display: none !important; }
1478</style>
1479<script>window.V5SRC = function (url) { return url || ''; };</script>
vendor: 1 bytes, line 1479
1479
1480<script>
1481(function () {
1482  if (window.__clipchatLessonSwitcher) { return; }
1483  window.__clipchatLessonSwitcher = true;
1484
1485  function rememberFullLesson(root) {
1486    var full = root && root.querySelector('[data-lesson-panel="full"]');
1487    if (full && !full._lessonOriginalMarkup) {
1488      full._lessonOriginalMarkup = full.innerHTML;
1489    }
1490    return full;
1491  }
1492
1493  function paintTab(tab, active) {
1494    tab.setAttribute('aria-selected', active ? 'true' : 'false');
1495    tab.tabIndex = active ? 0 : -1;
1496    tab.style.background = active ? '#C41A0A' : 'transparent';
1497    tab.style.color = active ? '#FFFFFF' : '#5B554F';
1498    tab.style.borderColor = active ? '#C41A0A' : 'transparent';
1499  }
1500
1501  function resetFullLesson(full) {
1502    if (!full) { return; }
1503    var frame = full.querySelector('iframe');
1504    if (frame && full._lessonOriginalMarkup) {
1505      full.innerHTML = full._lessonOriginalMarkup;
1506    }
1507    delete full.dataset.ytLoaded;
1508    delete full.dataset.ytOpen;
1509  }
1510
1511  function selectLesson(root, mode) {
1512    if (!root || (mode !== 'quick' && mode !== 'full')) { return; }
1513    var full = rememberFullLesson(root);
1514    root.querySelectorAll('[data-lesson-tab]').forEach(function (tab) {
1515      paintTab(tab, tab.dataset.lessonTab === mode);
1516    });
1517    root.querySelectorAll('[data-lesson-panel]').forEach(function (panel) {
1518      var active = panel.dataset.lessonPanel === mode;
1519      panel.hidden = !active;
1520      panel.style.display = active ? 'block' : 'none';
1521      panel.setAttribute('aria-hidden', active ? 'false' : 'true');
1522      if (!active) { panel.querySelectorAll('video').forEach(function (video) { video.pause(); }); }
1523    });
1524
1525    var quickVideo = root.querySelector('[data-lesson-panel="quick"] video');
1526    if (mode === 'full' && quickVideo) { quickVideo.pause(); }
1527    if (mode === 'quick') { resetFullLesson(full); }
1528  }
1529
1530  document.querySelectorAll('[data-lesson-switcher]').forEach(function (root) {
1531    rememberFullLesson(root);
1532    if (root.querySelector('[data-lesson-tab="quick"]')) { selectLesson(root, 'quick'); }
1533  });
1534
1535  document.addEventListener('click', function (event) {
1536    var tab = event.target && event.target.closest ? event.target.closest('[data-lesson-tab]') : null;
1537    if (!tab) { return; }
1538    selectLesson(tab.closest('[data-lesson-switcher]'), tab.dataset.lessonTab);
1539  }, true);
1540
1541  document.addEventListener('keydown', function (event) {
1542    var tab = event.target && event.target.closest ? event.target.closest('[data-lesson-tab]') : null;
1543    if (!tab || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) { return; }
1544    event.preventDefault();
1545    var root = tab.closest('[data-lesson-switcher]');
1546    var nextMode = tab.dataset.lessonTab === 'quick' ? 'full' : 'quick';
1547    selectLesson(root, nextMode);
1548    var next = root.querySelector('[data-lesson-tab="' + nextMode + '"]');
1549    if (next) { next.focus(); }
1550  }, true);
1551})();
1552</script>
1552
1553
1554<script>
1555(function () {
1556  var pending = null;
1557  var assignment = null;
1558  var pricingVisited = window.location.hash === '#pricing';
1559  var choiceSelector = '[data-clipchat-funnel-choice="1"]';
1560
1561  function syncChoiceVisibility() {
1562    if (!assignment || assignment.experiment_id !== 'clipchat_funnel_v2') { return; }
1563    var visible = assignment.variant === 'pricing_choice';
1564    document.querySelectorAll(choiceSelector).forEach(function (element) {
1565      var display = visible ? 'grid' : 'none';
1566      var ariaHidden = visible ? 'false' : 'true';
1567      if (element.style.display !== display) { element.style.display = display; }
1568      if (element.getAttribute('aria-hidden') !== ariaHidden) {
1569        element.setAttribute('aria-hidden', ariaHidden);
1570      }
1571    });
1572  }
1573
1574  // The landing renderer can replace or rehydrate template nodes after the
1575  // experiment response arrives. Keep the test-only choice in sync when that
1576  // happens; otherwise a pricing_choice visitor can lose the block again.
1577  if (typeof MutationObserver === 'function' && document.documentElement) {
1578    new MutationObserver(function (mutations) {
1579      var changed = mutations.some(function (mutation) {
1580        if (mutation.type === 'attributes') {
1581          return mutation.target.matches && mutation.target.matches(choiceSelector);
1582        }
1583        return Array.prototype.some.call(mutation.addedNodes || [], function (node) {
1584          return node.nodeType === 1 && (
1585            (node.matches && node.matches(choiceSelector)) ||
1586            (node.querySelector && node.querySelector(choiceSelector))
1587          );
1588        });
1589      });
1590      if (changed) { syncChoiceVisibility(); }
1591    }).observe(document.documentElement, {
1592      childList: true,
1593      subtree: true,
1594      attributes: true,
1595      attributeFilter: ['style', 'aria-hidden']
1596    });
1597  }
1598
1599  function showPricing() {
1600    pricingVisited = true;
1601    var section = document.querySelector('#pricing');
1602    if (!section) {
1603      window.location.hash = '#pricing';
1604      return;
1605    }
1606
1607    var reduceMotion = window.matchMedia &&
1608      window.matchMedia('(prefers-reduced-motion: reduce)').matches;
1609    var nav = document.querySelector('[data-screen-label="Nav"]');
1610    var navBox = nav && nav.getBoundingClientRect();
1611    // The desktop nav can be translated out while scrolling down, then return
1612    // as this upward scroll starts. Reserve its height, not its hidden bottom.
1613    var offset = navBox ? Math.max(0, navBox.height, navBox.bottom) + 16 : 16;
1614    window.scrollTo({ top: Math.max(0, section.getBoundingClientRect().top + window.scrollY - offset), behavior: reduceMotion ? 'auto' : 'smooth' });
1615    if (window.history && window.history.replaceState) {
1616      window.history.replaceState(null, '', '#pricing');
1617    }
1618  }
1619
1620  // Also used by the secondary preview: it must show pricing (not infer a paid
1621  // route) while retaining the same fixed-navigation offset and motion policy.
1622  window.ClipChatShowPricing = showPricing;
1623
1624  function applyAssignment(result) {
1625    if (!result || result.experiment_id !== 'clipchat_funnel_v2') { return result; }
1626    assignment = result;
1627    try { window.localStorage.setItem('clipchat_funnel_variant_v2', result.variant); } catch (error) {}
1628    syncChoiceVisibility();
1629    try {
1630      var eventKey = 'clipchat_funnel_assigned:' + result.variant;
1631      if (!window.sessionStorage.getItem(eventKey) && typeof window.gtag === 'function') {
1632        window.sessionStorage.setItem(eventKey, '1');
1633        window.gtag('event', 'clipchat_funnel_assigned', {
1634          experiment: result.experiment_id,
1635          variant: result.variant
1636        });
1637      }
1638    } catch (error) {}
1639    return result;
1640  }
1641
1642  function assignmentHeaders() {
1643    var headers = { 'Content-Type': 'application/json' };
1644    try {
1645      var token = localStorage.getItem('authToken') || localStorage.getItem('token');
1646      if (token) { headers.Authorization = 'Bearer ' + token; }
1647      var selected = localStorage.getItem('selectedAccountId');
1648      if (selected) { headers['X-Selected-Account-Id'] = selected; }
1649    } catch (error) {}
1650    return headers;
1651  }
1652
1653  function loadAssignment() {
1654    if (assignment) { return Promise.resolve(assignment); }
1655    if (pending) { return pending; }
1656    var controller = typeof AbortController === 'function' ? new AbortController() : null;
1657    var timeout = controller ? setTimeout(function () { controller.abort(); }, 2500) : null;
1658    pending = fetch('/api/clipchat/funnel-experiment', {
1659      method: 'GET', credentials: 'same-origin', headers: assignmentHeaders(),
1660      signal: controller ? controller.signal : undefined
1661    }).then(function (response) {
1662      if (!response.ok) { throw new Error('Experiment unavailable'); }
1663      return response.json();
1664    }).then(applyAssignment).finally(function () {
1665      if (timeout) { clearTimeout(timeout); }
1666      pending = null;
1667    });
1668    return pending;
1669  }
1670
1671  document.addEventListener('click', function (event) {
1672    var action = event.target && event.target.closest && event.target.closest('[data-clipchat-funnel-action]');
1673    if (!action || !assignment || typeof window.gtag !== 'function') { return; }
1674    window.gtag('event', 'clipchat_funnel_choice', {
1675      experiment: assignment.experiment_id,
1676      variant: assignment.variant,
1677      choice: action.getAttribute('data-clipchat-funnel-action')
1678    });
1679  });
1680
1681  window.ClipChatPrimaryCta = function () {
1682    var buttons = document.querySelectorAll('[data-magnet]');
1683    buttons.forEach(function (button) { button.setAttribute('aria-busy', 'true'); });
1684
1685    var route = loadAssignment().then(function (result) {
1686      // pricing_choice intentionally sends the first CTA to the tariff block.
1687      // Once the visitor has seen that block, the next CTA continues to the
1688      // promised track upload instead of looping back to the same prices.
1689      if (result && result.variant === 'pricing_choice' && pricingVisited) {
1690        window.location.assign('/create/clipboard');
1691      } else if (result && result.primary_path === '/create/clipboard') {
1692        window.location.assign('/create/clipboard');
1693      } else { showPricing(); }
1694    }).catch(showPricing).finally(function () {
1695      buttons.forEach(function (button) { button.removeAttribute('aria-busy'); });
1696    });
1697    return route;
1698  };
1699
1700  if (document.readyState === 'loading') {
1701    document.addEventListener('DOMContentLoaded', function () { loadAssignment().catch(function () {}); });
1702  } else { loadAssignment().catch(function () {}); }
1703})();
1704</script>
1704
1705
1706<script>
1707(function () {
1708  document.addEventListener('click', function (ev) {
1709    var box = ev.target && ev.target.closest ? ev.target.closest('[data-yt]') : null;
1710    if (!box || box.dataset.ytOpen) { return; }
1711    box.dataset.ytOpen = '1';
1712    var f = document.createElement('iframe');
1713    f.src = 'https://www.youtube-nocookie.com/embed/' + box.dataset.yt +
1714            '?autoplay=1&rel=0&modestbranding=1';
1715    f.allow = 'accelerometer; autoplay; encrypted-media; picture-in-picture';
1716    f.allowFullscreen = true;
1717    f.setAttribute('title', box.getAttribute('data-yt-title') || 'ClipChat');
1718    f.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;border:0;z-index:9';
1719    box.appendChild(f);
1720  }, true);
1721})();
1722</script>
1722
1723
1724<script>
1725(function () {
1726  // Вошедшему — «Открыть студию» вместо «Войти», и перехват снимаем: иначе
1727  // shared/_inline_auth_scripts снова попросит его залогиниться.
1728  var STUDIO = "Open studio";
1729
1730  function token() {
1731    try {
1732      var t = localStorage.getItem('authToken') || localStorage.getItem('token');
1733      if (!t) { return null; }
1734      var p = JSON.parse(atob(t.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')));
1735      if (p && p.exp && p.exp * 1000 <= Date.now()) { return null; }
1736      return t;
1737    } catch (e) { return null; }
1738  }
1739
1740  function mark() {
1741    if (!token()) { return; }
1742    document.querySelectorAll('[data-v5-signin]').forEach(function (a) {
1743      if (a.dataset.v5Signed) { return; }
1744      a.dataset.v5Signed = '1';
1745      a.removeAttribute('data-open-auth');
1746      a.setAttribute('href', '/create/clipboard');
1747      a.textContent = STUDIO;
1748    });
1749  }
1750
1751  mark();
1752  new MutationObserver(mark).observe(document.documentElement, { childList: true, subtree: true });
1753})();
1754</script>
1754
1755
1756<script>window.T5 = {"d007":"Upload your track","d200":"INTRO","d201":"VERSE 1","d202":"CHORUS","d203":"VERSE 2","d204":"BRIDGE","d205":"OUTRO","d206":"DROP","d207":"VERSE","d208":"Reading your track…","d209":"Scene plan ready ↓","d210":"SCENE 07 · TAKE 1","d211":"SCENE 07 · TAKE 2","d212":"↺ Back to take 1","d213":"↺ Replay","d214":"↻ Re-roll scene 7 · ~$1.40","d215":"▶ Director's reply","d216":"▶ Play the conversation","m169":"INTRO","m170":"VERSE 1","m171":"CHORUS","m172":"VERSE 2","m173":"BRIDGE","m180":"scenes","m181":"· lip-sync","m184":"Reading your track…","m185":"Scene plan ready","m186":"Couldn't read it","m187":"Create a music video","m188":"don't close the page","m189":"see the storyboard ↓","m190":"tap to try again","m191":"the AI listens and shoots","p1Cr":"142,000","p1Videos":"≈15 × 20s","p2Cr":"260,000","p2Videos":"≈30 × 20s","p3Cr":"600,000","p3Videos":"≈72 × 20s","x068":"● Director","x069":"Listened through. 140 BPM, phonk in A minor, Russian vocals about leaving at dawn. I'd shoot two worlds: a night gas station and a dawn ritual in the desert. Lip sync on the choruses.","x070":"You","x071":"Darker","x072":"Dropping the dawn. Everything stays in the night: cold neon at the station, smoke, headlights in frame. Harder contrast, tighter on your face.","x073":"More performance","x074":"Adding a performance block: you at the speaker stack, the camera orbits, lip-sync now on verse two as well. That takes it to 28 scenes.","x075":"~24 scenes · lip-sync: choruses · worlds: 1 (night) · no dawn","x076":"~28 scenes · lip-sync: choruses + verse 2 · worlds: 2 · performance block","x077":"~24 scenes · lip-sync: choruses · worlds: 2 · no piano","x078":"Come back — your clip is waiting","introOfferExpiresAt":"2026-10-05T14:55:29Z","p1BaseLabel":"START $27","p1Label":"START $13.50","p2BaseLabel":"PRO $49","p2Label":"PRO $24.50","p3BaseLabel":"MAX $120","p3Label":"MAX $60"};</script>
1756
1757
1758<script type="text/x-dc" data-dc-script data-props="{&quot;nick1&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;sveta.v.reels&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Ники в отзывах&quot;},&quot;nick2&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;maya.songs&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Ники в отзывах&quot;},&quot;nick3&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;boonmadeit&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Ники в отзывах&quot;},&quot;nick4&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;irina.pavlowa&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Ники в отзывах&quot;},&quot;clip1Url&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;https://s3.regru.cloud/doitong/video/clipchat_landing_assets/unethical-2.mp4&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Видео в карусели&quot;},&quot;clip2Url&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;https://content.doitong.com/video/clipchat_landing/clip1.mp4&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Видео в карусели&quot;},&quot;clip3Url&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;https://content.doitong.com/video/clipchat_landing/clip2.mp4&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Видео в карусели&quot;},&quot;clip4Url&quot;:{&quot;editor&quot;:&quot;text&quot;,&quot;default&quot;:&quot;https://content.doitong.com/video/clipchat_demos/rita_up.mp4&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Видео в карусели&quot;}}">
1759class Component extends DCLogic {
1760  _db() {
1761    if (this._dbp) { return this._dbp; }
1762    this._dbp = new Promise((res, rej) => {
1763      const r = indexedDB.open('clipchat-carousel', 1);
1764      r.onupgradeneeded = () => { r.result.createObjectStore('clips'); };
1765      r.onsuccess = () => res(r.result);
1766      r.onerror = () => rej(r.error);
1767    });
1768    return this._dbp;
1769  }
1770
1771  async _saveClip(i, blob) {
1772    const db = await this._db();
1773    await new Promise((res, rej) => {
1774      const tx = db.transaction('clips', 'readwrite');
1775      tx.objectStore('clips').put(blob, 'clip' + i);
1776      tx.oncomplete = res;
1777      tx.onerror = () => rej(tx.error);
1778    });
1779  }
1780
1781  async _dropClip(i) {
1782    try {
1783      const db = await this._db();
1784      db.transaction('clips', 'readwrite').objectStore('clips').delete('clip' + i);
1785    } catch (err) { /* ignore */ }
1786  }
1787
1788  async _loadClips() {
1789    const db = await this._db();
1790    const out = {};
1791    await Promise.all([0, 1, 2, 3, 7, 8, 9].map(i => new Promise((res) => {
1792      const rq = db.transaction('clips', 'readonly').objectStore('clips').get('clip' + i);
1793      rq.onsuccess = () => {
1794        const b = rq.result;
1795        if (b && b.size > 0 && (b.type || '').indexOf('video') === 0) { out['u' + i] = URL.createObjectURL(b); }
1796        res();
1797      };
1798      rq.onerror = () => res();
1799    })));
1800    if (Object.keys(out).length) { this.setState(out); }
1801  }
1802
1803  async _savePhoto(key, blob) {
1804    const db = await this._db();
1805    await new Promise((res, rej) => {
1806      const tx = db.transaction('clips', 'readwrite');
1807      tx.objectStore('clips').put(blob, 'photo-' + key);
1808      tx.oncomplete = res;
1809      tx.onerror = () => rej(tx.error);
1810    });
1811  }
1812
1813  async _loadPhotos() {
1814    const db = await this._db();
1815    const root = this._root || document;
1816    const imgs = Array.from(root.querySelectorAll('img[data-photo]'));
1817    this._photoMap = this._photoMap || {};
1818    await Promise.all(imgs.map(img => new Promise((res) => {
1819      const key = img.getAttribute('data-photo');
1820      const rq = db.transaction('clips', 'readonly').objectStore('clips').get('photo-' + key);
1821      rq.onsuccess = () => {
1822        const b = rq.result;
1823        if (b && b.size > 0) { this._photoMap[key] = URL.createObjectURL(b); }
1824        res();
1825      };
1826      rq.onerror = () => res();
1827    })));
1828    this._applyPhotos();
1829  }
1830
1831  _applyPhotos() {
1832    const map = this._photoMap || {};
1833    const root = this._root || document;
1834    Array.from(root.querySelectorAll('img[data-photo]')).forEach(img => {
1835      const url = map[img.getAttribute('data-photo')];
1836      if (url && img.getAttribute('src') !== url) { img.setAttribute('src', url); }
1837    });
1838  }
1839
1840  _apply(el, props) {
1841    if (!this._applied) { this._applied = []; }
1842    let rec = this._applied.find(r => r.el === el);
1843    if (!rec) { rec = { el: el, props: {} }; this._applied.push(rec); }
1844    Object.assign(rec.props, props);
1845    Object.keys(props).forEach(k => { el.style[k] = props[k]; });
1846  }
1847
1848  _syncBg() {
1849    window.ClipchatMedia.scan();
1850  }
1851
1852  _syncVideos() {
1853    this._syncBg();
1854    const s = this.state || {};
1855    const p = this.props || {};
1856    const srcs = [p.clip1Url, p.clip2Url, p.clip3Url, p.clip4Url].map(window.V5SRC);
1857    const root = this._root || document;
1858    const seen = {};
1859    Array.from(root.querySelectorAll('#examples video')).forEach(el => {
1860      const i = parseInt(el.getAttribute('data-val'), 10);
1861      const primary = !seen[i];
1862      seen[i] = true;
1863      if (!primary) { el.muted = true; el.volume = 0; el.setAttribute('preload', 'none'); }
1864      const want = el.getAttribute('data-src') || srcs[i] || '';
1865      const active = !!s.sound && (s.slide || 0) === i && primary;
1866      const play = el.parentElement && el.parentElement.querySelector('[data-showcase-play]');
1867      if (play) {
1868        play.style.opacity = active ? '0' : '1';
1869        play.style.pointerEvents = 'auto';
1870        play.setAttribute('aria-hidden', 'false');
1871        play.setAttribute('aria-pressed', active ? 'true' : 'false');
1872        play.setAttribute('aria-label', play.getAttribute(active ? 'data-pause-label' : 'data-play-label'));
1873      }
1874      el.setAttribute('loop', 'loop');
1875      window.ClipchatMedia.watch(el, {
1876        // Carousel clips stay on their posters until the visitor presses play.
1877        src: want, play: active, audible: active
1878      });
1879    });
1880  }
1881
1882  componentDidUpdate() {
1883    this._syncVideos();
1884    if (!this._applied) { return; }
1885    this._applied.forEach(r => {
1886      Object.keys(r.props).forEach(k => {
1887        if (r.el.style[k] !== r.props[k]) { r.el.style[k] = r.props[k]; }
1888      });
1889    });
1890  }
1891
1892  componentDidMount() {
1893    this._onOfferExpired = () => this.setState({ introOfferExpired: true });
1894    window.addEventListener('clipchat:intro-offer-expired', this._onOfferExpired);
1895    // Рантайм удаляет file-controls прототипа целиком; CSS выше страхует
1896    // первый кадр до инициализации компонента. Загрузка трека (#ccFile) вне label.
1897    Array.from(document.querySelectorAll('label input[type="file"]')).forEach(input => {
1898      const label = input.closest('label');
1899      if (label) { label.remove(); }
1900    });
1901    // Старые версии сохраняли пользовательские подмены в браузере.
1902    // Больше их не читаем и удаляем локальные blobs при следующем открытии.
1903    if (window.indexedDB) {
1904      try { window.indexedDB.deleteDatabase('clipchat-carousel'); } catch (err) { /* ignore */ }
1905    }
1906    this._syncVideos();
1907    const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
1908    this._root = document.querySelector('.sc-host') || document.body;
1909    // Restore incoming tariff anchors after the runtime mounts the landing.
1910    if (window.location.hash === '#pricing' && typeof window.ClipChatShowPricing === 'function') {
1911      requestAnimationFrame(() => window.ClipChatShowPricing());
1912    }
1913    this._carouselCleanups = Array.from(this._root.querySelectorAll('[data-carousel-scroll]')).map((rail) => {
1914      const cards = Array.from(rail.querySelectorAll('[data-carousel-card]'));
1915      const duration = cards.length * 5.04;
1916      let phase = 0;
1917      let drag = null;
1918      const setPhase = (nextPhase) => {
1919        phase = nextPhase;
1920        cards.forEach((card) => {
1921          const baseDelay = Number(card.getAttribute('data-carousel-base-delay'));
1922          // Keep delays non-positive so repeated dragging in either direction
1923          // wraps immediately, including when reduced motion pauses the loop.
1924          const delay = ((baseDelay + phase) % duration + duration) % duration - duration;
1925          card.style.animationDelay = delay.toFixed(3) + 's';
1926        });
1927      };
1928      const startDrag = (event) => {
1929        if (event.button && event.button !== 0) { return; }
1930        if (event.target.closest('button, a, input, label')) { return; }
1931        event.preventDefault();
1932        drag = { x: event.clientX, phase };
1933        rail.setAttribute('data-dragging', '1');
1934        if (rail.setPointerCapture) { rail.setPointerCapture(event.pointerId); }
1935      };
1936      const moveDrag = (event) => {
1937        if (!drag) { return; }
1938        const delta = event.clientX - drag.x;
1939        if (Math.abs(delta) > 2) { event.preventDefault(); }
1940        setPhase(drag.phase + (delta / 50));
1941      };
1942      const endDrag = (event) => {
1943        if (!drag) { return; }
1944        drag = null;
1945        rail.removeAttribute('data-dragging');
1946        if (rail.releasePointerCapture && rail.hasPointerCapture && rail.hasPointerCapture(event.pointerId)) { rail.releasePointerCapture(event.pointerId); }
1947      };
1948      const onWheel = (event) => {
1949        const horizontal = event.deltaX || (event.shiftKey ? event.deltaY : 0);
1950        if (!horizontal || Math.abs(horizontal) <= Math.abs(event.deltaY) && !event.shiftKey) { return; }
1951        event.preventDefault();
1952        const unit = event.deltaMode === 1 ? 16 : (event.deltaMode === 2 ? rail.clientWidth : 1);
1953        setPhase(phase - ((horizontal * unit) / 50));
1954      };
1955      const onKeyDown = (event) => {
1956        if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') { return; }
1957        event.preventDefault();
1958        setPhase(phase + (event.key === 'ArrowLeft' ? 5.04 : -5.04));
1959      };
1960      const onFocusIn = (event) => {
1961        const card = event.target.closest('[data-carousel-card]');
1962        if (!card) { return; }
1963        // Tabbing to an off-screen play button must bring its clip into view.
1964        rail.scrollLeft = 0;
1965        const bounds = rail.getBoundingClientRect();
1966        const rect = card.getBoundingClientRect();
1967        if (rect.left < bounds.left + 24 || rect.right > bounds.right - 24) {
1968          setPhase(phase + ((bounds.left + 24 - rect.left) / 50));
1969        }
1970      };
1971      rail.addEventListener('pointerdown', startDrag);
1972      rail.addEventListener('pointermove', moveDrag);
1973      rail.addEventListener('pointerup', endDrag);
1974      rail.addEventListener('pointercancel', endDrag);
1975      rail.addEventListener('wheel', onWheel, { passive: false });
1976      rail.addEventListener('keydown', onKeyDown);
1977      rail.addEventListener('focusin', onFocusIn);
1978      return () => {
1979        rail.removeEventListener('pointerdown', startDrag);
1980        rail.removeEventListener('pointermove', moveDrag);
1981        rail.removeEventListener('pointerup', endDrag);
1982        rail.removeEventListener('pointercancel', endDrag);
1983        rail.removeEventListener('wheel', onWheel);
1984        rail.removeEventListener('keydown', onKeyDown);
1985        rail.removeEventListener('focusin', onFocusIn);
1986      };
1987    });
1988
1989    // 1. reveal on scroll (staggered)
1990    if (!reduce) {
1991      const targets = Array.from(this._root.querySelectorAll('section > h2, section > p, section > div > div, section > div, header > div'))
1992        .filter(el => !el.hasAttribute('data-clipchat-tariffs') && !el.closest('[data-screen-label="Hero examples carousel"]') && !el.hasAttribute('data-readbar') && !el.hasAttribute('data-stepsbar') && !el.hasAttribute('data-monbar'));
1993      const seen = new Set();
1994      targets.forEach(el => {
1995        if (seen.has(el) || el.parentElement && seen.has(el.parentElement)) { return; }
1996        seen.add(el);
1997        if (el.style.animation) { return; }
1998        el.style.animation = 'riseIn .6s cubic-bezier(.2,.7,.3,1) both';
1999        el.style.animationPlayState = 'paused';
2000        el.setAttribute('data-idreveal', '1');
2001      });
2002      this._io = new IntersectionObserver((entries) => {
2003        let n = 0;
2004        entries.forEach(e => {
2005          if (!e.isIntersecting) { return; }
2006          const el = e.target;
2007          this._apply(el, { animationDelay: (n * 60) + 'ms', animationPlayState: 'running' });
2008          n++;
2009          this._io.unobserve(el);
2010        });
2011      }, { threshold: 0.12, rootMargin: '0px 0px -8% 0px' });
2012      seen.forEach(el => this._io.observe(el));
2013    }
2014
2015    // 2. counters
2016    const nums = Array.from(this._root.querySelectorAll('[data-count]'));
2017    this._cio = new IntersectionObserver((entries) => {
2018      entries.forEach(e => {
2019        if (!e.isIntersecting) { return; }
2020        const el = e.target;
2021        this._cio.unobserve(el);
2022        const target = parseFloat(el.getAttribute('data-count'));
2023        const dec = parseInt(el.getAttribute('data-dec') || '0', 10);
2024        const sep = el.hasAttribute('data-sep');
2025        const suffix = el.getAttribute('data-suffix') || '';
2026        const prefix = el.getAttribute('data-prefix') || '';
2027        const dur = 1300;
2028        const t0 = performance.now();
2029        const fmt = (v) => {
2030          let s = dec ? v.toFixed(dec).replace('.', ',') : String(Math.round(v));
2031          if (sep) { s = s.replace(/\B(?=(\d{3})+(?!\d))/g, ' '); }
2032          return prefix + s + suffix;
2033        };
2034        const tick = (t) => {
2035          const k = Math.min(1, (t - t0) / dur);
2036          const eased = 1 - Math.pow(1 - k, 3);
2037          el.textContent = fmt(target * eased);
2038          if (k < 1) { requestAnimationFrame(tick); }
2039        };
2040        if (reduce) { el.textContent = fmt(target); } else { requestAnimationFrame(tick); }
2041      });
2042    }, { threshold: 0.5 });
2043    nums.forEach(el => this._cio.observe(el));
2044
2045    // 2b. stars pop when the card scrolls into view
2046    this._sio = new IntersectionObserver((entries) => {
2047      entries.forEach(e => {
2048        if (!e.isIntersecting) { return; }
2049        this._sio.unobserve(e.target);
2050        Array.from(e.target.children).forEach(sp => this._apply(sp, { animationPlayState: 'running' }));
2051      });
2052    }, { threshold: 0.4 });
2053    Array.from(this._root.querySelectorAll('[data-stars]')).forEach(el => this._sio.observe(el));
2054
2055    // 3. scroll driven: reading bar + steps progress
2056    const bar = this._root.querySelector('[data-readbar]');
2057    const stepsWrap = this._root.querySelector('[data-steps]');
2058    const stepsBar = this._root.querySelector('[data-stepsbar]');
2059    const monWrap = this._root.querySelector('[data-mon]');
2060    const monBar = this._root.querySelector('[data-monbar]');
2061    this._onScroll = () => {
2062      const doc = document.documentElement;
2063      const max = (doc.scrollHeight - window.innerHeight) || 1;
2064      if (bar) { bar.style.width = Math.min(100, Math.max(0, (window.scrollY / max) * 100)) + '%'; }
2065      if (stepsWrap && stepsBar) {
2066        const r = stepsWrap.getBoundingClientRect();
2067        const p = (window.innerHeight * 0.62 - r.top) / (r.height || 1);
2068        stepsBar.style.width = Math.min(100, Math.max(0, p * 100)) + '%';
2069      }
2070      if (monWrap && monBar) {
2071        const r2 = monWrap.getBoundingClientRect();
2072        const p2 = (window.innerHeight * 0.62 - r2.top) / (r2.height || 1);
2073        monBar.style.width = Math.min(100, Math.max(0, p2 * 100)) + '%';
2074      }
2075    };
2076    window.addEventListener('scroll', this._onScroll, { passive: true });
2077    this._onScroll();
2078
2079    // 2c. identity section: staged photo reveal + scan sweep + lock pulse
2080    this._idio = new IntersectionObserver((entries) => {
2081      entries.forEach(e => {
2082        if (!e.isIntersecting) { return; }
2083        this._idio.unobserve(e.target);
2084        const el = e.target;
2085        if (el.hasAttribute('data-idlock')) {
2086          const slots = Array.from(el.querySelectorAll('[data-idreveal]'));
2087          const last = slots.length ? slots.length - 1 : 0;
2088          setTimeout(() => { this._apply(el, { animation: 'lockRing 1s ease-out both' }); }, 500 + last * 120);
2089          return;
2090        }
2091        this._apply(el, { animationPlayState: 'running' });
2092      });
2093    }, { threshold: 0.08, rootMargin: '0px 0px -5% 0px' });
2094    Array.from(this._root.querySelectorAll('[data-idreveal],[data-idscan],[data-idlock]')).forEac
2094h(el => this._idio.observe(el));
2095
2096    // safety: never leave a photo hidden if the observer misses it
2097    this._idFallback = setInterval(() => {
2098      Array.from(this._root.querySelectorAll('[data-idreveal],[data-idscan]')).forEach(el => {
2099        const r = el.getBoundingClientRect();
2100        const onScreen = r.top < window.innerHeight && r.bottom > 0;
2101        if (onScreen && getComputedStyle(el).animationPlayState === 'paused') {
2102          this._apply(el, { animationPlayState: 'running' });
2103        }
2104      });
2105    }, 900);
2106
2107    // 3c. live render counter
2108    this._liveTimer = setInterval(() => {
2109      const cur = (this.state || {}).liveNow || 370;
2110      const next = Math.max(280, Math.min(640, cur + (Math.random() < 0.5 ? -1 : 1) * (2 + Math.floor(Math.random() * 12))));
2111      this.setState({ liveNow: next });
2112    }, 3200);
2113
2114    // 3d. drop videos that fail to decode (stale saved file)
2115    this._onVidErr = (ev) => {
2116      const el = ev.target;
2117      if (!el || el.tagName !== 'VIDEO') { return; }
2118      const i = parseInt(el.getAttribute('data-val'), 10);
2119      if (isNaN(i)) { return; }
2120      const patch = {};
2121      patch['u' + i] = null;
2122      this.setState(patch);
2123      this._dropClip(i);
2124    };
2125    this._root.addEventListener('error', this._onVidErr, true);
2126
2127    // 3e. synchronize click-only playback once the elements exist
2128    this._kick = setTimeout(() => this._syncVideos(), 300);
2129
2130    // 3f. magnetic buttons
2131    Array.from(this._root.querySelectorAll('[data-magnet]')).forEach(btn => {
2132      const reset = () => { btn.style.transform = ''; btn.style.transition = 'transform .45s cubic-bezier(.2,1.5,.4,1)'; };
2133      btn.addEventListener('pointermove', (ev) => {
2134        const r = btn.getBoundingClientRect();
2135        const dx = (ev.clientX - (r.left + r.width / 2)) / (r.width / 2);
2136        const dy = (ev.clientY - (r.top + r.height / 2)) / (r.height / 2);
2137        btn.style.transition = 'transform .08s linear';
2138        btn.style.transform = 'translate(' + (dx * 6).toFixed(1) + 'px,' + (dy * 4).toFixed(1) + 'px) scale(1.02)';
2139      });
2140      btn.addEventListener('pointerleave', reset);
2141      btn.addEventListener('pointerup', reset);
2142      btn.addEventListener('pointercancel', reset);
2143    });
2144
2145    // 5+6+8. section rail, parallax, warm shift
2146    const rail = this._root.querySelector('[data-rail]');
2147    const warm = this._root.querySelector('[data-warm]');
2148    const secs = Array.from(this._root.querySelectorAll('[data-screen-label]')).filter(el => el.offsetHeight > 200);
2149    if (rail) {
2150      secs.forEach((el, k) => {
2151        const dot = document.createElement('div');
2152        dot.setAttribute('data-railitem', String(k));
2153        dot.style.cssText = "font-family:'Space Mono',monospace;font-size:8px;letter-spacing:0.1em;color:rgba(244,241,234,0.35);display:flex;align-items:center;gap:6px;transition:color .3s ease";
2154        dot.innerHTML = '<span style="display:inline-block;width:0;height:1px;background:#FF3D2E;transition:width .3s ease"></span>' + String(k + 1).padStart(2, '0');
2155        rail.appendChild(dot);
2156      });
2157    }
2158    const pricingEl = this._root.querySelector('#pricing');
2159    this._fx = () => {
2160      const vh = window.innerHeight;
2161      // parallax
2162      Array.from(this._root.querySelectorAll('[data-parallax]')).forEach(el => {
2163        const dir = parseFloat(el.getAttribute('data-parallax')) || 0;
2164        const r = el.getBoundingClientRect();
2165        const p = (r.top + r.height / 2 - vh / 2) / vh;
2166        el.style.objectPosition = '50% ' + (30 + dir * p * 12).toFixed(1) + '%';
2167        el.style.transform = 'translateY(' + (dir * p * -10).toFixed(1) + 'px)';
2168      });
2169      // rail
2170      if (rail) {
2171        const scrolled = window.scrollY > vh * 0.6;
2172        rail.style.opacity = scrolled ? '1' : '0';
2173        let active = 0;
2174        secs.forEach((el, k) => { if (el.getBoundingClientRect().top < vh * 0.45) { active = k; } });
2175        Array.from(rail.children).forEach((d, k) => {
2176          d.style.color = k === active ? '#F4F1EA' : 'rgba(244,241,234,0.32)';
2177          d.firstChild.style.width = k === active ? '14px' : '0';
2178        });
2179      }
2180      // warm shift near pricing
2181      if (warm && pricingEl) {
2182        const r = pricingEl.getBoundingClientRect();
2183        const near = 1 - Math.min(1, Math.max(0, (r.top - vh * 0.1) / vh));
2184        warm.style.opacity = (near * (r.bottom > 0 ? 1 : 0)).toFixed(3);
2185      }
2186    };
2187    this._fx();
2188    window.addEventListener('scroll', this._fx, { passive: true });
2189    window.addEventListener('resize', this._fx);
2190
2191    // 3g. audience cards: image zoom on hover
2192    Array.from(this._root.querySelectorAll('[data-aud]')).forEac
2192h(cardEl => {
2193      const img = cardEl.querySelector('[data-audimg]');
2194      if (!img) { return; }
2195      cardEl.addEventListener('pointerenter', () => { img.style.transform = 'scale(1.09)'; });
2196      cardEl.addEventListener('pointerleave', () => { img.style.transform = 'scale(1)'; });
2197    });
2198
2199    // 3j. identity scene tiles cycle
2200    this._scTimer = setInterval(() => {
2201      const cur = (this.state || {}).sc || 0;
2202      this.setState({ sc: (cur + 1) % 6 });
2203    }, 1400);
2204
2205    // 3k. pause the clip lanes on hover so uploads are clickable
2206    const lanes = this._root.querySelector('[data-lanes]');
2207    if (lanes) {
2208      const rows = Array.from(lanes.children).map(row => {
2209        if (getComputedStyle(row).animationName !== 'none') { return row; }
2210        return Array.from(row.querySelectorAll('*')).find(el => getComputedStyle(el).animationName !== 'none') || row;
2211      });
2212      const base = rows.map(r => parseFloat(getComputedStyle(r).animationDuration) || 46);
2213      const apply = (mult) => rows.forEach((r, k) => { r.style.animationDuration = (base[k] * mult) + 's'; });
2214      lanes.addEventListener('pointerenter', () => apply(5));
2215      lanes.addEventListener('pointerleave', () => apply(1));
2216      Array.from(lanes.querySelectorAll('[data-clip]')).forEach(tile => {
2217        tile.addEventListener('pointerenter', () => {
2218          Array.from(lanes.querySelectorAll('[data-clip]')).forEach(o => { o.style.opacity = o === tile ? '1' : '0.35'; });
2219        });
2220        tile.addEventListener('pointerleave', () => {
2221          Array.from(lanes.querySelectorAll('[data-clip]')).forEach(o => { o.style.opacity = '1'; });
2222        });
2223      });
2224    }
2225
2226    // 3i. audience cards autoplay
2227    this._audTimer = setInterval(() => {
2228      if (this._audHold) { return; }
2229      const cur = (this.state || {}).aud || 0;
2230      this.setState({ aud: (cur + 1) % 3 });
2231    }, 3600);
2232
2233    // 3h. monetization tabs autoplay
2234
2235
2236    // 3p. testimonial stack autoplay
2237    this._tmTimer = setInterval(() => {
2238      if (this._tmHold) { return; }
2239      this.setState({ tm: (((this.state || {}).tm || 0) + 1) % 4 });
2240    }, 4200);
2241
2242    // 3o. 3D tilt on cards
2243    if (window.matchMedia('(pointer:fine)').matches) {
2244      Array.from(this._root.querySelectorAll('[data-aud], figure[data-aud], [data-clip]:not([data-carousel-card])')).forEach(card => {
2245        const base = card.style.transform || '';
2246        card.style.transformStyle = 'preserve-3d';
2247        card.addEventListener('pointermove', (ev) => {
2248          const r = card.getBoundingClientRect();
2249          const dx = (ev.clientX - (r.left + r.width / 2)) / (r.width / 2);
2250          const dy = (ev.clientY - (r.top + r.height / 2)) / (r.height / 2);
2251          card.style.transition = 'transform .12s linear';
2252          card.style.transform = base + ' perspective(900px) rotateY(' + (dx * 6).toFixed(2) + 'deg) rotateX(' + (-dy * 6).toFixed(2) + 'deg) translateZ(6px)';
2253        });
2254        const reset = () => {
2255          card.style.transition = 'transform .6s cubic-bezier(.2,.9,.3,1)';
2256          card.style.transform = base;
2257        };
2258        card.addEventListener('pointerleave', reset);
2259        card.addEventListener('pointercancel', reset);
2260      });
2261    }
2262
2263    // 3n. nav hide/show + adaptive vignette
2264    const nav = this._root.querySelector('[data-nav]');
2265    const vig = this._root.querySelector('[data-vignette]');
2266    if (nav) { nav.style.transition = 'transform .45s cubic-bezier(.2,.8,.3,1),background .4s ease'; }
2267    let lastY = window.scrollY;
2268    this._navScroll = () => {
2269      const y = window.scrollY;
2270      if (nav) {
2271        if (y < 80) { nav.style.transform = 'translateY(0)'; }
2272        else if (y > lastY + 4) { nav.style.transform = 'translateY(-110%)'; }
2273        else if (y < lastY - 4) { nav.style.transform = 'translateY(0)'; }
2274      }
2275      if (vig) {
2276        const mid = document.elementFromPoint(window.innerWidth / 2, window.innerHeight / 2);
2277        const sec = mid && mid.closest ? mid.closest('[data-screen-label]') : null;
2278        const light = sec && /Video lesson/.test(sec.getAttribute('data-screen-label') || '');
2279        vig.style.opacity = light ? '0.15' : '0.85';
2280      }
2281      lastY = y;
2282    };
2283    this._navScroll();
2284    window.addEventListener('scroll', this._navScroll, { passive: true });
2285
2286    // 3m. tab title + favicon
2287    this._title = document.title;
2288    const setFavicon = (dot) => {
2289      let link = document.querySelector('link[rel="icon"]');
2290      if (!link) { link = document.createElement('link'); link.rel = 'icon'; document.head.appendChild(link); }
2291      const svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="7" fill="%230A0A0C"/><circle cx="16" cy="16" r="' + (dot ? 9 : 6) + '" fill="%23FF3D2E"/></svg>';
2292      link.href = 'data:image/svg+xml,' + svg;
2293    };
2294    setFavicon(false);
2295    this._onVis = () => {
2296      if (document.hidden) {
2297        document.title = (window.T5&&window.T5['x078']||"Вернись - твой клип ждёт");
2298        clearInterval(this._favTimer);
2299        let on = false;
2300        this._favTimer = setInterval(() => { on = !on; setFavicon(on); }, 700);
2301      } else {
2302        document.title = this._title;
2303        clearInterval(this._favTimer);
2304        setFavicon(false);
2305      }
2306    };
2307    document.addEventListener('visibilitychange', this._onVis);
2308
2309    // 3l. multi-layer parallax
2310    const pxLayers = [];
2311    Array.from(this._root.querySelectorAll('[data-screen-label]')).forEach(sec => {
2312      const bg = Array.from(sec.querySelectorAll(':scope > span, :scope > div > span')).filter(el => /radial-gradient|blur\(/.test(el.getAttribute('style') || ''));
2313      bg.forEach(el => pxLayers.push([el, 0.16]));
2314      const h2 = sec.querySelector('h1, h2');
2315      if (h2) { pxLayers.push([h2, 0.05]); }
2316      Array.from(sec.querySelectorAll('[data-aud]')).forEach((el, k) => pxLayers.push([el, k % 2 === 0 ? -0.04 : -0.075]));
2317    });
2318    this._px = () => {
2319      const vh = window.innerHeight;
2320      pxLayers.forEach(([el, rate]) => {
2321        const r = el.getBoundingClientRect();
2322        const p = (r.top + r.height / 2 - vh / 2) / vh;
2323        const y = -(p * rate * 100);
2324        const base = el.getAttribute('data-pxbase');
2325        if (base === null) { el.setAttribute('data-pxbase', el.style.transform || ''); }
2326        const b = el.getAttribute('data-pxbase') || '';
2327        el.style.transform = (b ? b + ' ' : '') + 'translate3d(0,' + y.toFixed(1) + 'px,0)';
2328      });
2329    };
2330    this._px();
2331    window.addEventListener('scroll', this._px, { passive: true });
2332    window.addEventListener('resize', this._px);
2333
2334    // 3k. custom cursor
2335    const cur = this._root.querySelector('[data-cursor]');
2336    const curLabel = this._root.querySelector('[data-cursorlabel]');
2337    if (cur && window.matchMedia('(pointer:fine)').matches) {
2338      let raf = null, tx = -100, ty = -100;
2339      const move = (ev) => {
2340        tx = ev.clientX; ty = ev.clientY;
2341        cur.style.opacity = '1';
2342        if (raf) { return; }
2343        raf = requestAnimationFrame(() => {
2344          cur.style.transform = 'translate3d(' + tx + 'px,' + ty + 'px,0)';
2345          raf = null;
2346        });
2347      };
2348      window.addEventListener('pointermove', move, { passive: true });
2349      const setMode = (mode) => {
2350        if (mode === 'play') {
2351          cur.style.width = '64px'; cur.style.height = '64px'; cur.style.margin = '-32px 0 0 -32px';
2352          cur.style.background = 'rgba(244,241,234,0.92)'; cur.style.borderColor = 'transparent';
2353          if (curLabel) { curLabel.textContent = '▶'; curLabel.style.opacity = '1'; }
2354        } else if (mode === 'link') {
2355          cur.style.width = '44px'; cur.style.height = '44px'; cur.style.margin = '-22px 0 0 -22px';
2356          cur.style.background = 'rgba(255,61,46,0.9)'; cur.style.borderColor = 'transparent';
2357          if (curLabel) { curLabel.textContent = ''; curLabel.style.opacity = '0'; }
2358        } else {
2359          cur.style.width = '26px'; cur.style.height = '26px'; cur.style.margin = '-13px 0 0 -13px';
2360          cur.style.background = 'transparent'; cur.style.borderColor = 'rgba(244,241,234,0.5)';
2361          if (curLabel) { curLabel.style.opacity = '0'; }
2362        }
2363      };
2364      document.addEventListener('pointerover', (ev) => {
2365        const t = ev.target;
2366        if (!t || !t.closest) { return; }
2367        if (t.closest('video, [data-clip], [data-lessonvideo]')) { setMode('play'); }
2368        else if (t.closest('button, a, label, [role="button"]')) { setMode('link'); }
2369        else { setMode('idle'); }
2370      }, { passive: true });
2371    }
2372
2373  }
2374
2375  componentWillUnmount() {
2376    window.removeEventListener('clipchat:intro-offer-expired', this._onOfferExpired);
2377    if (this._io) { this._io.disconnect(); }
2378    if (this._cio) { this._cio.disconnect(); }
2379    if (this._sio) { this._sio.disconnect(); }
2380    if (this._idio) { this._idio.disconnect(); }
2381    if (this._idFallback) { clearInterval(this._idFallback); }
2382    if (this._timer) { clearInterval(this._timer); }
2383    if (this._liveTimer) { clearInterval(this._liveTimer); }
2384    if (this._pctTimer) { clearInterval(this._pctTimer); }
2385    if (this._onVidErr && this._root) { this._root.removeEventListener('error', this._onVidErr, true); }
2386    (this._carouselCleanups || []).forEach(cleanup => cleanup());
2387    window.removeEventListener('scroll', this._onScroll);
2388  }
2389
2390  renderVals() {
2391    const s = this.state || {};
2392    const demo = s.demo || 'idle';
2393    const faq = (s.faq === undefined) ? -1 : s.faq;
2394    const menuOpen = !!s.menuOpen;
2395    const self = this;
2396
2397    const mk = (i) => ({
2398      st: 'font-size:13px;line-height:1.6;color:var(--dim);margin:0;overflow:hidden;transition:max-height .34s cubic-bezier(.2,.7,.3,1),opacity .26s ease,padding .3s ease;'
2399        + (faq === i ? 'max-height:320px;opacity:1;padding:0 0 16px 0' : 'max-height:0;opacity:0;padding:0'),
2400      sym: faq === i ? '\u2212' : '+',
2401      symSt: 'position:absolute;right:2px;top:18px;color:var(--acc);font-size:21px;line-height:1;display:inline-block;transform-origin:50% 52%;transition:transform .34s cubic-bezier(.2,.8,.3,1);'
2402        + (faq === i ? 'transform:rotate(135deg)' : 'transform:rotate(0deg)')
2403    });
2404    const f = [0,1,2,3,4,5,6].map(mk);
2405
2406    const slide = s.slide || 0;
2407    const drag = s.dragX || 0;
2408    const dragging = !!s.dragging;
2409    const STEP = 268;
2410    const CARD_COUNT = 8;
2411    const carousel = {};
2412    for (let i = 0; i < CARD_COUNT; i++) {
2413      let off = i - slide;
2414      if (off > Math.floor(CARD_COUNT / 2)) { off -= CARD_COUNT; }
2415      if (off < -Math.floor(CARD_COUNT / 2)) { off += CARD_COUNT; }
2416      const fOff = off + (drag / STEP);
2417      const fAbs = Math.min(2, Math.abs(fOff));
2418      const abs = Math.abs(off);
2419      const vis = true;
2420      const scale = 1 - 0.14 * fAbs;
2421      const blur = fAbs <= 1 ? 3.5 * fAbs : 5 + (fAbs - 1) * 2;
2422      const op = fAbs <= 1 ? (1 - 0.4 * fAbs) : Math.max(0.22, 0.6 - (fAbs - 1) * 0.38);
2423      carousel['c' + i] = 'position:absolute;top:50%;left:50%;width:320px;aspect-ratio:9/14;border-radius:16px;border:1px solid var(--line);overflow:hidden;cursor:grab;touch-action:pan-y;'
2424        + 'transform:translate(-50%,-50%) translateX(' + (fOff * STEP).toFixed(1) + 'px) scale(' + scale.toFixed(3) + ');'
2425        + 'filter:blur(' + blur.toFixed(2) + 'px);opacity:' + op.toFixed(3) + ';'
2426        + 'z-index:' + (10 - abs) + ';pointer-events:' + (vis ? 'auto' : 'none') + ';'
2427        + (dragging ? 'transition:none' : 'transition:transform .42s cubic-bezier(.22,.9,.28,1),filter .35s ease,opacity .35s ease');
2428      carousel['d' + i] = 'width:' + (i === slide ? 18 : 6) + 'px;height:6px;border-radius:3px;cursor:pointer;background:' + (i === slide ? 'var(--acc)' : 'rgba(244,241,234,0.25)') + ';transition:all .25s ease';
2429    }
2430    // ---------- interactive waveform ----------
2431    const SECS = [
2432      { label: (window.T5&&window.T5['m169']||"ИНТРО"), n: 5, hot: false, scenes: 3 },
2433      { label: (window.T5&&window.T5['m170']||"КУПЛЕТ 1"), n: 9, hot: false, scenes: 6 },
2434      { label: (window.T5&&window.T5['m171']||"ПРИПЕВ"), n: 8, hot: true, scenes: 5 },
2435      { label: (window.T5&&window.T5['m172']||"КУПЛЕТ 2"), n: 9, hot: false, scenes: 6 },
2436      { label: (window.T5&&window.T5['m173']||"БРИДЖ"), n: 5, hot: false, scenes: 2 },
2437      { label: (window.T5&&window.T5['m171']||"ПРИПЕВ"), n: 8, hot: true, scenes: 5 }
2438    ];
2439    const total = SECS.reduce((a, s) => a + s.n, 0);
2440    const wavePos = (s.wavePos === undefined) ? 0.42 : s.wavePos;
2441    const activeBar = Math.min(total - 1, Math.floor(wavePos * total));
2442    const waveBars = [];
2443    let idx = 0, activeSec = SECS[0];
2444    SECS.forEach((sec) => {
2445      for (let i = 0; i < sec.n; i++) {
2446        const h = sec.hot ? 62 + ((i * 37) % 38) : 20 + ((i * 29) % 42);
2447        const near = Math.abs(idx - activeBar) <= 1;
2448        if (idx === activeBar) { activeSec = sec; }
2449        waveBars.push({ st: 'flex:1;min-width:2px;border-radius:1.5px;transition:background .2s,height .2s;height:' + h + '%;background:'
2450          + (near ? 'var(--acc)' : (sec.hot ? 'rgba(255,138,92,0.55)' : 'rgba(244,241,234,0.3)'))
2451          + (near ? ';box-shadow:0 0 14px rgba(255,61,46,0.55)' : '') });
2452        idx++;
2453      }
2454    });
2455
2456    // ---------- chat demo ----------
2457    const tone = s.tone || 'base';
2458    const bubble = (who) => 'max-width:88%;border-radius:14px;padding:12px 16px;font-size:13px;line-height:1.55;animation:riseIn .45s cubic-bezier(.2,.7,.3,1) both;'
2459      + (who === 'u'
2460        ? 'background:rgba(255,61,46,0.13);border:1px solid rgba(255,61,46,0.35);align-self:flex-end'
2461        : 'background:var(--panel2);border:1px solid var(--line);align-self:flex-start');
2462    const msgs = [{ st: bubble('d'), tag: (window.T5&&window.T5['x068']||"● Режиссёр"), text: (window.T5&&window.T5['x069']||"Послушал. 140 BPM, фонк в ля миноре, вокал на русском - про то, как уходят на рассвете. Снял бы два мира: ночная заправка и рассветный ритуал в пустыне. Липсинк на припевах.") }];
2463    if (tone === 'dark') {
2464      msgs.push({ st: bubble('u'), tag: (window.T5&&window.T5['x070']||"Ты"), text: (window.T5&&window.T5['x071']||"Темнее") });
2465      msgs.push({ st: bubble('d'), tag: (window.T5&&window.T5['x068']||"● Режиссёр"), text: (window.T5&&window.T5['x072']||"Убираю рассвет. Всё держим в ночи: холодный неон заправки, дым, фары в кадре. Контраст жёстче, лицо крупнее.") });
2466    } else if (tone === 'perf') {
2467      msgs.push({ st: bubble('u'), tag: (window.T5&&window.T5['x070']||"Ты"), text: (window.T5&&window.T5['x073']||"Больше перформанса") });
2468      msgs.push({ st: bubble('d'), tag: (window.T5&&window.T5['x068']||"● Режиссёр"), text: (window.T5&&window.T5['x074']||"Добавляю блок исполнения: ты у колонки, камера кружит, липсинк теперь и на втором куплете. Сцен станет 28.") });
2469    }
2470    const contractTxt = tone === 'dark'
2471      ? (window.T5&&window.T5['x075']||"~24 сцены · липсинк: припевы · миры: 1 (ночь) · без рассвета")
2472      : (tone === 'perf' ? (window.T5&&window.T5['x076']||"~28 сцен · липсинк: припевы + куплет 2 · миры: 2 · блок перформанса") : (window.T5&&window.T5['x077']||"~24 сцены · липсинк: припевы · миры: 2 · без пианино"));
2473
2474    // ---------- before / after ----------
2475    const ba = (s.ba === undefined) ? 52 : s.ba;
2476    const baBars = [];
2477    for (let i = 0; i < 26; i++) {
2478      const h = 12 + ((i * 41) % 70);
2479      baBars.push({ st: 'flex:1;height:' + h + '%;max-height:60%;background:rgba(244,241,234,0.28);border-radius:2px' });
2480    }
2481
2482    // ---------- calculator ----------
2483    const calcMin = s.calcMin || 5;
2484    const calculator = window.ClipChatLandingCalculator(calcMin, window.T5 || {});
2485
2486    const p = this.props || {};
2487    const mon = (this.state || {}).mon || 0;
2488    const aud = (this.state || {}).aud || 0;
2489    const tm = (this.state || {}).tm || 0;
2490    const tmCard = (k) => {
2491      const on = k === tm;
2492      return 'position:relative;margin:0;display:flex;flex-direction:column;justify-content:space-between;gap:18px;background:linear-gradient(168deg,#191920 0%,#0E0E12 72%);border:1px solid '
2493        + (on ? 'rgba(255,61,46,0.5)' : 'var(--line)')
2494        + ';border-radius:14px;padding:22px 20px;cursor:pointer;transition:transform .7s cubic-bezier(.2,.8,.3,1),opacity .6s ease,border-color .6s ease,box-shadow .6s ease;'
2495        + 'transform:translateY(' + (on ? '-8px' : '0') + ') scale(' + (on ? '1.03' : '0.985') + ');opacity:' + (on ? '1' : '0.5')
2496        + ';box-shadow:' + (on ? '0 30px 66px rgba(0,0,0,0.6),0 0 44px rgba(255,61,46,0.14)' : '0 18px 40px rgba(0,0,0,0.45)')
2497        + ';z-index:' + (on ? 3 : 1);
2498    };
2499    const tmDot = (k) => 'width:' + (k === tm ? '22px' : '7px') + ';height:7px;border-radius:999px;cursor:pointer;transition:width .5s cubic-bezier(.2,.8,.3,1),background .4s ease;background:' + (k === tm ? 'var(--acc)' : 'rgba(244,241,234,0.28)');
2500    const sc = (this.state || {}).sc || 0;
2501    const sceneTile = (k) => 'position:relative;aspect-ratio:1/1;border-radius:10px;overflow:hidden;background:#0B0B0E;transition:border-color .5s ease,box-shadow .5s ease,transform .5s cubic-bezier(.2,.8,.3,1),filter .5s ease;border:1px solid '
2502      + (sc === k ? 'rgba(255,61,46,0.85)' : 'var(--line)')
2503      + ';box-shadow:' + (sc === k ? '0 0 34px rgba(255,61,46,0.30)' : '0 12px 26px rgba(0,0,0,0.4)')
2504      + ';transform:scale(' + (sc === k ? '1.03' : '1') + ');filter:saturate(' + (sc === k ? '1.05' : '0.72') + ') brightness(' + (sc === k ? '1' : '0.78') + ')';
2505    const sceneMark = () => 'display:none';
2506    const monRow = () => 'position:relative;display:block;width:100%;text-align:left;border:none;border-radius:10px;cursor:default;padding:22px 22px 22px 24px;background:transparent;opacity:1';
2507    const monDesc = () => 'display:block;font-size:15px;line-height:1.5;letter-spacing:-0.008em;color:var(--dim);margin-top:10px';
2508    const monPane = (k) => {
2509      const active = mon === k;
2510      const past = k < mon || (mon === 0 && k === 2);
2511      return 'position:absolute;inset:0;overflow:hidden;transition:clip-path 1s cubic-bezier(.76,0,.24,1),transform 1.2s cubic-bezier(.76,0,.24,1);'
2512        + 'clip-path:inset(' + (active ? '0 0 0 0' : (past ? '0 0 0 100%' : '0 100% 0 0')) + ');'
2513        + 'transform:scale(' + (active ? '1' : '1.12') + ');'
2514        + 'z-index:' + (active ? '3' : (past ? '2' : '1'));
2515    };
2516    const nick = (v, dflt) => String(v || dflt).replace(/^@+/, '').trim();
2517    const n1 = nick(p.nick1, 'sveta.v.reels');
2518    const n2 = nick(p.nick2, 'maya.songs');
2519    const n3 = nick(p.nick3, 'boonmadeit');
2520    const n4 = nick(p.nick4, 'irina.pavlowa');
2521    const srcs = [p.clip1Url, p.clip2Url, p.clip3Url, p.clip4Url];
2522    const vids = {
2523      v0: srcs[0] || undefined, hasV0: !!srcs[0],
2524      v1: srcs[1] || undefined, hasV1: !!srcs[1],
2525      v2: srcs[2] || undefined, hasV2: !!srcs[2],
2526      v3: srcs[3] || undefined, hasV3: !!srcs[3]
2527    };
2528    const sounds = Array.from({ length: CARD_COUNT }, (_, i) => ({
2529      ['snd' + i]: (s.sound && (s.slide || 0) === i) ? '❙❙' : '▶'
2530    })).reduce((all, item) => Object.assign(all, item), {});
2531
2532    return {
2533      ...carousel,
2534      ...vids,
2535      ...sounds,
2536      pickSlide: function (e) {
2537        const v = parseInt(e.currentTarget.getAttribute('data-val'), 10) || 0;
2538        self._paused = true;
2539        if (navigator.vibrate) { navigator.vibrate(8); }
2540        self.setState({ slide: v });
2541      },
2542
2543      // waveform
2544      waveBars: waveBars,
2545      waveLabel: activeSec.label + ' · ' + activeSec.scenes + (window.T5&&window.T5['m180']||" сцен") + (activeSec.hot ? (window.T5&&window.T5['m181']||" · липсинк") : ''),
2546      playheadSt: 'position:absolute;top:-6px;bottom:-6px;width:2px;background:var(--ink);box-shadow:0 0 16px rgba(255,61,46,0.9);pointer-events:none;left:' + (wavePos * 100).toFixed(1) + '%',
2547      waveDown: function (e) {
2548        self._wave = true;
2549        e.currentTarget.setPointerCapture && e.currentTarget.setPointerCapture(e.pointerId);
2550        const r = e.currentTarget.getBoundingClientRect();
2551        self.setState({ wavePos: Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) });
2552      },
2553      waveMove: function (e) {
2554        if (!self._wave) { return; }
2555        const r = e.currentTarget.getBoundingClientRect();
2556        self.setState({ wavePos: Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) });
2557      },
2558      waveUp: function () { self._wave = false; },
2559
2560      // chat
2561      msgs: msgs,
2562      contractTxt: contractTxt,
2563      contractSt: 'border:1px solid rgba(255,61,46,0.45);background:rgba(255,61,46,0.07);border-radius:10px;padding:12px 12px;font-family:\'Space Mono\',monospace;font-size:9.5px;letter-spacing:0.06em;color:var(--ink);text-transform:uppercase;line-height:1.7;transition:box-shadow .3s ease;'
2564        + (tone === 'base' ? '' : 'box-shadow:0 0 26px rgba(255,61,46,0.35)'),
2565      chatPill: function (e) {
2566        const v = e.currentTarget.getAttribute('data-val');
2567        if (navigator.vibrate) { navigator.vibrate(8); }
2568        self.setState({ tone: v === 'reset' ? 'base' : v });
2569      },
2570
2571      // before / after
2572      baBars: baBars,
2573      baTopSt: 'position:absolute;inset:0;clip-path:inset(0 0 0 ' + ba + '%)',
2574      baHandleSt: 'position:absolute;top:0;bottom:0;width:2px;background:var(--acc);display:flex;align-items:center;justify-content:center;pointer-events:none;left:' + ba + '%',
2575      baDown: function (e) {
2576        self._ba = true;
2577        e.currentTarget.setPointerCapture && e.currentTarget.setPointerCapture(e.pointerId);
2578        const r = e.currentTarget.getBoundingClientRect();
2579        self.setState({ ba: Math.min(96, Math.max(4, ((e.clientX - r.left) / r.width) * 100)) });
2580      },
2581      baMove: function (e) {
2582        if (!self._ba) { return; }
2583        const r = e.currentTarget.getBoundingClientRect();
2584        self.setState({ ba: Math.min(96, Math.max(4, ((e.clientX - r.left) / r.width) * 100)) });
2585      },
2586      baUp: function () { self._ba = false; },
2587
2588      // calculator
2589      calcMin: calcMin,
2590      calcPlanCredits: calculator.credits,
2591      calcPlanVideos: calculator.videos,
2592      calcPlan: calculator.plan,
2593      setCalc: function (e) { self.setState({ calcMin: parseInt(e.currentTarget.value, 10) || 1 }); },
2594
2595      liveNow: s.liveNow || 370,
2596      audCols: [0, 1, 2].map(k => (k === aud ? '1.5fr' : '1fr')).join(' '),
2597      az0: aud === 0 ? 1.1 : 1, az1: aud === 1 ? 1.1 : 1, az2: aud === 2 ? 1.1 : 1,
2598      hoverAud: function (ev) {
2599        const k = parseInt(ev.currentTarget.getAttribute('data-audk'), 10) || 0;
2600        self._audHold = true;
2601        self.setState({ aud: k });
2602      },
2603      leaveAud: function () { self._audHold = false; },
2604      onPhoto: function (ev) {
2605        if (ev.currentTarget) { ev.currentTarget.value = ''; }
2606      },
2607      st0: sceneTile(0), st1: sceneTile(1), st2: sceneTile(2), st3: sceneTile(3), st4: sceneTile(4), st5: sceneTile(5),
2608      sm0: sceneMark(0), sm1: sceneMark(1), sm2: sceneMark(2), sm3: sceneMark(3), sm4: sceneMark(4), sm5: sce
2608neMark(5),
2609      lessonIcon: s.lessonSound ? '❙❙' : '▶',
2610      toggleLesson: function (ev) {
2611        ev.stopPropagation();
2612        self.setState({ lessonSound: !((self.state || {}).lessonSound) });
2613      },
2614      tms0: tmCard(0), tms1: tmCard(1), tms2: tmCard(2), tms3: tmCard(3),
2615      tmd0: tmDot(0), tmd1: tmDot(1), tmd2: tmDot(2), tmd3: tmDot(3),
2616      nextTm: function () { self._tmHold = true; self.setState({ tm: (((self.state || {}).tm || 0) + 1) % 4 }); },
2617      pickTm: function (ev) { ev.stopPropagation(); self._tmHold = true; self.setState({ tm: parseInt(ev.currentTarget.getAttribute('data-val'), 10) || 0 }); },
2618      mr0: monRow(0), mr1: monRow(1), mr2: monRow(2),
2619      md0: monDesc(0), md1: monDesc(1), md2: monDesc(2),
2620      ms0: 1, ms1: 1, ms2: 1,
2621      mp0: monPane(0), mp1: monPane(1), mp2: monPane(2),
2622      pickMon: function (ev) {
2623        const k = parseInt(ev.currentTarget.getAttribute('data-monrow'), 10) || 0;
2624        self._monHold = true;
2625        self.setState({ mon: k });
2626      },
2627      snd0: (s.sound && (s.slide || 0) === 0) ? '❙❙' : '▶',
2628      snd1: (s.sound && (s.slide || 0) === 1) ? '❙❙' : '▶',
2629      snd2: (s.sound && (s.slide || 0) === 2) ? '❙❙' : '▶',
2630      snd3: (s.sound && (s.slide || 0) === 3) ? '❙❙' : '▶',
2631      snd4: (s.sound && (s.slide || 0) === 4) ? '❙❙' : '▶',
2632      snd5: (s.sound && (s.slide || 0) === 5) ? '❙❙' : '▶',
2633      snd6: (s.sound && (s.slide || 0) === 6) ? '❙❙' : '▶',
2634      snd7: (s.sound && (s.slide || 0) === 7) ? '❙❙' : '▶',
2635      toggleSound: function (e) {
2636        e.stopPropagation();
2637        const i = parseInt(e.currentTarget.getAttribute('data-val'), 10) || 0;
2638        const st = self.state || {};
2639        const on = !(st.sound && (st.slide || 0) === i);
2640        self._paused = true;
2641        self.setState({ sound: on, slide: i });
2642        const apply = function () {
2643          const seen = {};
2644          Array.from(document.querySelectorAll('#examples video')).forEach(function (v) {
2645            const k = parseInt(v.getAttribute('data-val'), 10);
2646            const primary = !seen[k];
2647            seen[k] = true;
2648            const active = on && k === i && primary;
2649            window.ClipchatMedia.watch(v, { src: v.getAttribute('data-src'), play: active, audible: active });
2650          });
2651        };
2652        apply();
2653        setTimeout(apply, 0);
2654        setTimeout(apply, 120);
2655      },
2656      igNick1: n1, igUrl1: (p.link1 || (n1 === 'sveta.v.reels' ? 'https://www.instagram.com/sveta.v.reels?igsh=cnR4YnY1ZWxrOGtv' : 'https://instagram.com/' + n1)),
2657      igNick2: n2, igUrl2: 'https://instagram.com/' + n2,
2658      igNick3: n3, igUrl3: 'https://www.instagram.com/reel/Db2ZH6Mxfk-/',
2659      igNick4: n4, igUrl4: 'https://www.instagram.com/irina.pavlowa/',
2660      onFile: function (e) {
2661        if (e.currentTarget) { e.currentTarget.value = ''; }
2662      },
2663      swipeDown: function (e) {
2664        self._sw = { x: e.clientX, t: Date.now() };
2665        self._paused = true;
2666        self.setState({ dragging: true, dragX: 0 });
2667      },
2668      swipeMove: function (e) {
2669        if (!self._sw) { return; }
2670        const dx = e.clientX - self._sw.x;
2671        self.setState({ dragX: Math.max(-170, Math.min(170, dx)) });
2672      },
2673      swipeUp: function (e) {
2674        if (!self._sw) { return; }
2675        const dx = e.clientX - self._sw.x;
2676        const dt = Date.now() - self._sw.t;
2677        self._sw = null;
2678        const v = Math.abs(dx) / Math.max(1, dt);
2679        if (Math.abs(dx) < 24) { self.setState({ dragging: false, dragX: 0 }); return; }
2680        const jump = (v > 0.9 || Math.abs(dx) > 96) ? (Math.abs(dx) > 150 ? 2 : 1) : 1;
2681        const cur = (self.state || {}).slide || 0;
2682        const next = ((cur + (dx < 0 ? jump : -jump)) % CARD_COUNT + CARD_COUNT) % CARD_COUNT;
2683        if (navigator.vibrate) { navigator.vibrate(8); }
2684        self.setState({ slide: next, dragging: false, dragX: 0 });
2685      },
2686      dzBusy: demo === 'listening',
2687      dzIcon: demo === 'listening' ? '' : (demo === 'split' ? '✓' : (demo === 'error' ? '!' : '↑')),
2688      dzIconSt: 'flex-shrink:0;width:42px;height:42px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:17px;font-weight:700;transition:background .25s ease,box-shadow .25s ease;'
2689        + (demo === 'listening'
2690          ? 'background:rgba(24,7,6,0.2);border:2.5px solid rgba(24,7,6,0.3);border-top-color:#180706;animation:ring .8s linear infinite;box-sizing:border-box'
2691          : (demo === 'error'
2692            ? 'background:transparent;border:2px solid #180706;color:#180706'
2693            : 'background:#180706;color:#FFD9D2;box-shadow:inset 0 1px 0 rgba(255,255,255,0.14)')),
2694      dzBtnLabel: demo === 'listening'
2695        ? ((window.T5&&window.T5['m184']||"Читаю трек… ") + (s.pct || 0) + '%')
2696        : (demo === 'split' ? (window.T5&&window.T5['m185']||"План сцен готов") : (demo === 'error' ? (window.T5&&window.T5['m186']||"Не удалось прочитать") : (window.T5&&window.T5['m187']||"Create a clip"))),
2697      dzHint: demo === 'listening'
2698        ? (window.T5&&window.T5['m188']||"не закрывай страницу")
2699        : (demo === 'split' ? (window.T5&&window.T5['m189']||"посмотреть раскадровку ↓") : (demo === 'error' ? (window.T5&&window.T5['m190']||"нажми, чтобы повторить") : (window.T5&&window.T5['m191']||"ИИ слушает и снимает"))),
2700      dzHintSt: "font-family:'Space Mono',monospace;font-weight:700;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:rgba(255,255,255,0.9)",
2701      startDemo: function () {
2702        if (navigator.vibrate) { navigator.vibrate(10); }
2703        window.ClipChatPrimaryCta();
2704      },
2705      menuIcon: menuOpen ? '✕' : '☰',
2706      menuOverlayCls: menuOpen ? '' : 'is-hidden',
2707      toggleMenu: function () { self.setState({ menuOpen: !((self.state || {}).menuOpen) }); },
2708      startDemoAndClose: function () {
2709        if (navigator.vibrate) { navigator.vibrate(10); }
2710        self.setState({ menuOpen: false });
2711        window.ClipChatPrimaryCta();
2712      },
2713      a0st: f[0].st, f0sym: f[0].sym, f0symSt: f[0].symSt,
2714      a1st: f[1].st, f1sym: f[1].sym, f1symSt: f[1].symSt,
2715      a2st: f[2].st, f2sym: f[2].sym, f2symSt: f[2].symSt,
2716      a3st: f[3].st, f3sym: f[3].sym, f3symSt: f[3].symSt,
2717      a4st: f[4].st, f4sym: f[4].sym, f4symSt: f[4].symSt,
2718      a5st: f[5].st, f5sym: f[5].sym, f5symSt: f[5].symSt,
2719      a6st: f[6].st, f6sym: f[6].sym, f6symSt: f[6].symSt,
2720      faqTap: function (e) {
2721        const v = parseInt(e.currentTarget.getAttribute('data-val'), 10);
2722        if (navigator.vibrate) { navigator.vibrate(6); }
2723        const cur = (self.state || {}).faq;
2724        self.setState({ faq: cur === v ? -1 : v });
2725      }
2726    };
2727  }
2728}
2729</script>
2729
2730
2731<noscript><img height="1" width="1" style="display:none"
2732src="https://www.facebook.com/tr?id=1060257096470271&ev=PageView&noscript=1"
2733/></noscript>
2734
2735<noscript><div><img src="https://mc.yandex.ru/watch/111369311" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
2736
2737<script>window.dtamAuthSuccessUrl = '/create/clipboard';</script>
2737
2738
2739<div class="dtam-overlay" id="dtamAuthOverlay" role="dialog" aria-modal="true" aria-labelledby="dtamAuthTitle" onclick="if(event.target===this)dtamCloseAuth()">
2740  <div class="dtam-card">
2741    <button class="dtam-close" aria-label="Close" onclick="dtamCloseAuth()">✕</button>
2742
2743    <div class="paywall-lock-icon">
2744      <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="rgba(255,255,255,0.5)" stroke-width="2">
2745        <rect x="3" y="11" width="18" height="11" rx="2" ry="2"/>
2746        <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
2747      </svg>
2748    </div>
2749
2750    <!-- Step 1: Email -->
2751    <div class="auth-step active" id="authStepEmail">
2752      <div class="paywall-title" id="dtamAuthTitle">Welcome to ClipChat</div>
2753      <div class="paywall-subtitle">Enter your email to start your first clip.</div>
2754      <form class="auth-form" id="authEmailForm" onsubmit="return authSubmitEmail(event)" autocomplete="on">
2755        <input type="email" class="auth-input" id="authEmailInput" name="email" placeholder="Email" autocomplete="username email" required />
2756        <button type="submit" class="pw-btn pw-btn-primary" id="authEmailBtn">
2757          Continue
2758        </button>
2759      </form>
2760      <div class="pw-error" id="authError"></div>
2761    </div>
2762
2763    <!-- Step 2a: Create password (new user) -->
2764    <div class="auth-step" id="authStepCreate">
2765      <div class="auth-create-box">
2766        <div class="auth-create-icon">
2767          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#4ade80" stroke-width="2.5"><polyline points="20 6 9 17 4 12"/></svg>
2768        </div>
2769        <div class="paywall-title" style="font-size:17px;margin-bottom:4px">Create a password to finish</div>
2770        <div class="paywall-subtitle" style="margin-bottom:0">One step away from watching</div>
2771      </div>
2772      <div class="auth-email-header">
2773        <button type="button" class="auth-back-btn" onclick="authGoBack()">
2774          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="15 18 9 12 15 6"/></svg>
2775        </button>
2776        <span id="authDisplayEmail1"></span>
2777      </div>
2778      <form class="auth-form" id="authCreateForm" onsubmit="return authSubmitCreate(event)" autocomplete="on">
2779        <input type="email" name="email" autocomplete="username email" value="" readonly style="display:none" aria-hidden="true" tabindex="-1" />
2780        <div class="auth-password-wrap">
2781          <input type="password" class="auth-input" id="authCreatePassword" name="password" placeholder="Password" autocomplete="new-password" required minlength="6" />
2782          <button type="button" class="auth-eye-btn" onclick="authToggleEye(this)">
2783            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
2784          </button>
2785        </div>
2786        <div class="auth-hint">At least 6 characters</div>
2787        <button type="submit" class="pw-btn pw-btn-primary" id="authCreateBtn">
2788          Create Account
2789        </button>
2790      </form>
2791      <div class="pw-error" id="authCreateError"></div>
2792    </div>
2793
2794    <!-- Step 2b: Login password (existing user) -->
2795    <div class="auth-step" id="authStepLogin">
2796      <div class="paywall-title">Welcome back!</div>
2797      <div class="paywall-subtitle">Enter your password to continue</div>
2798      <div class="auth-email-header">
2799        <button type="button" class="auth-back-btn" onclick="authGoBack()">
2800          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="15 18 9 12 15 6"/></svg>
2801        </button>
2802        <span id="authDisplayEmail2"></span>
2803      </div>
2804      <form class="auth-form" id="authLoginForm" onsubmit="return authSubmitLogin(event)" autocomplete="on">
2805        <input type="email" name="email" autocomplete="username email" value="" readonly style="display:none" aria-hidden="true" tabindex="-1" />
2806        <div class="auth-password-wrap">
2807          <input type="password" class="auth-input" id="authLoginPassword" name="password" placeholder="Password" autocomplete="current-password" required />
2808          <button type="button" class="auth-eye-btn" onclick="authToggleEye(this)">
2809            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
2810          </button>
2811        </div>
2812        <div class="auth-forgot-link">
2813          <a onclick="authShowForgot()">Forgot password?</a>
2814        </div>
2815        <button type="submit" class="pw-btn pw-btn-primary" id="authLoginBtn">
2816          Log In
2817        </button>
2818      </form>
2819      <div class="pw-error" id="authLoginError"></div>
2820    </div>
2821
2822    <!-- Step 3: Forgot password -->
2823    <div class="auth-step" id="authStepForgot">
2824      <div class="paywall-title">Reset Password</div>
2825      <div class="auth-email-header">
2826        <button type="button" class="auth-back-btn" onclick="authGoBack()">
2827          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="15 18 9 12 15 6"/></svg>
2828        </button>
2829        <span id="authDisplayEmail3"></span>
2830      </div>
2831      <div id="authResetForm">
2832        <div class="paywall-subtitle" style="margin-bottom:14px">We will send a password reset link to your email</div>
2833        <button class="pw-btn pw-btn-primary" id="authResetBtn" onclick="authResetPassword()">
2834          Send Reset Link
2835        </button>
2836      </div>
2837      <div class="auth-success-msg" id="authResetSent" style="display:none">
2838        A password reset link has been sent to your email
2839      </div>
2840      <div class="pw-error" id="authForgotError"></div>
2841    </div>
2842
2843    <!-- OAuth divider + buttons -->
2844    <div class="auth-divider" id="authDivider">
2845      <span>or</span>
2846    </div>
2847    <div class="auth-oauth" id="authOAuth">
2848      <button class="auth-oauth-btn" onclick="authGoogle()">
2849        <svg width="18" height="18" viewBox="0 0 24 24"><path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4"/><path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/><path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/><path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/></svg>
2850        Continue with Google
2851      </button>
2852    </div>
2853  </div>
2854</div>
2855
2856<script>
2857(function() {
2858  // Default redirect target — pages can override via window.dtamAuthSuccessUrl
2859  if (!window.dtamAuthSuccessUrl) window.dtamAuthSuccessUrl = '/create/dashboard';
2860
2861  var T = {
2862    loading:         'Loading...',
2863    networkError:    'Network error. Please try again.',
2864    authEmailError:  'Please enter a valid email address',
2865    authLoginFailed: 'Invalid email or password',
2866    authPasswordMin: 'At least 6 characters',
2867    authEmailTaken:  'An account with this email already exists'
2868  };
2869
2870  var _authEmail = '';
2871
2872  // --- Modal open/close ---
2873  window.dtamOpenAuth = function() {
2874    var o = document.getElementById('dtamAuthOverlay');
2875    if (!o) return;
2876    o.classList.add('open');
2877    document.body.style.overflow = 'hidden';
2878    // Reset to step 1
2879    authShowStep('authStepEmail');
2880    var inp = document.getElementById('authEmailInput');
2881    if (inp) setTimeout(function(){ inp.focus(); }, 120);
2882  };
2883  window.dtamCloseAuth = function() {
2884    var o = document.getElementById('dtamAuthOverlay');
2885    if (!o) return;
2886    o.classList.remove('open');
2887    document.body.style.overflow = '';
2888  };
2889
2890  // ESC to close
2891  document.addEventListener('keydown', function(e) {
2892    if (e.key === 'Escape') {
2893      var o = document.getElementById('dtamAuthOverlay');
2894      if (o && o.classList.contains('open')) dtamCloseAuth();
2895    }
2896  });
2897
2898  // --- Helpers ---
2899  function authShowStep(stepId) {
2900    document.querySelectorAll('.auth-step').forEach(function(s) { s.classList.remove('active'); });
2901    var t = document.getElementById(stepId);
2902    if (t) t.classList.add('active');
2903    ['authError','authCreateError','authLoginError','authForgotError'].forEach(function(id) {
2904      var el = document.getElementById(id);
2905      if (el) { el.textContent = ''; el.classList.remove('visible'); }
2906    });
2907  }
2908  function authShowError(id, msg) {
2909    var el = document.getElementById(id);
2910    if (el) { el.textContent = msg; el.classList.add('visible'); }
2911  }
2912  function authSetLoading(btnId, loading) {
2913    var btn = document.getElementById(btnId);
2914    if (!btn) return;
2915    btn.disabled = loading;
2916    if (loading) {
2917      btn._origText = btn.textContent;
2918      btn.innerHTML = '<span class="pw-spinner"></span> ' + T.loading;
2919    } else if (btn._origText) {
2920      btn.textContent = btn._origText;
2921    }
2922  }
2923  function authSaveToken(token) {
2924    try {
2925      localStorage.setItem('authToken', token);
2926      localStorage.setItem('token', token);
2927    } catch(e) {}
2928    document.cookie = 'auth_token=' + encodeURIComponent(token) + '; path=/; max-age=2592000; SameSite=Lax';
2929  }
2930  function authSuccess() {
2931    var hasCookie = document.cookie.indexOf('auth_token=') !== -1;
2932    if (!hasCookie) {
2933      var t = null;
2934      try { t = localStorage.getItem('authToken'); } catch(e) {}
2935      if (t) document.cookie = 'auth_token=' + t + '; path=/; max-age=2592000; SameSite=Lax';
2936    }
2937    var target = window.dtamAuthSuccessUrl || '/create/dashboard';
2938    setTimeout(function() { window.location.href = target; }, 100);
2939  }
2940
2941  // --- Step navigation ---
2942  window.authGoBack = function() {
2943    authShowStep('authStepEmail');
2944    var div = document.getElementById('authDivider');
2945    var oauth = document.getElementById('authOAuth');
2946    if (div) div.style.display = '';
2947    if (oauth) oauth.style.display = '';
2948  };
2949  window.authToggleEye = function(btn) {
2950    var wrap = btn.closest('.auth-password-wrap');
2951    var input = wrap ? wrap.querySelector('input') : null;
2952    if (!input) return;
2953    if (input.type === 'password') {
2954      input.type = 'text';
2955      btn.innerHTML = '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/></svg>';
2956    } else {
2957      input.type = 'password';
2958      btn.innerHTML = '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>';
2959    }
2960  };
2961
2962  // --- Step 1: email ---
2963  window.authSubmitEmail = function(e) {
2964    e.preventDefault();
2965    var input = document.getElementById('authEmailInput');
2966    var email = (input.value || '').trim().toLowerCase();
2967    if (!email || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
2968      authShowError('authError', T.authEmailError);
2969      return false;
2970    }
2971    _authEmail = email;
2972    authSetLoading('authEmailBtn', true);
2973
2974    fetch('/api/check-email', {
2975      method: 'POST',
2976      headers: { 'Content-Type': 'application/json' },
2977      body: JSON.stringify({ email: email })
2978    })
2979    .then(function(r) { return r.json(); })
2980    .then(function(data) {
2981      authSetLoading('authEmailBtn', false);
2982      ['authDisplayEmail1','authDisplayEmail2','authDisplayEmail3'].forEach(function(id) {
2983        var el = document.getElementById(id);
2984        if (el) el.textContent = _authEmail;
2985      });
2986      // Sync hidden email inputs in login/create forms for password-manager association
2987      ['authCreateForm','authLoginForm'].forEach(function(fid) {
2988        var f = document.getElementById(fid);
2989        if (!f) return;
2990        var hidden = f.querySelector('input[name="email"]');
2991        if (hidden) hidden.value = _authEmail;
2992      });
2993      if (data.exists) {
2994        authShowStep('authStepLogin');
2995        var pwInput = document.getElementById('authLoginPassword');
2996        if (pwInput) setTimeout(function() { pwInput.focus(); }, 100);
2997      } else {
2998        authShowStep('authStepCreate');
2999        var pwInput = document.getElementById('authCreatePassword');
3000        if (pwInput) setTimeout(function() { pwInput.focus(); }, 100);
3001      }
3002    })
3003    .catch(function() {
3004      authSetLoading('authEmailBtn', false);
3005      authShowError('authError', T.networkError);
3006    });
3007    return false;
3008  };
3009
3010  // --- Step 2a: create ---
3011  window.authSubmitCreate = function(e) {
3012    e.preventDefault();
3013    var pw = document.getElementById('authCreatePassword').value;
3014    if (!pw || pw.length < 6) {
3015      authShowError('authCreateError', T.authPasswordMin);
3016      return false;
3017    }
3018    authSetLoading('authCreateBtn', true);
3019    fetch('/signup', {
3020      method: 'POST',
3021      headers: { 'Content-Type': 'application/json' },
3022      credentials: 'include',
3023      body: JSON.stringify({
3024        name: 'User', email: _authEmail,
3025        password: pw, password_confirmation: pw,
3026        from_website: true
3027      })
3028    })
3029    .then(function(r) { return r.json(); })
3030    .then(function(data) {
3031      if (data.token) { authSaveToken(data.token); authSuccess(); }
3032      else {
3033        authSetLoading('authCreateBtn', false);
3034        // Detect common error types and show localized message
3035        var rawErr = (data.errors && data.errors.join(', ')) || data.error || '';
3036        var low = (rawErr || '').toLowerCase();
3037        var msg;
3038        if (low.indexOf('taken') >= 0 || low.indexOf('already') >= 0 || low.indexOf('exists') >= 0) {
3039          msg = T.authEmailTaken;
3040        } else if (low.indexOf('password') >= 0 && (low.indexOf('short') >= 0 || low.indexOf('min') >= 0)) {
3041          msg = T.authPasswordMin;
3042        } else if (rawErr) {
3043          // Only show raw backend msg if we have no better idea
3044          msg = rawErr;
3045        } else {
3046          msg = T.networkError;
3047        }
3048        authShowError('authCreateError', msg);
3049      }
3050    })
3051    .catch(function() {
3052      authSetLoading('authCreateBtn', false);
3053      authShowError('authCreateError', T.networkError);
3054    });
3055    return false;
3056  };
3057
3058  // --- Step 2b: login ---
3059  window.authSubmitLogin = function(e) {
3060    e.preventDefault();
3061    var pw = document.getElementById('authLoginPassword').value;
3062    if (!pw) { authShowError('authLoginError', T.authPasswordMin); return false; }
3063    authSetLoading('authLoginBtn', true);
3064    fetch('/login', {
3065      method: 'POST',
3066      headers: { 'Content-Type': 'application/json' },
3067      credentials: 'include',
3068      body: JSON.stringify({ email: _authEmail, password: pw, from_website: true })
3069    })
3070    .then(function(r) { return r.json(); })
3071    .then(function(data) {
3072      if (data.token) { authSaveToken(data.token); authSuccess(); }
3073      else {
3074        authSetLoading('authLoginBtn', false);
3075        // Use localized message instead of backend English text
3076        authShowError('authLoginError', T.authLoginFailed);
3077      }
3078    })
3079    .catch(function() {
3080      authSetLoading('authLoginBtn', false);
3081      authShowError('authLoginError', T.networkError);
3082    });
3083    return false;
3084  };
3085
3086  // --- Forgot password ---
3087  window.authShowForgot = function() {
3088    authShowStep('authStepForgot');
3089    document.getElementById('authResetForm').style.display = '';
3090    document.getElementById('authResetSent').style.display = 'none';
3091  };
3092  window.authResetPassword = function() {
3093    authSetLoading('authResetBtn', true);
3094    var gqlQuery = 'mutation($input: RequestPasswordResetInput!) { requestPasswordReset(input: $input) { success message } }';
3095    fetch('/graphql', {
3096      method: 'POST',
3097      headers: { 'Content-Type': 'application/json' },
3098      // locale выбирает язык письма на бэке (ClipChat/Show Must); doitong его игнорирует
3099      body: JSON.stringify({ query: gqlQuery, variables: { input: { email: _authEmail, locale: (document.documentElement.lang || 'en') } } })
3100    })
3101    .then(function(r) { return r.json(); })
3102    .then(function(data) {
3103      authSetLoading('authResetBtn', false);
3104      var result = data && data.data && data.data.requestPasswordReset;
3105      if (result && result.success) {
3106        document.getElementById('authResetForm').style.display = 'none';
3107        document.getElementById('authResetSent').style.display = '';
3108      } else {
3109        authShowError('authForgotError', (result && result.message) || T.networkError);
3110      }
3111    })
3112    .catch(function() {
3113      authSetLoading('authResetBtn', false);
3114      authShowError('authForgotError', T.networkError);
3115    });
3116  };
3117
3118  // --- OAuth ---
3119  window.authGoogle = function() {
3120    try { localStorage.setItem('return_url', window.dtamAuthSuccessUrl || window.location.pathname); } catch(e) {}
3121    var redirectUri = window.location.origin + '/auth/success';
3122    var state = encodeURIComponent(JSON.stringify({ redirect_uri: redirectUri, from_website: true }));
3123    window.location.href = '/auth/google_oauth2?state=' + state;
3124  };
3125  window.authFacebook = function() {
3126    try { localStorage.setItem('return_url', window.dtamAuthSuccessUrl || window.location.pathname); } catch(e) {}
3127    var redirectUri = window.location.origin + '/auth/success';
3128    var state = encodeURIComponent(JSON.stringify({ redirect_uri: redirectUri, from_website: true }));
3129    window.location.href = '/auth/facebook?state=' + state;
3130  };
3131
3132  // --- Intercept any element with data-open-auth to open the modal ---
3133  document.addEventListener('click', function(e) {
3134    var el = e.target.closest('[data-open-auth]');
3135    if (!el) return;
3136    e.preventDefault();
3137    dtamOpenAuth();
3138  });
3139})();
3140</script>
3140
3141
3142</body>
3143</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.