PageSourceSearch

https://bixa.ai/

html bixa.ai collected 2026-10-05 13:29:29 UTC 126,277 bytes, 2,257 lines download raw bytes

1<!doctype html>
2<html lang="fa" dir="rtl">
3<head>
4<meta charset="utf-8">
5<title>bixa — ورود به دنیای هوش مصنوعی</title>
6<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
7<meta name="description" content="با Claude Code نرم‌افزارِ واقعی بساز — و به کسب‌وکاری که به آن نیاز دارد بفروش.">
8<meta name="theme-color" content="#050507">
9<!-- ————— Open Graph / پیش‌نمایشِ لینک (تلگرام، شبکه‌ها) ————— -->
10<meta property="og:type" content="website">
11<meta property="og:site_name" content="bixa">
12<meta property="og:url" content="https://bixa.ai/">
13<meta property="og:title" content="اینجا هر ایده‌ای تبدیل به پول می‌شود">
14<meta property="og:description" content="بدونِ برنامه‌نویس‌بودن، با هوشِ مصنوعی نرم‌افزارِ واقعی بساز و به کسب‌وکارها بفروش.">
15<meta property="og:image" content="https://bixa.ai/og.png">
16<meta property="og:image:width" content="1200">
17<meta property="og:image:height" content="630">
18<meta property="og:image:alt" content="bixa — اینجا هر ایده‌ای تبدیل به پول می‌شود">
19<meta property="og:locale" content="fa_IR">
20<meta name="twitter:card" content="summary_large_image">
21<meta name="twitter:title" content="اینجا هر ایده‌ای تبدیل به پول می‌شود">
22<meta name="twitter:description" content="بدونِ برنامه‌نویس‌بودن، با هوشِ مصنوعی نرم‌افزارِ واقعی بساز و بفروش.">
23<meta name="twitter:image" content="https://bixa.ai/og.png">
24<link rel="icon" type="image/svg+xml" href="/favicon.svg">
25<link rel="preload" as="font" type="font/woff2" href="/fonts/plex-arabic-700-arabic.woff2" crossorigin>
26<link rel="preload" as="font" type="font/woff2" href="/fonts/plex-arabic-400-arabic.woff2" crossorigin>
27<style>
28/* ————— قلم‌ها: محلی و کنارِ خودِ سایت، بدونِ وابستگی به سرویسِ بیرونی —————
29   هر وزن دو فایل دارد: عربی/فارسی و لاتین؛ مرورگر فقط آن‌چه را لازم دارد می‌گیرد.
30   font-display:swap یعنی متن بی‌درنگ با قلمِ سیستم دیده می‌شود و بعد جا می‌افتد. */
31@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-arabic-400-arabic.woff2) format('woff2');unicode-range:U+0600-06FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FDFC-FDFD,U+FE70-FE74,U+FE76-FEFC}
32@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-arabic-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
33@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-arabic-500-arabic.woff2) format('woff2');unicode-range:U+0600-06FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FDFC-FDFD,U+FE70-FE74,U+FE76-FEFC}
34@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-arabic-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
35@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-arabic-600-arabic.woff2) format('woff2');unicode-range:U+0600-06FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FDFC-FDFD,U+FE70-FE74,U+FE76-FEFC}
36@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-arabic-600-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
37@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/plex-arabic-700-arabic.woff2) format('woff2');
37unicode-range:U+0600-06FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FDFC-FDFD,U+FE70-FE74,U+FE76-FEFC}
38@font-face{font-family:'IBM Plex Sans Arabic';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/plex-arabic-700-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
39/* Geist Mono فقط برای توکن‌های لاتین و زمان‌ها — یک فایلِ متغیر */
40@font-face{font-family:'Geist Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/geist-mono-var-latin.woff2) format('woff2');unicode-range:U+0020-007E,U+00A0,U+00B0,U+00D7,U+00F7,U+2013-2014,U+2018-2019,U+201C-201D,U+2026,U+200E-200F,U+2212}
41@font-face{font-family:'Geist Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/geist-mono-var-latin.woff2) format('woff2');unicode-range:U+0020-007E,U+00A0,U+00B0,U+00D7,U+00F7,U+2013-2014,U+2018-2019,U+201C-201D,U+2026,U+200E-200F,U+2212}
42</style>
43<style>
44  :root{
45    --void:#050507; --bg2:#08080D; --surface:#0C0C13; --surface2:#10101A;
46    --line:#1C1C26; --line2:#2A2A3A; --text:#F2F1F5; --mut:#9B99A8; --mut2:#6A6880;
47    --gold:#FFC24A;
48    --spec:linear-gradient(105deg,#FFC24A 0%,#FF2E9E 34%,#7C4DFF 66%,#27E0FF 100%);
49    --neon:conic-gradient(from 0deg,#7C4DFF,#B14DFF 14%,#FF2E9E 32%,#FF7A3C 50%,#FFC24A 62%,#FF2E9E 80%,#7C4DFF 100%);
50    --ease:cubic-bezier(0.16,1,0.3,1);
51    --ff-fa:'IBM Plex Sans Arabic',system-ui,-apple-system,'Segoe UI',Tahoma,'Noto Naskh Arabic',sans-serif;
52    --ff-mono:'Geist Mono',ui-monospace,'SF Mono',Menlo,monospace;
53  }
54  *{box-sizing:border-box;margin:0;padding:0}
55  html{overflow-x:clip;scrollbar-color:#2A2A3A var(--void);background:var(--void)}
56  html.lock{overflow:hidden}
57  body{
58    /* زمینه‌ی صریح روی html است؛ body شفاف تا آسمانِ z:-1 دیده شود */
59    background:transparent;color:var(--text);
60    font-family:var(--ff-fa);font-size:16.5px;line-height:1.85;
61    -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
62    overflow-x:clip;
63  }
64  ::selection{background:rgba(255,194,74,0.28);color:#fff}
65  :focus-visible{outline:2px solid var(--gold);outline-offset:3px;border-radius:4px}
66  button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
67  a{color:inherit;text-decoration:none}
68  svg{display:block}
69  img{max-width:100%}
70  .ltr{direction:ltr;unicode-bidi:isolate;display:inline-block}
71  .mono{font-family:var(--ff-mono);letter-spacing:0.02em}
72
73  /* ————————————————— سفرِ رنگی — آسمانِ پس‌زمینه ————————————————— */
74  .sky{position:fixed;inset:0;z-index:-1;pointer-events:none}
75  .sky i{position:absolute;inset:0;opacity:0;will-change:opacity}
76  .sky .w1{background:radial-gradient(120% 90% at 50% 18%,#101A3C 0%,#080C1A 58%,#05060C 100%)}
77  .sky .w2{background:radial-gradient(120% 95% at 32% 26%,#191347 0%,#0C0A26 55%,#070614 100%)}
78  .sky .w3{background:radial-gradient(120% 95% at 68% 26%,#29134F 0%,#150C2E 55%,#090716 100%)}
79  .sky .w4{background:
80    radial-gradient(78% 55% at 50% 88%,rgba(255,132,60,0.1),transparent 62%),
81    radial-gradient(120% 95% at 50% 22%,#2E1436 0%,#180D1E 55%,#0D0812 100%)}
82  .sky .w5{background:radial-gradient(120% 100% at 50% 0%,#281608 0%,#170E06 55%,#0B0805 100%)}
83  .sky .w6{background:
84    radial-gradient(70% 55% at 50% 28%,rgba(126,80,255,0.21),transparent 60%),
85    radial-gradient(50% 45% at 80% 76%,rgba(255,52,160,0.12),transparent 62%),
86    linear-gradient(#110A20,#080610)}
87  .sky .w7{background:
88    radial-gradient(88% 66% at 50% 76%,rgba(255,196,116,0.16),rgba(255,160,80,0.04) 52%,transparent 68%),
89    radial-gradient(130% 105% at 50% 32%,#3A250E 0%,#221609 54%,#120C06 100%)}
90
91  /* ————————————————— نوارِ بالا ————————————————— */
92  .topbar{
93    position:fixed;inset-inline:0;top:0;z-index:80;
94    display:flex;align-items:center;justify-content:space-between;gap:16px;
95    padding:12px clamp(16px,4vw,40px);
96    transform:translateY(-110%);
97    transition:transform .6s var(--ease),background .4s,border-color .4s;
98    background:rgba(5,5,7,0.55);
99    backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
100    border-bottom:1px solid rgba(28,28,38,0.7);
101  }
102  .topbar.show{transform:none}
103  .topbar::before{
104    content:"";position:absolute;inset:0 0 -30px;pointer-events:none;z-index:-1;
105    background:linear-gradient(to bottom,rgba(5,5,7,0.92),rgba(5,5,7,0.5) 62%,transparent);
106    opacity:0;transition:opacity .5s ease;
107  }
108  .topbar.scrolled::before{opacity:1}
109  .tb-brand svg{height:22px;width:auto;color:var(--text)}
110  .tb-links{display:flex;align-items:center;gap:clamp(12px,2.4vw,22px)}
111  .tb-login{font-size:13.5px;color:var(--mut);transition:color .3s}
112  .tb-login:hover{color:var(--text)}
113  /* دکمه‌ی همیشه‌حاضرِ نوارِ بالا — کوچک، توپُر، طلایی؛ همان دعوتِ هیرو در اندازه‌ی جمع‌وجور */
114  .tb-start{
115    display:inline-flex;align-items:center;justify-content:center;
116    min-height:36px;font-size:13px;font-weight:700;padding:7px 18px;border-radius:999px;
117    background:var(--gold);color:#0B0A07;border:1px solid var(--gold);white-space:nowrap;
118    box-shadow:inset 0 1px 0 rgba(255,255,255,0.35),0 8px 24px -8px rgba(255,194,74,0.6);
119    transition:filter .3s,box-shadow .3s,transform .3s var(--ease);
120  }
121  .tb-start:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:inset 0 1px 0 rgba(255,255,255,0.4),0 12px 30px -8px rgba(255,194,74,0.75)}
122  .tb-start:active{transform:scale(0.98)}
123
124  /* ————————————————— hero + intro ————————————————— */
125  .hero{
126    /* min-height به‌جای height: روی گوشی‌های کوتاه، وعده و دکمه زیرِ نشانه‌ی اسکرول له نمی‌شوند */
127    position:relative;min-height:100vh;min-height:100svh;
128    display:flex;align-items:center;justify-content:center;
129    padding:calc(64px + env(safe-area-inset-top)) clamp(16px,4vw,40px) calc(96px + env(safe-area-inset-bottom));
130  }
131  .wm-wrap{
132    position:relative;display:flex;flex-direction:column;align-items:center;
133    gap:clamp(26px,4.5vh,44px);will-change:transform,opacity;
134  }
135  .wm{
136    /* کمی جمع‌تر از قبل، تا وعده و دکمه کنارِ لوگو در یک صفحه‌نمایشِ دسکتاپ جا شوند */
137    width:min(82vw,540px);height:auto;overflow:visible;
138    transform:translateX(34%) scale(1.3);
139    transform-origin:16% 51%;
140    will-change:transform;
141  }
142  #wmMain .st{stroke-dasharray:1;stroke-dashoffset:1;opacity:0}
142
143  #wmDot{opacity:0}
144  #wmGlow{opacity:0}
145  #wmSpec{opacity:0}
146  #wmSweep{opacity:0}
147  .wm-say{
148    max-width:min(760px,88vw);text-align:center;opacity:0;
149    display:flex;flex-direction:column;align-items:center;gap:12px;will-change:opacity,transform;
150  }
151  /* وعده‌ی اصلی بزرگ‌ترین متنِ صفحه‌ی اول است — بزرگ‌تر از هر تیترِ دیگری در صفحه */
152  .wm-say h1{
153    font-family:var(--ff-fa);font-size:clamp(26px,7vw,46px);font-weight:700;
154    line-height:1.6;color:var(--text);margin:0;text-wrap:balance;
155  }
156  .wm-say p{
157    font-family:var(--ff-fa);font-size:clamp(14px,1.7vw,16px);line-height:2;
158    color:var(--mut);margin:0;text-wrap:pretty;max-width:46ch;
159  }
160  /* تنها دعوتِ صفحه‌ی اول: توپُر، طلایی، به اندازه‌ی انگشت */
161  .hero-cta{
162    position:relative;display:inline-flex;align-items:center;justify-content:center;gap:10px;
163    margin-top:clamp(10px,1.8vh,20px);min-height:52px;padding:14px 38px;border-radius:999px;
164    font-size:16.5px;font-weight:700;color:#0B0A07;background:var(--gold);
165    box-shadow:inset 0 1px 0 rgba(255,255,255,0.4),0 14px 40px -10px rgba(255,194,74,0.75),0 0 0 1px rgba(255,194,74,0.5);
166    transition:transform .35s var(--ease),box-shadow .35s,filter .3s;
167    -webkit-tap-highlight-color:transparent;
168  }
169  .hero-cta:hover{transform:translateY(-1px);filter:brightness(1.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.45),0 18px 48px -10px rgba(255,194,74,0.9),0 0 0 1px rgba(255,194,74,0.6)}
170  .hero-cta:active{transform:scale(0.98)}
171  .hero-cta svg{width:16px;height:16px;flex:none;transition:transform .4s var(--ease)}
172  .hero-cta:hover svg{transform:translateX(-4px)}
173  @media(max-width:767px){
174    .wm{width:min(72vw,620px)}
175    .hero-cta{width:min(100%,340px)}
176  }
177  html.intro-done .wm-say{opacity:1}
178  .wm-cap{
179    font-family:var(--ff-mono);font-weight:500;font-size:clamp(10px,1.3vw,12.5px);
180    letter-spacing:0.52em;text-indent:0.52em;color:var(--mut);
181    direction:ltr;opacity:0;will-change:opacity,transform;
182  }
183  #heroFlash{
184    position:absolute;inset:0;pointer-events:none;opacity:0;
185    background:radial-gradient(42% 38% at 50% 46%,rgba(255,255,255,0.34),rgba(170,120,255,0.10) 48%,transparent 74%);
186  }
187  .scroll-cue{
188    position:absolute;bottom:max(26px,env(safe-area-inset-bottom));inset-inline-start:50%;
189    transform:translateX(50%);
190    display:flex;flex-direction:column;align-items:center;gap:12px;opacity:0;
191  }
192  .scroll-cue span{font-size:13px;color:var(--mut);letter-spacing:0}
193  .scroll-cue i{
194    width:1px;height:44px;border-radius:1px;overflow:hidden;position:relative;
195    background:rgba(242,241,245,0.10);
196  }
197  .scroll-cue i::after{
198    content:"";position:absolute;inset-inline:0;top:-100%;height:100%;
199    background:linear-gradient(to bottom,transparent,rgba(242,241,245,0.75));
200    animation:cueDrop 2.2s cubic-bezier(0.6,0,0.3,1) infinite;
201  }
202  @keyframes cueDrop{0%{top:-100%}55%,100%{top:100%}}
203
204  html.intro-done .wm{transform:none}
205  html.intro-done #wmMain .st{stroke-dasharray:none;stroke-dashoffset:0;opacity:1}
206  html.intro-done #wmDot{opacity:1}
207  html.intro-done #wmGlow,html.intro-done #wmSpec,html.intro-done #wmSweep{opacity:0}
208  html.intro-done .wm-cap{opacity:1}
209  html.intro-done .scroll-cue{opacity:0.85}
210  html.revisit .wm-wrap{animation:softIn 0.85s var(--ease) both}
211  @keyframes softIn{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
212
213  /* ————————————————— داستان + مسیر ————————————————— */
214  .story{position:relative}
215  .trail{
216    position:absolute;inset:0;z-index:0;pointer-events:none;
217  }
218  @media(max-width:767px){
219    /* ایستگاه‌ها روی موبایل به لبه‌ها می‌روند تا از متن فاصله بگیرند */
220    .trail{transform:scaleX(1.32);transform-origin:50% 50%}
221    .trail .tnode{transform:scaleX(0.758)}
222    .trail .tnode.on{transform:scaleX(0.758) scale(1.25)}
223    .trail .thead{transform:scaleX(0.758)}
224  }
225  .trail svg{position:absolute;inset:0;width:100%;height:100%}
226  #trailBase{stroke:rgba(242,241,245,0.07)}
227  #trailDraw{stroke:rgba(255,194,74,0.72)}
228  .thead{
229    position:absolute;width:10px;height:10px;margin:-5px 0 0 -5px;
230    border-radius:50%;background:#FFE1A8;opacity:0;
231    box-shadow:0 0 14px 4px rgba(255,194,74,0.55),0 0 42px 12px rgba(255,150,80,0.25);
232    will-change:left,top,opacity;pointer-events:none;
233  }
234  .tnode{
235    position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;
236    border:1.5px solid rgba(242,241,245,0.22);background:var(--void);
237    transition:border-color .6s,box-shadow .6s,background .6s,transform .6s var(--ease);
238  }
239  .tnode::after{
240    content:"";position:absolute;inset:3px;border-radius:50%;
241    background:transparent;transition:background .6s;
242  }
243  .tnode.on{border-color:rgba(255,194,74,0.85);transform:scale(1.25);
244    box-shadow:0 0 18px rgba(255,194,74,0.4)}
245  .tnode.on::after{background:var(--gold)}
246  .tnode::before{
247    content:"";position:absolute;inset:-3px;border-radius:50%;pointer-events:none;
248    border:1.5px solid rgba(255,194,74,0);opacity:0;
249  }
250  .tnode.on::before{animation:nodeRip 1s var(--ease) both}
251  @keyframes nodeRip{
252    0%{transform:scale(0.55);border-color:rgba(255,194,74,0.75);opacity:1}
253    100%{transform:scale(2.7);border-color:rgba(255,194,74,0);opacity:0}
254  }
255
256  .ch{height:calc(var(--chn,2.5)*100vh);height:calc(var(--chn,2.5)*100svh);position:relative;z-index:1}
257  .ch-pin{
258    position:sticky;top:0;height:100vh;height:100svh;
259    display:flex;align-items:center;justify-content:center;overflow:hidden;
260  }
261  .ch-num{
262    position:absolute;top:50%;inset-inline-start:50%;
263    transform:translate(50%,-50%);
264    font-weight:700;font-size:clamp(190px,42vw,420px);line-height:1;
265    color:rgba(242,241,245,0.05);opacity:0;pointer-events:none;user-select:none;
266    will-change:transform,opacity;font-variant-numeric:tabular-nums;
267  }
268  .ch-inner{
269    position:relative;max-width:880px;padding-inline:clamp(22px,6vw,56px);
270    display:flex;flex-direction:column;align-items:center;gap:clamp(12px,2.2vh,22px);
271    text-align:center;will-change:transform,filter;
272  }
273  .scene{
274    width:min(430px,80vw);height:auto;overflow:visible;
275    margin-bottom:clamp(4px,1.4vh,14px);
276    will-change:transform,opacity;
277  }
278  .scene [data-fx="draw"]{stroke-dasharray:1;stroke-dashoffset:1;opacity:0}
278
279  @media(max-width:767px){
280    .scene{width:min(340px,74vw);margin-inline-start:clamp(20px,9vw,44px)}
281  }
282  .scene [data-fx="pop"]{opacity:0;transform-box:fill-box;transform-origin:center}
283  .ch-tag{
284    display:inline-flex;align-items:center;justify-content:center;gap:12px;
285    font-size:13px;font-weight:500;letter-spacing:0;color:var(--mut);
286    opacity:0;will-change:opacity,transform;
287  }
288  .ch-tag i{width:20px;height:1.5px;background:var(--gold);border-radius:1px;opacity:0.85;flex:none}
289  .ch-l{
290    font-size:clamp(25px,5.1vw,49px);font-weight:700;line-height:1.72;
291    letter-spacing:0;text-wrap:balance;color:#D9D7E2;
292    opacity:0;will-change:opacity,transform,filter;
293  }
294  .ch-l.l2{font-weight:700;color:var(--text)}
295  /* line-mask word reveal (spans built by JS; padding keeps Persian ascenders/descenders unclipped) */
296  .ch-l .w{
297    display:inline-block;overflow:hidden;vertical-align:bottom;
298    padding:0.26em 0.11em 0.18em;margin:-0.26em -0.11em -0.18em;
299  }
300  .ch-l .wi{display:inline-block;transform:translateY(132%);will-change:transform}
301  .ch .brand{font-family:var(--ff-mono);font-weight:500;font-size:0.86em;letter-spacing:0.01em}
302
303  /* ————————————————— proof ————————————————— */
304  .proof{position:relative;z-index:1;padding:clamp(90px,14vh,160px) 0 clamp(40px,7vh,90px)}
305  .wrap{max-width:1180px;margin-inline:auto;padding-inline:clamp(20px,5vw,56px)}
306  .kicker{
307    display:inline-flex;align-items:center;gap:12px;
308    font-size:13px;font-weight:500;letter-spacing:0;color:var(--mut);
309  }
310  .kicker::before{content:"";width:20px;height:1.5px;background:var(--gold);border-radius:1px;opacity:0.85}
311  .proof-head{text-align:center;max-width:760px;margin-inline:auto;margin-bottom:clamp(56px,9vh,110px)}
312  .proof-head .kicker{justify-content:center}
313  .proof-head h2{
314    font-size:clamp(27px,4.6vw,46px);font-weight:700;line-height:1.6;
315    letter-spacing:0;margin-top:16px;text-wrap:balance;
316  }
317  .proof-head p{color:var(--mut);margin-top:14px;font-size:clamp(15px,1.6vw,17.5px)}
318
319  .pr{
320    display:grid;grid-template-columns:1.05fr 0.95fr;gap:clamp(30px,5vw,72px);
321    align-items:center;padding-block:clamp(46px,8vh,92px);
322    border-top:1px solid rgba(242,241,245,0.07);
323  }
324  .pr:nth-child(odd of .pr) .pr-vis{order:-1}
325  @media(max-width:880px){
326    .pr{grid-template-columns:1fr;gap:34px}
327    .pr:nth-child(odd of .pr) .pr-vis{order:0}
328  }
329  .pr-idx{font-family:var(--ff-fa);font-size:13px;letter-spacing:0;color:var(--mut)}
330  .pr-text h3{
331    font-size:clamp(24px,3.4vw,34px);font-weight:700;letter-spacing:0;
332    margin-top:10px;display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;line-height:1.5;
333  }
334  .pr-dom{
335    font-family:var(--ff-mono);font-size:13px;font-weight:400;color:var(--mut);
336    letter-spacing:0.04em;direction:ltr;unicode-bidi:isolate;
337    border-bottom:1px solid var(--line2);padding-bottom:2px;transition:color .3s,border-color .3s;
338  }
339  .pr-dom:hover{color:var(--text);border-color:var(--mut2)}
340  .pr-text > p{color:var(--mut);font-size:clamp(15px,1.7vw,17.5px);margin-top:10px;max-width:52ch}
341  .stats{
342    display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,2vw,26px);
343    margin-top:clamp(24px,3.6vh,38px);
344  }
345  @media(max-width:520px){.stats{grid-template-columns:1fr;gap:0}}
346  .stat{border-top:1px solid var(--line2);padding-top:14px}
347  @media(max-width:520px){.stat{padding-block:14px;border-top:1px solid var(--line)} .stat:first-child{border-top-color:var(--line2)}}
348  .stat b{
349    display:block;font-size:clamp(20px,2.3vw,25px);font-weight:700;line-height:1.4;
350    letter-spacing:0;font-variant-numeric:tabular-nums;white-space:nowrap;
351  }
352  .stat b small{font-size:0.65em;font-weight:600;color:#C9C7D4}
353  .stat > span{display:block;color:var(--mut);font-size:13px;line-height:1.9;margin-top:4px}
354  .stat b span{display:inline;color:inherit;font-size:inherit;line-height:inherit;margin:0}
355  .pr-foot{display:block;margin-top:18px;font-size:13px;color:var(--mut)}
356  .pr-lesson{
357    margin-top:clamp(24px,3.6vh,38px);padding:22px 26px;
358    border-inline-start:2px solid var(--gold);
359    background:linear-gradient(105deg,rgba(255,194,74,0.05),transparent 70%);
360    border-radius:0 14px 14px 0;
361    font-size:clamp(16px,1.9vw,19px);font-weight:700;line-height:2;
362  }
363  .pr-vis{position:relative}
364  .pr-frame{
365    position:relative;border:1px solid rgba(242,241,245,0.09);border-radius:20px;overflow:hidden;
366    background:radial-gradient(90% 90% at 50% 20%,rgba(11,11,18,0.82) 0%,rgba(7,7,12,0.82) 78%);
367    aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;
368    will-change:transform;
369  }
370  .pr-frame::after{
371    content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
372    box-shadow:inset 0 1px 0 rgba(255,255,255,0.05);
373  }
374  .pr-frame svg{width:78%;height:auto}
375  .pr-frame svg text{direction:ltr}
376  @keyframes liveP{0%,100%{opacity:0.5}50%{opacity:1}}
377  .dial-hand{transform-box:view-box;transform-origin:150px 110px;animation:dial 30s linear infinite}
378  @keyframes dial{to{transform:rotate(360deg)}}
379  #tikPath{stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset 2.2s cubic-bezier(0.5,0,0.2,1) 0.35s}
380  .in #tikPath{stroke-dashoffset:0}
381
382  /* reveals */
383  .rv{opacity:0;transform:translateY(34px);transition:opacity .95s var(--ease),transform .95s var(--ease);transition-delay:var(--d,0s)}
384  .in .rv,.in.rv{opacity:1;transform:none}
385
386  /* ————————————————— بخشِ دستیار — کارتِ باز‌شونده ————————————————— */
387  .ask{position:relative;z-index:1;padding:clamp(90px,14vh,170px) 0;border-top:1px solid rgba(242,241,245,0.06)}
388  .ask-head{text-align:center;max-width:680px;margin-inline:auto;margin-bottom:clamp(36px,6vh,64px)}
389  .ask-head .kicker{justify-content:center}
390  .ask-head h2{
391    font-size:clamp(26px,4.4vw,44px);font-weight:700;line-height:1.6;
392    letter-spacing:0;margin-top:16px;text-wrap:balance;
393  }
394  .ai-card{
395    position:relative;max-width:720px;margin-inline:auto;
396    border-radius:28px;padding:clamp(20px,3.4vw,30px);
397    background:rgba(10,10,16,0.72);
398    border:1px solid rgba(242,241,245,0.1);
399    box-shadow:inset 0 1px 0 rgba(255,255,255,0.06),0 30px 90px rgba(0,0,0,0.5);
400    backdrop-filter:blur(18px) saturate(160%);-webkit-backdrop-filter:blur(18px) saturate(160%);
401    transition:box-shadow .8s var(--ease),border-color .8s;
402  }
403  .ai-card.open{
404    border-color:rgba(242,241,245,0.14);
405    box-shadow:inset 0 1px 0 rgba(255,255,255,0.08),0 44px 130px rgba(0,0,0,0.65),0 0 80px rgba(124,77,255,0.07);
406  }
407  .ai-pitch{
408    display:grid;grid-template-rows:1fr;
409    transition:grid-template-rows .75s var(--ease),opacity .45s ease;
410    cursor:pointer;
411  }
412  .ai-card.open .ai-pitch{grid-template-rows:0fr;opacity:0;pointer-events:none}
413  .ai-pitch > div{overflow:hidden;min-height:0}
414  .ai-pitch .inner{
415    display:flex;flex-direction:column;align-items:center;text-align:center;
416    gap:10px;padding:clamp(14px,3vh,28px) 8px clamp(22px,3.6vh,34px);
417  }
418  .ai-b{position:relative;width:40px;margin-bottom:6px}
419  .ai-b svg{width:100%;height:auto;color:var(--text)}
420  .ai-b .halo{position:absolute;inset:-40%;filter:blur(14px);opacity:0.5}
421  .ai-pitch h3{font-size:clamp(20px,2.8vw,26px);font-weight:700;line-height:1.6;text-wrap:balance}
422  .ai-pitch p{color:var(--mut);font-size:clamp(15px,1.6vw,15.5px);max-width:44ch;text-wrap:pretty}
423  .ai-pitch .hint{
424    margin-top:8px;font-size:13px;color:var(--mut);
425    display:inline-flex;align-items:center;gap:8px;
426  }
427  .ai-pitch .hint::after{
428    content:"";width:5px;height:5px;border-radius:50%;background:var(--gold);
429    animation:liveP 2s ease-in-out infinite;
430  }
431  .ai-chat{
432    display:grid;grid-template-rows:0fr;opacity:0;
433    transition:grid-template-rows .75s var(--ease),opacity .55s ease .12s;
434  }
435  .ai-card.open .ai-chat{grid-template-rows:1fr;opacity:1}
436  .ai-chat > div{overflow:hidden;min-height:0}
437  .ai-chat .inner{
438    display:flex;flex-direction:column;
439    transform:translateY(14px);transition:transform .75s var(--ease);
440  }
441  .ai-card.open .ai-chat .inner{transform:none}
442  .chat-h{
443    flex:none;display:flex;align-items:center;gap:12px;
444    padding:4px 6px 14px;border-bottom:1px solid rgba(255,255,255,0.08);
445  }
446  .chat-h svg{height:18px;width:auto;color:var(--text)}
447  .chat-h b{font-family:var(--ff-mono);font-weight:500;font-size:13.5px;letter-spacing:0.02em}
448  .chat-h .quota{margin-inline-start:auto;font-size:13px;color:var(--mut);font-weight:400}
449  .chat-x{
450    flex:none;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;
451    color:var(--mut);transition:color .3s,background .3s;
452  }
453  .chat-h .quota:empty + .chat-x{margin-inline-start:auto}
454  .chat-x:hover{color:var(--text);background:rgba(255,255,255,0.08)}
455  .msgs{
456    min-height:170px;
456max-height:min(46vh,420px);overflow-y:auto;overscroll-behavior:contain;
457    padding:18px 8px;display:flex;flex-direction:column;gap:12px;
458    scrollbar-width:thin;
459  }
460  .m{max-width:86%;font-size:15px;line-height:2.05;text-wrap:pretty}
461  .m.user{
462    align-self:flex-start;
463    background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.1);
464    border-radius:16px 16px 16px 5px;padding:9px 15px;
465  }
466  .m.ai{align-self:stretch;max-width:100%;display:flex;gap:11px;align-items:flex-start}
467  .m.ai .av{
468    flex:none;width:27px;height:27px;border-radius:50%;margin-top:4px;
469    border:1px solid rgba(255,255,255,0.13);background:rgba(255,255,255,0.05);
470    display:flex;align-items:center;justify-content:center;
471  }
472  .m.ai .av svg{height:12px;width:auto;color:var(--text)}
473  /* pre-line: شکستِ خطِ پاسخ (فهرست‌های «۱) … ۲) …») حفظ می‌شود */
474  .m.ai .tx{color:#E4E2EC;min-width:0;word-break:break-word;white-space:pre-line}
475  /* لینکِ مجازِ داخلِ پاسخ — توکنِ لاتین، جدا از جهتِ متنِ فارسی */
476  .m.ai .tx a.lnk{
477    direction:ltr;unicode-bidi:isolate;display:inline;
478    font-family:var(--ff-mono);font-size:0.9em;color:var(--gold);
479    text-decoration:underline;text-decoration-color:rgba(255,194,74,0.45);text-underline-offset:4px;
480    padding-block:2px;word-break:break-all;
481  }
482  .m.ai .tx a.lnk:hover{text-decoration-color:var(--gold)}
483  .m.ai .tx.stream::after{
484    content:"";display:inline-block;width:2px;height:1em;margin-inline-start:3px;
485    vertical-align:-0.15em;background:var(--gold);border-radius:1px;
486    box-shadow:0 0 8px rgba(255,194,74,0.7);
487    animation:crt 1s steps(2) infinite;
488  }
489  @keyframes crt{50%{opacity:0}}
490  .m.think .tx{color:var(--mut);display:flex;align-items:center;gap:10px}
491  .m.ai .tx .note{display:block;color:var(--mut);font-size:13px;margin-top:6px}
492  .tb{height:22px;width:auto;overflow:visible;flex:none}
493  .tb .tbGlow{animation:tbPulse 1.5s ease-in-out infinite}
494  @keyframes tbPulse{0%,100%{opacity:0.15}50%{opacity:0.6}}
495  .tb .tbs{animation:tbSweep 1.5s cubic-bezier(0.45,0,0.55,1) infinite}
496  @keyframes tbSweep{from{transform:translateX(0)}to{transform:translateX(420px)}}
497  .m.sys{
498    align-self:stretch;max-width:100%;text-align:center;
499    border:1px solid rgba(255,194,74,0.22);border-radius:16px;
500    background:rgba(255,194,74,0.05);padding:16px 18px;
501  }
502  .m.sys b{display:block;font-size:14px}
503  .m.sys p{color:var(--mut);font-size:13px;margin-top:4px}
504  .m.sys .sys-cta{
505    display:inline-block;margin-top:12px;padding:8px 22px;border-radius:999px;
506    font-size:13px;font-weight:700;border:1px solid rgba(255,194,74,0.4);
507    transition:background .3s,transform .3s var(--ease);
508  }
509  .m.sys .sys-cta:hover{background:rgba(255,194,74,0.1);transform:translateY(-1px)}
510  .m.sys .sys-cta.gold{background:var(--gold);color:#0B0A07;border-color:var(--gold)}
511  .m.sys .sys-cta.gold:hover{background:#FFCD66}
512  /* کارتِ آرامِ دعوت به حساب — زیرِ پاسخ، هم‌تراز با متنِ پاسخ، قابلِ بستن */
513  .m.nudge{
514    position:relative;align-self:stretch;max-width:none;
515    margin-inline-start:38px;padding:14px 16px 16px;padding-inline-end:46px;
516    border-radius:16px;border:1px solid rgba(255,255,255,0.08);background:rgba(255,255,255,0.03);
517    animation:ngIn .55s var(--ease) both;
518    transition:opacity .25s ease,transform .25s ease;
519  }
520  .m.nudge.out{opacity:0;transform:translateY(4px)}
521  @keyframes ngIn{from{opacity:0;transform:translateY(8px)}}
522  .m.nudge b{display:block;font-size:13.5px;font-weight:600;line-height:1.9;color:var(--text)}
523  .m.nudge p{font-size:13px;line-height:1.95;color:var(--mut);margin-top:2px}
524  .m.nudge .ng-cta{
525    display:inline-flex;align-items:center;min-height:40px;margin-top:12px;padding:0 20px;
526    border-radius:999px;background:var(--gold);color:#0B0A07;font-size:13px;font-weight:700;
527    transition:background .3s,transform .3s var(--ease);
528  }
529  .m.nudge .ng-cta:hover{background:#FFCD66;transform:translateY(-1px)}
530  .m.nudge .ng-x{
531    position:absolute;top:8px;inset-inline-end:8px;width:32px;height:32px;border-radius:50%;
532    display:flex;align-items:center;justify-content:center;color:var(--mut);
533    transition:color .3s,background .3s;
534  }
535  .m.nudge .ng-x:hover{color:var(--text);background:rgba(255,255,255,0.06)}
536  @media (max-width:480px){.m.nudge{margin-inline-start:0}}
537  .chips{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;padding:2px 6px 12px}
538  .chips.gone{display:none}
539  .chip{
540    font-size:13px;color:var(--mut);padding:7px 15px;border-radius:999px;
541    border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03);
542    transition:color .3s,border-color .3s,background .3s;
543  }
544  .chip:hover{color:var(--text);border-color:rgba(255,255,255,0.22);background:rgba(255,255,255,0.06)}
545
546  /* ————— نوارِ درخشانِ چت — قلبِ هوش مصنوعی ————— */
547  .glowbar{
548    position:relative;margin-top:14px;border-radius:999px;
549    isolation:isolate;
550  }
551  .gb-halo{
552    position:absolute;inset:-3px;border-radius:999px;overflow:hidden;
553    filter:blur(20px);opacity:0.45;z-index:-1;pointer-events:none;
554    transform:translateZ(0);
555    transition:opacity .6s ease,transform .6s var(--ease);
556  }
557  .gb-halo2{
558    position:absolute;inset:-14px;border-radius:999px;overflow:hidden;
559    filter:blur(40px);opacity:0.22;z-index:-2;pointer-events:none;
560    transform:translateZ(0);
561    transition:opacity .6s ease;
562  }
563  .gb-ring{
564    position:absolute;inset:0;border-radius:999px;overflow:hidden;
565    pointer-events:none;
566  }
567  .gb-halo i,.gb-halo2 i,.gb-ring i{
568    content:"";position:absolute;left:50%;top:50%;
569    width:calc(max(100%,110px)*1.25);aspect-ratio:1;
570    background:var(--neon);border-radius:50%;
571    transform:translate(-50%,-50%) rotate(0deg);
572    will-change:transform;
573  }
574  .glowbar.live .gb-halo i,.glowbar.live .gb-halo2 i,.glowbar.live .gb-ring i{
575    animation:gbSpin 7s linear infinite;
576  }
577  @keyframes gbSpin{to{transform:translate(-50%,-50%) rotate(360deg)}}
578  .gb-core{
579    position:relative;display:flex;align-items:center;gap:8px;
580    margin:2px;border-radius:999px;
581    background:#0A0A10;
582    padding:9px 10px 9px 12px;
583    box-shadow:inset 0 1px 0 rgba(255,255,255,0.05);
584  }
585  .glowbar.hot .gb-halo{opacity:0.9;transform:translateZ(0) scale(1.015)}
586  .glowbar.hot .gb-halo2{opacity:0.5}
587  .gb-ctl{
588    flex:none;width:34px;height:34px;border-radius:50%;
589    display:flex;align-items:center;justify-content:center;
590    color:var(--mut2);border:1px solid rgba(255,255,255,0.09);
591    transition:color .3s,border-color .3s,background .3s;
592  }
593  .gb-ctl:hover{color:var(--text);border-color:rgba(255,255,255,0.2);background:rgba(255,255,255,0.05)}
594  .gb-ctl svg{width:14px;height:14px}
595  .glowbar input{
596    flex:1;min-width:0;background:none;border:0;outline:none;color:var(--text);
597    font:inherit;font-size:14.5px;caret-color:var(--gold);padding-inline:4px;
598  }
599  .glowbar input::placeholder{color:var(--mut)}
600  .gb-send{
601    flex:none;width:38px;height:38px;border-radius:50%;
602    display:flex;align-items:center;justify-content:center;
603    background:linear-gradient(135deg,#7C4DFF 0%,#FF2E9E 52%,#FFC24A 100%);
604    box-shadow:inset 0 1px 0 rgba(255,255,255,0.35),0 4px 18px rgba(255,46,158,0.3);
605    transition:transform .35s var(--ease),box-shadow .35s,filter .3s;
606  }
607  .gb-send:hover{transform:translateY(-1px);box-shadow:inset 0 1px 0 rgba(255,255,255,0.4),0 8px 26px rgba(255,46,158,0.42)}
608  .gb-send:active{transform:scale(0.9)}
609  .gb-send svg{width:15px;height:15px;color:#fff}
610  .gb-send[disabled]{opacity:0.55;pointer-events:none;filter:saturate(0.4)}
611
612  /* ————————————————— دعوت ————————————————— */
613  .invite{
614    position:relative;z-index:1;padding:clamp(110px,18vh,200px) 0;
615    border-top:1px solid rgba(242,241,245,0.06);
616    text-align:center;
617  }
618  .rs-mark{width:44px;height:auto;margin-inline:auto;color:var(--text)}
619  .invite .kicker{justify-content:center;margin-top:30px}
620  .invite h2{
621    font-size:clamp(30px,5.6vw,58px);font-weight:700;line-height:1.5;
622    letter-spacing:0;margin-top:16px;text-wrap:balance;
623  }
624  .invite .rs-p{
625    color:#BDBACB;max-width:56ch;margin:18px auto 0;
626    font-size:clamp(15.5px,1.8vw,18px);line-height:2.15;text-wrap:pretty;
627  }
628  .invite .rs-p .brand{font-family:var(--ff-mono);font-size:0.88em;color:#D5D2E0}
629  .cta{
630    position:relative;display:inline-flex;align-items:center;gap:12px;
631    margin-top:clamp(30px,5vh,44px);padding:17px 48px;border-radius:999px;
632    font-size:17px;font-weight:700;color:var(--text);overflow:hidden;
633    background:rgba(255,255,255,0.06);
634    backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);
635    border:1px solid rgba(255,194,74,0.4);
636    box-shadow:inset 0 1px 0 rgba(255,255,255,0.28),0 14px 44px rgba(0,0,0,0.5),0 0 34px rgba(255,194,74,0.1);
637    transition:transform .4s var(--ease),box-shadow .5s var(--ease),border-color .4s;
638  }
639  .cta::before{
640    content:"";position:absolute;inset:0;
641    background:linear-gradient(115deg,transparent 32%,rgba(255,255,255,0.16) 48%,transparent 62%);
642    transform:translateX(-130%);transition:transform .9s var(--ease);
643  }
644  .cta:hover{transform:translateY(-2px);border-color:rgba(255,194,74,0.65);box-shadow:inset 0 1px 0 rgba(255,255,255,0.3),0 18px 54px rgba(0,0,0,0.55),0 0 48px rgba(255,194,74,0.18)}
645  .cta:hover::before{transform:translateX(130%)}
646  .cta:active{transform:translateY(0) scale(0.985)}
647  .cta .arr{transition:transform .4s var(--ease)}
648  .cta:hover .arr{transform:translateX(-5px)}
649  .cta-sub{
650    display:inline-block;margin-top:18px;font-size:14px;color:var(--mut);
651    border-bottom:1px solid transparent;transition:color .3s,border-color .3s;
652  }
653  .cta-sub:hover{color:var(--text);border-color:var(--mut2)}
654  .cta-sub em{font-style:normal;color:var(--text);font-weight:600}
655  .rs-sale{margin-top:clamp(26px,4.6vh,40px);font-size:13px;color:var(--mut)}
656  .rs-sale em{font-style:normal;color:rgba(255,194,74,0.8);font-weight:600}
657
658  footer{
659    position:relative;z-index:1;
660    border-top:1px solid rgba(242,241,245,0.07);
661    padding:34px clamp(20px,5vw,56px) max(34px,env(safe-area-inset-bottom));
662    display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
663  }
664  footer .f-word{height:15px;width:auto;color:var(--mut)}
665  footer span{font-size:13px;color:var(--mut)}
666  footer .mono{font-size:10.5px;letter-spacing:0.3em;direction:ltr}
667
668  /* ————————————————— reduced motion ————————————————— */
669  @media (prefers-reduced-motion:reduce){
670    .ch{height:auto !important;min-height:100vh;min-height:100svh}
671    .ch-l,.ch-tag,.ch-inner,.ch-num,.scene{opacity:1 !important;transform:none !important;filter:none !important}
672    .ch-l .w,.ch-l .wi,.ch-tag i{opacity:1 !important;transform:none !important;filter:none !important}
673    .ch-num{opacity:0.05 !important}
674    .scene [data-fx]{opacity:1 !important;transform:none !important}
675    .scene [data-fx="draw"]{stroke-dashoffset:0 !important}
676    #trailDraw{stroke-dasharray:none !important;stroke-dashoffset:0 !important}
677    .tnode{border-color:rgba(255,194,74,0.85)}
678    .tnode::after{background:var(--gold)}
679    .thead{display:none}
680    .rv{opacity:1;transform:none;transition:none}
681    .scroll-cue i::after,.dial-hand,.m.ai .tx.stream::after{animation:none}
682    #tikPath{stroke-dashoffset:0;transition:none}
683    .wm{transform:none}
684    .glowbar .gb-halo i,.glowbar .gb-halo2 i,.glowbar .gb-ring i{animation:none !important}
685    .tnode.on::before{animation:none}
686    .tb .tbs,.tb .tbGlow{animation:none}
687    .ai-pitch,.ai-chat,.ai-chat .inner{transition:none}
688    .m.nudge{animation:none;transition:none}
689  }
690
691/* ══════════ مکانیکِ دسترس‌پذیری ══════════
692   آخرِ شیت تا غالب باشد. چیدمان همان است؛ فقط ناحیه‌ی لمس، اندازه‌ی ورودی،
693   حلقه‌ی فوکوس و حاشیه‌ی امنِ آیفون درست می‌شود. */
694
695  /* نوارِ بالا: نشانه و دکمه‌ی شروع دست‌کم ۴۴px، ارتفاعِ نوار همان ۶۴px */
696  .topbar{
697    padding-block:10px;
698    padding-top:max(10px,env(safe-area-inset-top,0px));
699    padding-left:max(clamp(16px,4vw,40px),env(safe-area-inset-left,0px));
700    padding-right:max(clamp(16px,4vw,40px),env(safe-area-inset-right,0px));
701  }
702  /* جعبه ۴۴px می‌شود ولی نشانه سرِ جای خودش می‌ماند: لبه‌ی پایانیِ جعبه همان‌جاست
703     که قبلاً بود، پس نشانه با justify-content:flex-end تکان نمی‌خورد. */
704  .tb-brand{display:inline-flex;align-items:center;justify-content:flex-end;min-width:44px;min-height:44px}
705  .tb-start{min-height:44px}
706  .tb-login{display:inline-flex;align-items:center;min-height:44px}
707
708  /* لینک‌های متنیِ زیرخط‌دار: خطِ زیر سرِ جایش، ناحیه‌ی لمس ۴۴px */
709  .pr-dom,.cta-sub{position:relative}
710  .pr-dom::before,.cta-sub::before{
711    content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
712    width:100%;height:44px;
713  }
714
715  /* کادرِ پرسش: دکمه‌های دایره‌ای دیسکشان را نگه می‌دارند، جعبه‌شان ۴۴px می‌شود */
716  .gb-ctl,.gb-send{position:relative}
717  .gb-ctl::before,.gb-send::before{
718    content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
719    width:44px;height:44px;border-radius:50%;
720  }
721  .glowbar input{min-height:44px}
722  .gb-core{padding-block:6px}   /* ورودی ۶px بلندتر شد؛ پیل همان ۵۶px می‌ماند */
723  .chip{min-height:44px;display:inline-flex;align-items:center;justify-content:center}
724  .chat-x{position:relative}
725  .chat-x::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:44px;height:44px;border-radius:50%}
726
727  /* iOS زیرِ ۱۶px خودش زوم می‌کند — فقط روی اشاره‌گرِ درشت */
728  @media (pointer:coarse){ .glowbar input{font-size:16px} }
729
730  /* لایه‌ی بسته در ترتیبِ Tab نماند */
731  [inert]{pointer-events:none}
732
733  /* حرکتِ کمتر — آن‌چه در بلوکِ بالا جا مانده بود */
734  @media (prefers-reduced-motion:reduce){
735    .topbar{transition:none}
736    .sky i{animation:none}
737  }
738</style>
739<noscript><style>
740  html .wm{transform:none}
741  html #wmMain .st{stroke-dasharray:none;stroke-dashoffset:0;opacity:1}
742  html #wmDot{opacity:1}
743  html .wm-cap{opacity:1}
744  html .wm-say{opacity:1}
745  html .scroll-cue{opacity:0.85}
746  .ch{height:auto;min-height:100svh}
747  .ch-l,.ch-tag{opacity:1 !important}
748  .ch-num{opacity:0.05 !important}
749  .scene [data-fx]{opacity:1 !important}
750  .scene [data-fx="draw"]{stroke-dashoffset:0 !important}
751  #trailDraw{stroke-dasharray:none}
752  .rv{opacity:1;transform:none}
753  .topbar{transform:none}
754</style></noscript>
755<link rel="stylesheet" href="/redesign.css">
756<link rel="stylesheet" href="/scroll-scenes.css">
757</head>
758<body>
759<a class="skip-link" href="#content">رفتن به محتوای اصلی</a>
760
761<svg width="0" height="0" style="position:absolute" aria-hidden="true">
762  <defs>
763    <linearGradient id="specG" x1="0" y1="0" x2="1" y2="0.12">
764      <stop offset="0" stop-color="#FFC24A"/><stop offset="0.34" stop-color="#FF2E9E"/>
765      <stop offset="0.66" stop-color="#7C4DFF"/><stop offset="1" stop-color="#27E0FF"/>
766    </linearGradient>
767    <linearGradient id="specGV" x1="0" y1="0" x2="0.3" y2="1">
768      <stop offset="0" stop-color="#7C4DFF"/><stop offset="0.5" stop-color="#FF2E9E"/>
769      <stop offset="1" stop-color="#FFC24A"/>
770    </linearGradient>
771    <linearGradient id="specSweepG" x1="0" y1="0" x2="1" y2="0">
772      <stop offset="0" stop-color="#FFC24A" stop-opacity="0"/>
773      <stop offset="0.25" stop-color="#FFC24A"/>
774      <stop offset="0.45" stop-color="#FF2E9E"/>
775      <stop offset="0.62" stop-color="#7C4DFF"/>
776      <stop offset="0.8" stop-color="#27E0FF"/>
777      <stop offset="1" stop-color="#27E0FF" stop-opacity="0"/>
778    </linearGradient>
779    <g id="bxMarkBold" fill="none" stroke-linecap="round" stroke-width="46">
780      <path d="M60,56 L60,224"/><circle cx="108" cy="176" r="48"/>
781    </g>
782    <g id="bxWordThin" fill="none" stroke-linecap="round">
783      <path d="M30,28 L30,112"/><circle cx="54" cy="88" r="24"/>
784      <path d="M112,64 L112,112"/><path d="M112,38 l0.01,0" stroke-width="21"/>
785      <path d="M140,65 L184,111"/><path d="M184,65 L140,111"/>
786      <circle cx="228" cy="88" r="24"/><path d="M252,64 L252,112"/>
787    </g>
788    <mask id="tbM" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="280">
789      <g fill="none" stroke="#fff" stroke-width="46" stroke-linecap="round">
790        <path d="M60,56 L60,224"/><circle cx="108" cy="176" r="48"/>
791      </g>
792    </mask>
793  </defs>
794</svg>
795
796<!-- ————————— سفرِ رنگیِ پس‌زمینه ————————— -->
797<div class="sky" aria-hidden="true">
798  <i class="w1"></i><i class="w2"></i><i class="w3"></i><i class="w4"></i>
799  <i class="w5"></i><i class="w6"></i><i class="w7"></i>
800</div>
801
802<!-- ————————— نوارِ بالا ————————— -->
803<header class="topbar" id="topbar">
804  <a class="tb-brand ltr" href="#top" aria-label="bixa — صفحه اصلی">
805    <svg viewBox="14 12 254 116" role="img" aria-label="bixa"><use href="#bxWordThin" stroke="currentColor" stroke-width="16"/></svg>
806  </a>
807  <nav class="site-nav" aria-label="بخش‌های صفحه">
808    <a href="#learn">آنچه یاد می‌گیری</a><a href="#path">از کجا شروع کنم؟</a><a href="#proof">کارنامه</a><a href="#faq">سؤال‌های رایج</a>
809  </nav>
810  <div class="tb-links"><a class="tb-login" href="/login">ورود</a><a class="tb-start" href="/signup">رایگان شروع کن <span aria-hidden="true">↗</span></a></div>
811</header>
812
813<main id="content">
814
815<!-- ————————— hero ————————— -->
816<section class="hero" id="top" aria-label="bixa"><div class="hero-stage">
817  <div id="heroFlash" aria-hidden="true"></div>
818  <div class="wm-wrap" id="wmWrap">
819    <div class="ltr" style="display:block">
820      <svg class="wm" id="wm" viewBox="24 20 526 236" role="img" aria-label="bixa">
821        <defs>
822          <linearGradient id="specGB" gradientUnits="userSpaceOnUse" x1="46" y1="44" x2="164" y2="236">
823            <stop offset="0" stop-color="#7C4DFF"/><stop offset="0.5" stop-color="#FF2E9E"/>
824            <stop offset="1" stop-color="#FFC24A"/>
825          </linearGradient>
826          <mask id="bSweepMask" maskUnits="userSpaceOnUse" x="0" y="0" width="560" height="270">
827            <g fill="none" stroke="#fff" stroke-width="46" stroke-linecap="round">
828              <path d="M60,56 L60,224"/><circle cx="108" cy="176" r="48"/>
829            </g>
830          </mask>
831        </defs>
832        <g id="wmGlow" fill="none" stroke="url(#specG)" stroke-width="48" stroke-linecap="round" style="filter:blur(12px)">
833          <path d="M60,56 L60,224"/><circle cx="108" cy="176" r="48"/>
834        </g>
835        <g id="wmMain" fill="none" stroke="#F2F1F5" stroke-linecap="round" stroke-width="46">
836          <path id="wBs" class="st" pathLength="1" d="M60,56 L60,224"/>
837          <circle id="wBb" class="st" pathLength="1" cx="108" cy="176" r="48"/>
838          <path id="wIs" class="st" pathLength="1" d="M224,128 L224,224"/>
839          <circle id="wmDot" cx="224" cy="70" r="28" fill="#F2F1F5" stroke="none"/>
840          <path id="wX1" class="st" pathLength="1" d="M280,130 L368,222"/>
841          <path id="wX2" class="st" pathLength="1" d="M368,130 L280,222"/>
842          <circle id="wAb" class="st" pathLength="1" cx="468" cy="176" r="48"/>
843          <path id="wAs" class="st" pathLength="1" d="M516,128 L516,224"/>
844        </g>
845        <g id="wmSpec" fill="none" stroke="url(#specGB)" stroke-width="46" stroke-linecap="round">
846          <path d="M60,56 L60,224"/><circle cx="108" cy="176" r="48"/>
847        </g>
848        <g mask="url(#bSweepMask)">
849          <rect id="wmSweep" x="-340" y="10" width="340" height="256" fill="url(#specSweepG)"/>
850        </g>
851      </svg>
852    </div>
853    <div class="wm-cap" id="wmCap">BIXA.AI</div>
854    <div class="wm-say" id="wmSay">
855      <span class="hero-eyebrow">از اولین ایده تا یک محصول واقعی</span>
856      <h1>ساختن را یاد بگیر.<br>ایده‌ات را <em>واقعی کن.</em></h1>
857      <p>بدون تجربهٔ برنامه‌نویسی، با هوش مصنوعی نرم‌افزار بساز و به کسب‌وکارها ارائه کن. در <span class="ltr">bixa</span>، قدم‌به‌قدم یاد می‌گیری چه بسازی، چطور بسازی و به چه کسی بفروشی.</p>
858      <div class="hero-actions"><a class="hero-cta" id="heroCta" href="/signup">رایگان شروع کن
859        <svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
860          <path d="M10 3 L5 8 L10 13" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
861        </svg>
862      </a><a class="text-link" href="#learn">ببین چه چیزی می‌سازی <span aria-hidden="true">↓</span></a></div>
863      <p class="hero-note"><span aria-hidden="true">✓</span> شروع رایگان · مانیفست ۲۹ دقیقه‌ای · اولین قدم عملی</p>
864    </div>
865  </div>
866  <div class="hero-bottom"><span>یک مسیر برای <b>یاد گرفتن، ساختن و ارائه کردن.</b></span><span class="ltr">IDEA → BUILD → LAUNCH</span></div>
867  <div class="scroll-cue" id="scrollCue" aria-hidden="true"><span>اسکرول کن</span><i></i></div>
868<div class="hero-progress" aria-hidden="true"><i></i></div></div></section>
869
870<div class="trust-line"><div class="trust-inner">
871  <p>این مسیر را با ساختن محصول‌های واقعی یاد گرفته‌ایم.</p>
872  <div class="trust-names"><a href="https://tik.money" target="_blank" rel="noopener">تیک<small class="ltr">tik.money ↗</small></a><a href="https://arz.me" target="_blank" rel="noopener">ارز دات می<small class="ltr">arz.me ↗</small></a><span>رادین پرایس<small>قیمت‌های لحظه‌ای</small></span><span>رادین <b class="ltr">RSC</b><small>دستیار دایرکت</small></span></div>
873</div></div>
874
875<section class="section-shell" id="learn" aria-labelledby="learn-title"><div class="learn-stage">
876  <div class="learn-layout">
877    <div class="learn-copy"><span class="section-label">01 / LEARN BY BUILDING</span><h2 class="section-title" id="learn-title">هر پروژه، یک مهارت.<br>هر مهارت، <em>یک امکان تازه.</em></h2><p class="section-intro">ربات، پلتفرم یا دستیار؛ با ساختن یاد می‌گیری. هر پروژه از یک نیاز واقعی شروع می‌شود و تو را به خروجی‌ای می‌رساند که می‌توانی به یک کسب‌وکار نشان بدهی.</p><a class="text-link" href="#story">مسیر ایده تا محصول را ببین <span aria-hidden="true">↓</span></a></div>
878    <div class="deliverable-list" aria-label="اجزای هر پروژه">
879      <div class="deliverable-row"><span class="list-index">01</span><div><h3>ببین و قدم‌به‌قدم بساز</h3><p>ویدیوهای ساخت پروژه؛ از تعریف مسئله تا رسیدن به یک خروجی قابل‌اجرا.</p></div><span class="item-symbol" aria-hidden="true">↗</span></div>
880      <div class="deliverable-row"><span class="list-index">02</span><div><h3>به جزوه و سورس برگرد</h3><p>مرجع تصویری و فایل‌های پروژه، برای مرور، تمرین و ادامه دادن مسیر.</p></div><span class="item-symbol" aria-hidden="true">⌘</span></div>
881      <div class="deliverable-row"><span class="list-index">03</span><div><h3>همان‌جا که گیر کردی، بپرس</h3><p>دستیار هر پروژه، با شناخت محتوای همان پروژه به سؤال‌هایت پاسخ می‌دهد.</p></div><span class="item-symbol" aria-hidden="true">✳</span></div>
882      <div class="deliverable-row"><span class="list-index">04</span><div><h3>برای یک نیاز واقعی راه‌حل بساز</h3><p>یاد بگیر خروجی‌ات به درد چه کسب‌وکاری می‌خورد و چگونه آن را ارائه کنی.</p></div><span class="item-symbol" aria-hidden="true">↗</span></div>
883    </div>
884  </div>
885  <div class="learn-progress" aria-hidden="true"><span>قدم‌به‌قدم، از یادگیری تا ارائه</span><div><i></i></div><b>۰۱ / ۰۴</b></div>
886</div></section>
887
888<section class="path-section" id="path" aria-labelledby="path-title"><div class="section-shell">
889  <div class="path-top"><div><span class="section-label">02 / YOUR FIRST STEPS</span><h2 class="section-title" id="path-title">از کجا شروع کنی؟<br>از همین سه قدم.</h2></div><p class="section-intro">لازم نیست از قبل همه‌چیز را بلد باشی. مسیر شروع مشخص است و با یک حساب رایگان واردش می‌شوی.</p></div>
890  <div class="path-steps">
891    <article class="path-step"><span class="step-num">01 — JOIN</span><h3>حسابت را بساز</h3><p>با شمارهٔ موبایل یا حساب گوگل وارد شو و مسیر یادگیری‌ات را شروع کن.</p><a class="step-tag" href="/signup">ساخت حساب رایگان ↗</a></article>
892    <article class="path-step"><span class="step-num">02 — UNDERSTAND</span><h3>اول، نقشه را ببین</h3><p>مانیفست ۲۹ دقیقه‌ای را ببین تا با روش کار و مسیر ساخت محصول آشنا شوی.</p><span class="step-tag">۲۹ دقیقه برای شروع</span></article>
893    <article class="path-step"><span class="step-num">03 — CREATE</span><h3>
893اولین قدم را عملی بردار</h3><p>از محتوای رایگان شروع کن و آموخته‌هایت را در عمل به کار بگیر. هرجا سؤالی داشتی، دستیار همراهت است.</p><span class="step-tag">یادگیری با انجام دادن</span></article>
894  </div>
895</div></section>
896<div class="section-shell story-heading"><span class="section-label">03 / FROM AN IDEA TO A PRODUCT</span><h2 class="section-title">هر محصول، از <em>یک جرقه</em> شروع می‌شود.</h2><p class="section-intro">این مسیر را با هم طی می‌کنیم.</p></div>
897
898<!-- ————————— داستان — یک مسیر ————————— -->
899<div class="story" id="story">
900
901  <div class="trail" aria-hidden="true">
902    <svg viewBox="0 0 1000 1030" preserveAspectRatio="none">
903      <path id="trailBase" vector-effect="non-scaling-stroke" fill="none" stroke-width="1.5"
904        d="M500,-10 C500,50 250,66 250,129 C250,193 718,318 750,382 C780,444 250,582 250,648 C250,714 718,840 750,904 C778,958 500,972 500,1040"/>
905      <path id="trailDraw" vector-effect="non-scaling-stroke" fill="none" stroke-width="2" stroke-linecap="round"
906        d="M500,-10 C500,50 250,66 250,129 C250,193 718,318 750,382 C780,444 250,582 250,648 C250,714 718,840 750,904 C778,958 500,972 500,1040"/>
907    </svg>
908    <span class="thead" id="trailHead"></span>
909    <span class="tnode" style="left:25%;top:12.524%"></span>
910    <span class="tnode" style="left:75%;top:37.087%"></span>
911    <span class="tnode" style="left:25%;top:62.913%"></span>
912    <span class="tnode" style="left:75%;top:87.767%"></span>
913  </div>
914
915  <section class="ch" id="ch1" style="--chn:2.1" data-ax="0" data-ay="1">
916    <div class="ch-pin">
917      <div class="ch-num" aria-hidden="true">Û°Û±</div>
918      <div class="ch-inner">
919        <svg class="scene" viewBox="0 0 360 150" aria-hidden="true">
920          <!-- دنیای قدیم (راست): سال‌ها آموختن — پنجره‌ی انبوهِ کد -->
921          <g data-fx="fade" data-a="0.34" data-b="0.56">
922            <rect data-fx="draw" data-a="0.04" data-b="0.2" pathLength="1" x="214" y="24" width="128" height="102" rx="10" fill="none" stroke="#4A4860" stroke-width="1.5"/>
923            <g stroke="#3A3850" stroke-width="2" stroke-linecap="round">
924              <path data-fx="draw" data-a="0.08" data-b="0.18" pathLength="1" d="M260,46 h64"/>
925              <path data-fx="draw" data-a="0.1" data-b="0.2" pathLength="1" d="M232,60 h84"/>
926              <path data-fx="draw" data-a="0.12" data-b="0.22" pathLength="1" d="M260,74 h56"/>
927              <path data-fx="draw" data-a="0.14" data-b="0.24" pathLength="1" d="M250,88 h74"/>
928              <path data-fx="draw" data-a="0.16" data-b="0.26" pathLength="1" d="M278,102 h38"/>
929              <path data-fx="draw" data-a="0.17" data-b="0.27" pathLength="1" d="M232,102 h32"/>
930            </g>
931            <text x="278" y="140" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#55536A">سال‌ها آموختن</text>
932          </g>
933          <!-- گذر — رو به چپ، در جهتِ خواندن -->
934          <path data-fx="draw" data-a="0.3" data-b="0.46" pathLength="1" d="M202,75 H154 M162,67 l-9,8 l9,8" fill="none" stroke="#9B99A8" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
935          <!-- دنیای نو (چپ): یک خطِ خواسته -->
936          <rect data-fx="draw" data-a="0.4" data-b="0.62" pathLength="1" x="18" y="56" width="126" height="38" rx="19" fill="none" stroke="#F2F1F5" stroke-width="2"/>
937          <circle data-fx="pop" data-a="0.58" data-b="0.72" cx="122" cy="75" r="4" fill="#FFC24A"/>
938          <path data-fx="draw" data-a="0.62" data-b="0.78" pathLength="1" d="M106,75 h-64" stroke="#9B99A8" stroke-width="2.4" stroke-linecap="round" fill="none"/>
939          <g data-fx="pop" data-a="0.72" data-b="0.85" fill="none" stroke="#FFC24A" stroke-width="1.6" stroke-linecap="round">
940            <path d="M30,38 v12 M24,44 h12"/>
941          </g>
942          <text data-fx="pop" data-a="0.66" data-b="0.8" x="81" y="118" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#9B99A8">یک خواسته‌ی روشن</text>
943        </svg>
944        <span class="ch-tag"><i></i>فصل ۱ — جرقه<i></i></span>
945        <p class="ch-l l1">یک کسب‌وکار، یک کار تکراری، یک درد.</p>
946        <p class="ch-l l2">همین‌جا یک نرم‌افزار متولد می‌شود — و کسی حاضر است برایش پول بدهد.</p>
947      </div>
948    </div>
949  </section>
950
951  <section class="ch" id="ch2" style="--chn:2.0" data-ax="1" data-ay="0.25">
952    <div class="ch-pin">
953      <div class="ch-num" aria-hidden="true">Û°Û²</div>
954      <div class="ch-inner">
955        <svg class="scene" viewBox="0 0 360 150" aria-hidden="true">
956          <!-- ابزارِ یکسان: ردیفِ نقطه‌های همانند -->
957          <path data-fx="draw" data-a="0.02" data-b="0.2" pathLength="1" d="M40,118 H320" stroke="#3A3850" stroke-width="1.5" stroke-linecap="round" fill="none"/>
958          <g fill="#6A6880">
959            <circle data-fx="pop" data-a="0.06" data-b="0.16" cx="300" cy="118" r="5"/>
960            <circle data-fx="pop" data-a="0.1" data-b="0.2" cx="255" cy="118" r="5"/>
961            <circle data-fx="pop" data-a="0.14" data-b="0.24" cx="210" cy="118" r="5"/>
962            <circle data-fx="pop" data-a="0.18" data-b="0.28" cx="165" cy="118" r="5"/>
963            <circle data-fx="pop" data-a="0.22" data-b="0.32" cx="120" cy="118" r="5"/>
964            <circle data-fx="pop" data-a="0.26" data-b="0.36" cx="75" cy="118" r="5"/>
965          </g>
966          <!-- برنده: مسیری که از یکی از همان نقطه‌ها بالا می‌رود — رو به چپ -->
967          <path data-fx="draw" data-a="0.36" data-b="0.66" pathLength="1"
968            d="M165,116 C165,92 192,88 188,66 C184,46 144,52 124,34"
969            fill="none" stroke="#F2F1F5" stroke-width="2" stroke-linecap="round"/>
970          <g data-fx="pop" data-a="0.62" data-b="0.78">
971            <circle cx="116" cy="28" r="5.5" fill="#FFC24A"/>
972            <circle cx="116" cy="28" r="12" fill="none" stroke="#FFC24A" stroke-width="1" opacity="0.35"/>
973          </g>
974          <text data-fx="pop" data-a="0.68" data-b="0.82" x="70" y="26" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#9B99A8">چه بسازم؟</text>
975          <text x="180" y="142" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#55536A">
975ابزار برای همه یکی است</text>
976        </svg>
977        <span class="ch-tag"><i></i>فصل ۲ — دنیای تو<i></i></span>
978        <p class="ch-l l1">ابزار برای همه یکی است: هوش مصنوعی‌ای که کد می‌نویسد.</p>
979        <p class="ch-l l2">فرق، در این است که بدانی چه بخواهی. این را یاد می‌گیری.</p>
980      </div>
981    </div>
982  </section>
983
984  <section class="ch" id="ch3" style="--chn:2.3" data-ax="0" data-ay="1">
985    <div class="ch-pin">
986      <div class="ch-num" aria-hidden="true">Û°Û³</div>
987      <div class="ch-inner">
988        <svg class="scene" viewBox="0 0 360 150" aria-hidden="true">
989          <!-- ترمینال (راست): ساختن -->
990          <rect data-fx="draw" data-a="0.03" data-b="0.22" pathLength="1" x="190" y="26" width="150" height="98" rx="10" fill="none" stroke="#F2F1F5" stroke-width="1.8"/>
991          <path data-fx="draw" data-a="0.1" data-b="0.2" pathLength="1" d="M190,48 h150" stroke="#3A3850" stroke-width="1.2" fill="none"/>
992          <g data-fx="pop" data-a="0.08" data-b="0.18" fill="#4A4860">
993            <circle cx="326" cy="37" r="2.5"/><circle cx="317" cy="37" r="2.5"/><circle cx="308" cy="37" r="2.5"/>
994          </g>
995          <g stroke-linecap="round" fill="none">
996            <path data-fx="draw" data-a="0.18" data-b="0.3" pathLength="1" d="M324,66 h-8 l-6,6 l6,6" stroke="#FFC24A" stroke-width="1.7"/>
997            <path data-fx="draw" data-a="0.26" data-b="0.4" pathLength="1" d="M226,72 h72" stroke="#9B99A8" stroke-width="2"/>
998            <path data-fx="draw" data-a="0.32" data-b="0.46" pathLength="1" d="M266,92 h58" stroke="#5A5870" stroke-width="2"/>
999            <path data-fx="draw" data-a="0.36" data-b="0.5" pathLength="1" d="M240,106 h84" stroke="#5A5870" stroke-width="2"/>
1000          </g>
1001          <!-- گذر: از ساختن به فروختن — رو به چپ -->
1002          <path data-fx="draw" data-a="0.48" data-b="0.62" pathLength="1" d="M178,75 H138 M146,67 l-9,8 l9,8" fill="none" stroke="#9B99A8" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
1003          <!-- محصولِ فروخته‌شده (چپ) -->
1004          <rect data-fx="draw" data-a="0.56" data-b="0.76" pathLength="1" x="26" y="40" width="100" height="70" rx="12" fill="none" stroke="#F2F1F5" stroke-width="2"/>
1005          <path data-fx="draw" data-a="0.66" data-b="0.8" pathLength="1" d="M64,64 h44" stroke="#9B99A8" stroke-width="2" stroke-linecap="round" fill="none"/>
1006          <path data-fx="draw" data-a="0.7" data-b="0.84" pathLength="1" d="M80,80 h28" stroke="#5A5870" stroke-width="2" stroke-linecap="round" fill="none"/>
1007          <g data-fx="pop" data-a="0.76" data-b="0.9">
1008            <circle cx="44" cy="92" r="9" fill="none" stroke="#FFC24A" stroke-width="1.6"/>
1009            <path d="M40.5,92 l2.6,2.6 l4.6,-5.4" fill="none" stroke="#FFC24A" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
1010          </g>
1011          <text x="277" y="142" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#55536A">بساز</text>
1012          <text data-fx="pop" data-a="0.72" data-b="0.86" x="76" y="132" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#9B99A8">بفروش</text>
1013        </svg>
1014        <span class="ch-tag"><i></i>فصل ۳ — خلق<i></i></span>
1015        <p class="ch-l l1">پروژه به پروژه می‌سازی: ربات، پلتفرم، دستیار.</p>
1016        <p class="ch-l l2">هر کدام با ویدیو، جزوه، سورس کامل — و فهرست کسانی که می‌خرندش.</p>
1017      </div>
1018    </div>
1019  </section>
1020
1021  <section class="ch" id="ch4" style="--chn:1.95" data-ax="-1" data-ay="0.25">
1022    <div class="ch-pin">
1023      <div class="ch-num" aria-hidden="true">Û°Û´</div>
1024      <div class="ch-inner">
1025        <svg class="scene" viewBox="0 0 360 150" aria-hidden="true">
1026          <!-- گذار به اثبات: چهار قاب که یکی‌یکی روشن می‌شوند -->
1027          <path data-fx="draw" data-a="0.02" data-b="0.4" pathLength="1" d="M24,76 H336" stroke="#3A3850" stroke-width="1.5" stroke-linecap="round" fill="none"/>
1028          <g fill="none" stroke-width="1.8">
1029            <rect data-fx="draw" data-a="0.14" data-b="0.3" pathLength="1" x="280" y="50" width="52" height="52" rx="10" stroke="#F2F1F5"/>
1030            <rect data-fx="draw" data-a="0.26" data-b="0.42" pathLength="1" x="198" y="50" width="52" height="52" rx="10" stroke="#F2F1F5"/>
1031            <rect data-fx="draw" data-a="0.38" data-b="0.54" pathLength="1" x="116" y="50" width="52" height="52" rx="10" stroke="#F2F1F5"/>
1032            <rect data-fx="draw" data-a="0.5" data-b="0.66" pathLength="1" x="34" y="50" width="52" height="52" rx="10" stroke="#F2F1F5"/>
1033          </g>
1034          <g fill="#FFC24A">
1035            <circle data-fx="pop" data-a="0.3" data-b="0.42" cx="306" cy="76" r="4"/>
1036            <circle data-fx="pop" data-a="0.42" data-b="0.54" cx="224" cy="76" r="4"/>
1037            <circle data-fx="pop" data-a="0.54" data-b="0.66" cx="142" cy="76" r="4"/>
1038            <circle data-fx="pop" data-a="0.66" data-b="0.78" cx="60" cy="76" r="4"/>
1039          </g>
1040          <text data-fx="pop" data-a="0.7" data-b="0.84" x="180" y="136" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10.5" fill="#9B99A8">چهار محصولِ واقعی — ساخته‌ی خودِ ما</text>
1041        </svg>
1042        <span class="ch-tag"><i></i>فصل ۴ — گذار به اثبات<i></i></span>
1043        <p class="ch-l l1">این روش را اول روی خودمان امتحان کردیم.</p>
1044        <p class="ch-l l2">چهار محصول زنده — و خودِ bixa — با همین روش ساخته شده‌اند.</p>
1045      </div>
1046    </div>
1047  </section>
1048
1049</div>
1050
1051<!-- ————————— proof ————————— -->
1052<section class="proof" id="proof">
1053  <div class="wrap">
1054    <header class="proof-head" data-rv>
1055      <span class="kicker rv">کارنامه</span>
1056      <h2 class="rv" style="--d:.08s">محصولاتِ واقعی، با کاربرانِ واقعی.</h2>
1057      <p class="rv" style="--d:.16s">چهار محصول که با همین روش — گفتن به هوش مصنوعی، نه کد نوشتن — ساخته شده‌اند و همین حالا مشتری دارند.</p>
1058    </header>
1059
1060    <!-- ۱ · تیک -->
1061    <article class="pr" id="pr-tik" data-rv>
1062      <div class="pr-text">
1063        <span class="pr-idx rv ltr">Û°Û± / Û°Û´</span>
1064        <h3 class="rv" style="--d:.06s">تیک <a class="pr-dom" href="https://tik.money" target="_blank" rel="noopener">tik.money</a></h3>
1065        <p class="rv" style="--d:.12s">پلتفرمِ هوش مصنوعیِ مدیریتِ مالیِ شخصی.</p>
1066        <div class="stats">
1067          <div class="stat rv" style="--d:.18s"><b><span class="num" data-num="5856">۵٬۸۵۶</span></b><span>کاربر در نخستین فصل</span></div>
1068          <div class="stat rv" style="--d:.26s"><b><span class="num" data-num="93" data-plain="1">۹۳</span> <small>میلیون</small></b><span>توکنِ پردازش‌شده</span></div>
1069          <div class="stat rv" style="--d:.34s"><b><span class="num" data-num="33.9" data-dec="1">۳۳٫۹</span> <small>میلیارد تومان</small></b><span>تراکنشِ ردیابی‌شده‌ی کاربران</span></div>
1070        </div>
1071        <span class="pr-foot rv" style="--d:.42s">طبقِ گزارشِ تأثیر</span>
1072      </div>
1073      <div class="pr-vis rv" style="--d:.1s">
1074        <div class="pr-frame">
1075          <svg viewBox="0 0 300 200" aria-hidden="true">
1076            <g stroke="#1C1C26" stroke-width="1"><path d="M20,160 H280"/><path d="M20,115 H280" opacity=".55"/><path d="M20,70 H280" opacity=".35"/></g>
1077            <path id="tikPath" pathLength="1" d="M20,150 C55,146 70,128 95,124 S140,132 165,110 S215,64 246,58 S272,48 282,42"
1078              fill="none" stroke="#F2F1F5" stroke-width="2.5" stroke-linecap="round"/>
1079            <!-- نقطه‌ی پایانِ خط ثابت است؛ نه تپش دارد، نه بازه‌ی زمانی — قاب نمادین است، نمودار نیست -->
1080            <circle cx="282" cy="42" r="4" fill="#FFC24A"/>
1081            <circle cx="282" cy="42" r="9" fill="none" stroke="#FFC24A" stroke-width="1" opacity=".3"/>
1082          </svg>
1083        </div>
1084      </div>
1085    </article>
1086
1087    <!-- ۲ · ارز دات می -->
1088    <article class="pr" id="pr-arz" data-rv>
1089      <div class="pr-text">
1090        <span class="pr-idx rv ltr">Û°Û² / Û°Û´</span>
1091        <h3 class="rv" style="--d:.06s">ارز دات می <a class="pr-dom" href="https://arz.me" target="_blank" rel="noopener">arz.me</a></h3>
1092        <p class="rv" style="--d:.12s">صرافیِ رمزارزِ زنده؛ سخت‌ترین نوعِ نرم‌افزار، چون با پولِ واقعیِ مردم کار می‌کند.</p>
1093        <div class="stats">
1094          <div class="stat rv" style="--d:.18s"><b><span class="num" data-num="400" data-plain="1">۴۰۰</span>+</b><span>ارزِ قابلِ معامله</span></div>
1095          <div class="stat rv" style="--d:.26s"><b><span class="num" data-num="29" data-plain="1">۲۹</span></b><span>کنترلرِ <span class="ltr mono" style="font-size:.9em">API</span></span></div>
1096          <div class="stat rv" style="--d:.34s"><b><small>حدودِ</small> <span class="num" data-num="2100" data-plain="1">۲۱۰۰</span></b><span>موردِ تستِ خودکار در هسته‌ی مالی</span></div>
1097        </div>
1098      </div>
1099      <div class="pr-vis rv" style="--d:.1s">
1100        <div class="pr-frame">
1101          <!-- قابِ نمادینِ یک فهرستِ بازار: بدونِ قیمت، بدونِ ادعای «زنده» — عددِ کهنه اعتمادِ کنارِ خودش را هم می‌شکند -->
1102          <svg viewBox="0 0 300 200" aria-hidden="true">
1103            <g>
1104              <rect x="24" y="24" width="252" height="14" rx="7" fill="#10101A" stroke="#1C1C26"/>
1105              <rect x="34" y="29" width="46" height="4" rx="2" fill="#2A2A3A"/>
1106              <rect x="222" y="29" width="44" height="4" rx="2" fill="#2A2A3A"/>
1107            </g>
1108            <g>
1109              <g><rect x="24" y="52" width="252" height="34" rx="9" fill="#0C0C13" stroke="#1C1C26"/>
1110                 <circle cx="44" cy="69" r="7" fill="none" stroke="#FFC24A" stroke-width="1.4"/>
1111                 <rect x="60" y="66" width="38" height="6" rx="3" fill="#2A2A3A"/>
1112                 <rect x="150" y="66" width="62" height="6" rx="3" fill="#2A2A3A"/>
1113                 <path d="M226,74 l9,-8 l8,5 l11,-9 l8,4" fill="none" stroke="#FFC24A" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></g>
1114              <g><rect x="24" y="94" width="252" height="34" rx="9" fill="#0C0C13" stroke="#1C1C26"/>
1115                 <circle cx="44" cy="111" r="7" fill="none" stroke="#6A6880" stroke-width="1.4"/>
1116                 <rect x="60" y="108" width="30" height="6" rx="3" fill="#2A2A3A"/>
1117                 <rect x="150" y="108" width="50" height="6" rx="3" fill="#2A2A3A"/>
1118                 <path d="M226,110 l9,3 l8,-6 l11,4 l8,-5" fill="none" stroke="#6A6880" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></g>
1119              <g><rect x="24" y="136" width="252" height="34" rx="9" fill="#0C0C13" stroke="#1C1C26"/>
1120                 <circle cx="44" cy="153" r="7" fill="none" stroke="#6A6880" stroke-width="1.4"/>
1121                 <rect x="60" y="150" width="34" height="6" rx="3" fill="#2A2A3A"/>
1122                 <rect x="150" y="150" width="56" height="6" rx="3" fill="#2A2A3A"/>
1123                 <path d="M226,150 l9,6 l8,-3 l11,7 l8,-2" fill="none" stroke="#6A6880" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></g>
1124            </g>
1125          </svg>
1126        </div>
1127      </div>
1128    </article>
1129
1130    <!-- ۳ · رادین پرایس -->
1131    <article class="pr" id="pr-price" data-rv>
1132      <div class="pr-text">
1133        <span class="pr-idx rv ltr">Û°Û³ / Û°Û´</span>
1134        <h3 class="rv" style="--d:.06s">رادین پرایس</h3>
1135        <p class="rv" style="--d:.12s">رباتِ قیمتِ لحظه‌ایِ دلار و طلا و سکه روی بله و تلگرام.</p>
1136        <div class="stats">
1137          <div class="stat rv" style="--d:.18s"><b>هر <span class="num" data-num="30" data-plain="1">۳۰</span> <small>ثانیه</small></b><span>یک فراخوانِ منبع — برای کاربرانِ نامحدود</span></div>
1138          <div class="stat rv" style="--d:.26s"><b><span class="num" data-num="28" data-plain="1">۲۸</span>+</b><span>ارزِ جهانی، طلا و سکه</span></div>
1139          <div class="stat rv" style="--d:.34s"><b><small>حدودِ</small> <span class="num" data-num="1500" data-plain="1">۱۵۰۰</span></b><span>نمادِ بورس</span></div>
1140        </div>
1141      </div>
1142      <div class="pr-vis rv" style="--d:.1s">
1143        <div class="pr-frame">
1144          <svg viewBox="0 0 300 200" aria-hidden="true">
1145            <circle cx="150" cy="110" r="62" fill="none" stroke="#1C1C26" stroke-width="1.5"/>
1146            <g stroke="#2A2A3A" stroke-width="1.5">
1147              <path d="M150,48 v8"/><path d="M150,164 v8"/><path d="M88,110 h8"/><path d="M204,110 h8"/>
1148            </g>
1149            <line class="dial-hand" x1="150" y1="110" x2="150" y2="58" stroke="#F2F1F5" stroke-width="2" stroke-linecap="round"/>
1150            <circle cx="150" cy="110" r="4.5" fill="#FFC24A"/>
1151            <text x="150" y="36" text-anchor="middle" font-family="Geist Mono,monospace" font-size="10" fill="#9B99A8">30s</text>
1152            <g font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10.5" fill="#9B99A8" text-anchor="middle">
1153              <text x="62" y="190">دلار</text><text x="150" y="190">طلا</text><text x="238" y="190">سکه</text>
1154            </g>
1155          </svg>
1156        </div>
1157      </div>
1158    </article>
1159
1160    <!-- ۴ · رادین RSC -->
1161    <article class="pr" id="pr-rsc" data-rv>
1162      <div class="pr-text">
1163        <span class="pr-idx rv ltr">Û°Û´ / Û°Û´</span>
1164        <h3 class="rv" style="--d:.06s">رادین <span class="ltr">RSC</span></h3>
1165        <p class="rv" style="--d:.12s">دستیارِ هوش مصنوعیِ دایرکتِ اینستاگرام، با فیلترِ ایمنیِ کدنویسی‌شده.</p>
1166        <blockquote class="pr-lesson rv" style="--d:.2s">درسِ اصلی: برای ایمنی به پرامپت اعتماد نکن — کد بنویس.</blockquote>
1167      </div>
1168      <div class="pr-vis rv" style="--d:.1s">
1169        <div class="pr-frame">
1170          <svg viewBox="0 0 300 200" aria-hidden="true">
1171            <g font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10.5">
1172              <rect x="30" y="34" width="150" height="30" rx="12" fill="#10101A" stroke="#2A2A3A"/>
1173              <text x="46" y="53" fill="#9B99A8">قیمت و موجودی را می‌خواهم</text>
1174              <rect x="120" y="76" width="150" height="30" rx="12" fill="#0C0C13" stroke="#1C1C26"/>
1175              <text x="136" y="95" fill="#F2F1F5">همین حالا برایتان می‌فرستم</text>
1176            </g>
1177            <path d="M150,126 l26,10 v18 c0,16 -11,26 -26,32 c-15,-6 -26,-16 -26,-32 v-18 z"
1178              fill="none" stroke="#FFC24A" stroke-width="1.6" opacity=".9"/>
1179            <g font-family="Geist Mono,monospace" font-size="11" fill="#F2F1F5" text-anchor="middle">
1180              <text x="150" y="158">&lt;/&gt;</text>
1181            </g>
1182            <text x="150" y="196" text-anchor="middle" font-family="'IBM Plex Sans Arabic',sans-serif" font-size="10" fill="#9B99A8">فیلترِ ایمنی، در کد</text>
1183          </svg>
1184        </div>
1185      </div>
1186    </article>
1187  </div>
1188</section>
1189
1190<!-- ————————— دستیارِ bixa — در دلِ اسکرول ————————— -->
1191<section class="ask" id="ask">
1192  <div class="wrap">
1193    <header class="ask-head" data-rv>
1194      <span class="kicker rv">دستیارِ bixa</span>
1195      <h2 class="rv" style="--d:.08s">سؤالی مانده؟ همین‌جا بپرس.</h2>
1196    </header>
1197    <div class="ai-card" id="aiCard" data-rv>
1198      <div class="ai-pitch rv" id="aiPitch" role="button" tabindex="0" aria-expanded="false" aria-controls="aiChatPane">
1199        <div><div class="inner">
1200          <div class="ai-b" aria-hidden="true">
1201            <svg class="halo" viewBox="30 26 156 228"><use href="#bxMarkBold" stroke="url(#specGV)"/></svg>
1202            <svg viewBox="30 26 156 228"><use href="#bxMarkBold" stroke="currentColor"/></svg>
1203          </div>
1204          <h3>گفت‌وگو با دستیارِ <span class="brand ltr">bixa</span></h3>
1205          <p>درباره‌ی دوره، روشِ کار، یا هر چیزی که ذهنت را مشغول کرده — همین حالا و همین‌جا جواب بگیر.</p>
1206          <span class="hint">آماده‌ی گفت‌وگو</span>
1207        </div></div>
1208      </div>
1209      <div class="ai-chat" id="aiChatPane" aria-hidden="true" inert>
1210        <div><div class="inner">
1211          <header class="chat-h">
1212            <svg viewBox="30 26 156 228" aria-hidden="true"><use href="#bxMarkBold" stroke="currentColor"/></svg>
1213            <b class="ltr">bixa</b>
1214            <span class="quota" id="quota"></span>
1215            <button class="chat-x" id="chatX" type="button" aria-label="بستن گفت‌وگو">
1216              <svg width="13" height="13" viewBox="0 0 13 13" fill="none" aria-hidden="true">
1217                <path d="M2 2 L11 11 M11 2 L2 11" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
1218              </svg>
1219            </button>
1220          </header>
1221          <div class="msgs" id="msgs" aria-live="polite">
1222            <div class="m ai">
1223              <span class="av"><svg viewBox="30 26 156 228" aria-hidden="true"><use href="#bxMarkBold" stroke="currentColor"/></svg></span>
1224              <div class="tx">سلام. هر سؤالی درباره‌ی <span class="ltr mono" style="font-size:.92em">bixa</span> داری، همین‌جا بپرس.</div>
1225            </div>
1226          </div>
1227          <div class="chips" id="chips">
1228            <button class="chip" type="button">بیکسا دقیقاً چه چیزی یاد می‌دهد؟</button>
1229            <button class="chip" type="button">برای شروع چه چیزی لازم دارم؟</button>
1230            <button class="chip" type="button">دوره‌ها کی آغاز می‌شوند؟</button>
1231          </div>
1232        </div></div>
1233      </div>
1234      <div class="glowbar rv" id="glowbar" style="--d:.1s">
1235        <span class="gb-halo2" aria-hidden="true"><i></i></span>
1236        <span class="gb-halo" aria-hidden="true"><i></i></span>
1237        <span class="gb-ring" aria-hidden="true"><i></i></span>
1238        <form class="gb-core" id="composer" autocomplete="off">
1239          <button class="gb-ctl" type="button" id="gbPlus" aria-label="شروعِ گفت‌وگو" tabindex="-1">
1240            <svg viewBox="0 0 14 14" fill="none" aria-hidden="true">
1241              <path d="M7 2 V12 M2 7 H12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
1242            </svg>
1243          </button>
1244          <input id="q" type="text" name="q" placeholder="از bixa بپرس…" maxlength="600" aria-label="پرسش تو">
1245          <button class="gb-send" id="sendBtn" type="submit" aria-label="ارسال">
1246            <svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
1247              <path d="M8 13 V3 M3.5 7.5 L8 3 L12.5 7.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
1248            </svg>
1249          </button>
1250        </form>
1251      </div>
1252    </div>
1253  </div>
1254</section>
1255
1256<section class="section-shell faq-section" id="faq" aria-labelledby="faq-title">
1257  <div><span class="section-label">05 / A LITTLE MORE CLARITY</span><h2 class="section-title" id="faq-title">قبل از شروع،<br>شفاف‌تر بدان.</h2><p class="section-intro">سؤال دیگری داری؟ از دستیار <span class="ltr">bixa</span> بپرس.</p><a class="text-link" href="#ask">گفت‌وگو با دستیار <span aria-hidden="true">↑</span></a></div>
1258  <div class="faq-list">
1259    <details><summary>باید برنامه‌نویسی بلد باشم؟</summary><p>برای شروع، تجربهٔ برنامه‌نویسی لازم نیست. آموزش‌ها با کمک هوش مصنوعی پیش می‌روند و یاد می‌گیری مسئله را تعریف کنی، خواسته‌ات را روشن توضیح بدهی و خروجی را بررسی و اصلاح کنی.</p></details>
1260    <details><summary>بعد از ثبت‌نام چه چیزی می‌بینم؟</summary><p>وارد محیط یادگیری می‌شوی، مانیفست معرفی مسیر را می‌بینی و از محتوای رایگان شروع می‌کنی. وضعیت دسترسی هر پروژه و درس داخل حساب مشخص است.</p></details>
1261    <details><summary>همهٔ محتوا و سورس‌ها رایگان‌اند؟</summary><p>ساخت حساب و شروع مسیر رایگان است. دسترسی به بخش‌های ویژه، سورس و سایر فایل‌ها به وضعیت هر پروژه و اشتراک بستگی دارد؛ جزئیات در محیط یادگیری نمایش داده می‌شود.</p></details>
1262    <details><summary>اگر وسط یک پروژه گیر کردم چه؟</summary><p>دستیار همان پروژه برای توضیح مطالب و کمک به رفع خطا در دسترس است. کنار آموزش می‌توانی به جزوه و فایل‌های پروژه‌ای که به آن دسترسی داری برگردی.</p></details>
1263    <details><summary>این آموزش درآمد را تضمین می‌کند؟</summary><p>آموزش به تو کمک می‌کند راه‌حل بسازی و آن را به کسب‌وکار مرتبط ارائه کنی. رسیدن به فروش به اجرا، کیفیت محصول، نیاز بازار و پیگیری خودت بستگی دارد و تضمین درآمدی وجود ندارد.</p></details>
1264  </div>
1265</section>
1266
1267<!-- ————————— دعوت ————————— -->
1268<section class="invite" id="start">
1269  <div class="wrap" data-rv>
1270    <svg class="rs-mark rv" viewBox="30 26 156 228" aria-hidden="true"><use href="#bxMarkBold" stroke="currentColor"/></svg>
1271    <div><span class="kicker rv" style="--d:.08s">ورود به دنیای هوش مصنوعی</span></div>
1272    <h2 class="rv" style="--d:.14s">ایدهٔ بعدی، می‌تواند مال تو باشد.</h2>
1273    <p class="rs-p rv" style="--d:.22s">با یک حساب رایگان شروع کن. مانیفست را ببین، اولین Ù
1273‚دم را بردار و به ایده‌ات فرصت ساخته شدن بده.</p>
1274    <div class="rv" style="--d:.3s">
1275      <a class="cta" href="/signup">رایگان شروع کن
1276        <svg class="arr" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
1277          <path d="M10 3 L5 8 L10 13" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
1278        </svg>
1279      </a>
1280    </div>
1281    <div class="rv" style="--d:.38s">
1282      <a class="cta-sub" href="/login">حساب داری؟ <em>وارد شو</em></a>
1283    </div>
1284  </div>
1285</section>
1286
1287</main>
1288
1289<footer>
1290  <svg class="f-word" viewBox="14 12 254 116" role="img" aria-label="bixa"><use href="#bxWordThin" stroke="currentColor" stroke-width="16"/></svg>
1291  <span class="mono">BIXA.AI</span>
1292  <span>© ۱۴۰۵ — همه‌ی حقوق محفوظ است.</span>
1293</footer>
1294
1295<script>
1296(function(){
1297'use strict';
1298var root=document.documentElement;
1299var RM=window.matchMedia('(prefers-reduced-motion: reduce)').matches;
1300var EASE='cubic-bezier(0.16,1,0.3,1)';
1301function $(id){return document.getElementById(id)}
1302function clamp(x,a,b){return x<a?a:(x>b?b:x)}
1303function sm(v){v=clamp(v,0,1);return v*v*(3-2*v)}
1304function seg(p,a,b){return sm((p-a)/(b-a))}
1305function fseg(p,a,b){return clamp((p-a)/(b-a),0,1)}
1306/* back-out: نشستِ حروف با اندکی سرریز */
1307function bko(t){t=clamp(t,0,1);var s=1.35;t-=1;return 1+t*t*((s+1)*t+s)}
1308/* بلورِ کوانتیزه — نیم‌پیکسلی، برای ۶۰fps */
1309function qb(b){return Math.round(b*2)/2}
1310function faN(n,dec,plain){
1311  try{
1312    return n.toLocaleString('fa-IR',{minimumFractionDigits:dec||0,maximumFractionDigits:dec||0,useGrouping:!plain})
1313      .replace(/,/g,'Ù¬').replace(/\./g,'Ù«');
1314  }catch(e){return String(n)}
1315}
1316
1317/* ————— storage helpers ————— */
1318function store(get,key,val){
1319  try{
1320    if(get)return localStorage.getItem(key);
1321    localStorage.setItem(key,val);return val;
1322  }catch(e){return null}
1323}
1324function uid(p){return p+Date.now().toString(36)+Math.random().toString(36).slice(2,10)}
1325var FP=store(true,'bx_fp')||store(false,'bx_fp',uid('fp_'))||uid('fp_');
1326var SID=store(true,'bx_sid')||store(false,'bx_sid',uid('s_'))||uid('s_');
1327
1328/* ————— track beacon (silent) ————— */
1329try{
1330  var tp=JSON.stringify({path:location.pathname,ref:document.referrer||'',sid:SID});
1331  if(navigator.sendBeacon){navigator.sendBeacon('/api/track',new Blob([tp],{type:'application/json'}))}
1332  else{fetch('/api/track',{method:'POST',headers:{'Content-Type':'application/json'},body:tp,keepalive:true}).catch(function(){})}
1333}catch(e){}
1334
1335/* ————— intro choreography — لودِ b با تمِ رنگی ————— */
1336var INTRO={anims:[],done:false};
1337/* ————— گریزِ فوری: هر کنشِ بازدیدکننده یک‌راست به حالتِ پایانی می‌برد ————— */
1338var SKIP_EV=['pointerdown','mousedown','touchstart','wheel','keydown','pointermove'];
1339var skipPX=null,skipPY=null;
1340function onSkip(e){
1341  /* حرکتِ اشاره‌گر فقط وقتی «قصد» است که واقعاً جابه‌جا شده باشد */
1342  if(e&&e.type==='pointermove'){
1343    if(skipPX===null){skipPX=e.clientX;skipPY=e.clientY;return}
1344    if(Math.abs(e.clientX-skipPX)+Math.abs(e.clientY-skipPY)<24)return;
1345  }
1346  finishIntro();
1347}
1348function bindSkip(on){
1349  for(var i=0;i<SKIP_EV.length;i++){
1350    try{
1351      if(on)window.addEventListener(SKIP_EV[i],onSkip,{passive:true,capture:true});
1352      else window.removeEventListener(SKIP_EV[i],onSkip,{capture:true});
1353    }catch(err){}
1354  }
1355}
1356function finishIntro(){
1357  if(INTRO.done)return;
1358  INTRO.done=true;
1359  bindSkip(false);
1360  INTRO.anims.forEach(function(a){try{a.cancel()}catch(e){}});
1361  INTRO.anims=[];
1362  root.classList.add('intro-done');
1363  root.classList.remove('lock');
1364  /* وب‌کیت بعد از پایانِ انیمیشنِ dash ناحیه‌ی استروک را درست باطل نمی‌کند
1365     (ساقه‌ی i و a محو می‌شدند) — یک باطل‌سازیِ اجباری در همان فریم */
1366  var _wm=document.getElementById('wm');
1367  if(_wm){ _wm.style.display='none'; void _wm.getBoundingClientRect(); _wm.style.display=''; }
1368  var tb=document.getElementById('topbar');
1369  if(tb)tb.classList.add('show');
1370}
1371var seen=false;
1372try{seen=!!sessionStorage.getItem('bx_intro');sessionStorage.setItem('bx_intro','1')}catch(e){}
1373
1374if(RM||seen){
1375  if(seen&&!RM)root.classList.add('revisit'); /* بازدیدِ دوم: ~۰.۸ ثانیه */
1376  finishIntro();
1377}else{
1378  root.classList.add('lock');
1379  bindSkip(true);
1380  try{
1381    var A=function(el,kf,op){var a=el.animate(kf,op);INTRO.anims.push(a);return a};
1382    var draw=function(id,delay,dur){
1383      A($(id),[
1384        {strokeDashoffset:1,opacity:0},
1385        {strokeDashoffset:0.965,opacity:1,offset:0.06},
1386        {strokeDashoffset:0,opacity:1}
1387      ],{duration:dur,delay:delay,easing:EASE,fill:'both'});
1388    };
1389    /* پرده‌ی اول — b به‌تنهایی، وسط، بزرگ */
1390    draw('wBs',220,540);
1391    draw('wBb',580,640);
1392    /* نورِ گرادیانی روی خودِ b می‌نشیند و یک نفسِ کامل می‌ماند — بنفش تا کهربایی */
1393    A($('wmSpec'),[
1394      {opacity:0}
1394,
1395      {opacity:1,offset:0.18},
1396      {opacity:1,offset:0.72},
1397      {opacity:0}
1398    ],{duration:1520,delay:1000,easing:'ease-in-out',fill:'both'});
1399    A($('wmGlow'),[{opacity:0},{opacity:0.55,offset:0.3},{opacity:0.55,offset:0.72},{opacity:0}],{duration:1520,delay:1000,easing:'ease-in-out',fill:'both'});
1400    A($('wmSweep'),[
1401      {opacity:0,transform:'translateX(0px)'},
1402      {opacity:1,offset:0.12},
1403      {opacity:1,offset:0.85},
1404      {opacity:0,transform:'translateX(560px)'}
1405    ],{duration:760,delay:2020,easing:'cubic-bezier(0.5,0,0.2,1)',fill:'both'});
1406    A($('heroFlash'),[{opacity:0},{opacity:0.6,offset:0.4},{opacity:0}],{duration:700,delay:2080,easing:'ease-in-out',fill:'both'});
1407    /* گذارِ مخملی — b نرم جا باز می‌کند و کلمه کامل می‌شود */
1408    A($('wm'),[
1409      {transform:'translateX(34%) scale(1.3)'},
1410      {transform:'translateX(0%) scale(1)'}
1411    ],{duration:1250,delay:2180,easing:EASE,fill:'both'});
1412    draw('wIs',2380,470);
1413    /* مقیاس حولِ خودِ نقطه، مستقل از transform-origin/transform-box — در هر موتوری یکسان */
1414    var DOT=function(k){return 'translate(224px,70px) scale('+k+') translate(-224px,-70px)'};
1415    A($('wmDot'),[
1416      {opacity:0,transform:DOT(0.1)},
1417      {opacity:1,transform:DOT(1.55),offset:0.62},
1418      {opacity:1,transform:DOT(1)}
1419    ],{duration:520,delay:2600,easing:EASE,fill:'both'});
1420    draw('wX1',2690,470);
1421    draw('wX2',2780,470);
1422    draw('wAb',2880,560);
1423    draw('wAs',3010,470);
1424    A($('wmSay'),[
1425      {opacity:0,transform:'translateY(12px)'},
1426      {opacity:1,transform:'translateY(0)'}
1427    ],{duration:760,delay:3560,easing:EASE,fill:'both'});
1428    A($('wmCap'),[
1429      {opacity:0,transform:'translateY(14px)',filter:'blur(6px)'},
1430      {opacity:1,transform:'translateY(0)',filter:'blur(0px)'}
1431    ],{duration:700,delay:3420,easing:EASE,fill:'both'});
1432    A($('scrollCue'),[{opacity:0},{opacity:0.85}],{duration:750,delay:3620,easing:'ease-out',fill:'both'});
1433    setTimeout(function(){root.classList.remove('lock')},3250);
1434    setTimeout(finishIntro,4150);
1435  }catch(e){finishIntro()}
1436}
1437/* فِیل‌سِیف: صفحه هرگز سیاه نمی‌ماند */
1438setTimeout(finishIntro,4400);
1439
1440/* ————— scroll choreography ————— */
1441var vh=window.innerHeight;
1442var wmWrap=$('wmWrap'),cue=$('scrollCue'),topbar=$('topbar');
1443var story=$('story');
1444/* حروف‌چینیِ زنده: هر خط به واژه‌های ماسک‌دار شکسته می‌شود — متن دست نمی‌خورد */
1445function splitWords(el){
1446  if(RM||!el)return [];
1447  var words=el.textContent.split(' '),frag=document.createDocumentFragment(),out=[];
1448  words.forEach(function(word,i){
1449    if(i)frag.appendChild(document.createTextNode(' '));
1450    if(!word)return;
1451    var w=document.createElement('span');w.className='w';
1452    var wi=document.createElement('span');wi.className='wi';
1453    wi.textContent=word;w.appendChild(wi);frag.appendChild(w);out.push(wi);
1454  });
1455  el.textContent='';el.appendChild(frag);
1456  return out;
1457}
1458var chapters=[].slice.call(document.querySelectorAll('.ch')).map(function(el){
1459  var fx=[].slice.call(el.querySelectorAll('[data-fx]')).map(function(f){
1460    return {el:f,kind:f.dataset.fx,a:parseFloat(f.dataset.a||'0'),b:parseFloat(f.dataset.b||'1')};
1461  });
1462  var tag=el.querySelector('.ch-tag'),l1=el.querySelector('.l1'),l2=el.querySelector('.l2');
1463  return {el:el,inner:el.querySelector('.ch-inner'),tag:tag,
1464          l1:l1,l2:l2,num:el.querySelector('.ch-num'),
1465          w1:splitWords(l1),w2:splitWords(l2),
1466          dashes:[].slice.call(tag.querySelectorAll('i')),
1467          scene:el.querySelector('.scene'),fx:fx,
1468          ax:parseFloat(el.dataset.ax||'0'),ay:parseFloat(el.dataset.ay||'1'),
1469          top:0,h:0,off:false,init:false};
1470});
1471var visEls=[].slice.call(document.querySelectorAll('.pr-frame'));
1472var visMeta=[];
1473var storyTop=0,storyBot=0;
1474
1475/* مسیر */
1476var trail=$('trailDraw'),trailHead=$('trailHead');
1477var tnodes=[].slice.call(document.querySelectorAll('.tnode'));
1478var NODE_F=[0.1252,0.3709,0.6291,0.8777];
1479var trailLen=0;
1480if(!RM&&trail){
1481  try{
1482    trailLen=trail.getTotalLength();
1483    trail.style.strokeDasharray=trailLen+' '+trailLen;
1484    trail.style.strokeDashoffset=trailLen;
1485    /* کسرِ دقیقِ هر ایستگاه، از خودِ هندسه‌ی مسیر — هرگز از هم نمی‌افتند */
1486    (function(){
1487      var T=[[250,129],[750,382],[250,648],[750,904]],N=600,i,j,
1488          best=T.map(function(){return {d:1e18,f:0}});
1489      for(i=0;i<=N;i++){
1490        var pt=trail.getPointAtLength(trailLen*i/N);
1491        for(j=0;j<T.length;j++){
1492          var dx=pt.x-T[j][0],dy=pt.y-T[j][1],dd=dx*dx+dy*dy;
1493          if(dd<best[j].d){best[j].d=dd;best[j].f=i/N}
1494        }
1495      }
1496      NODE_F=best.map(function(b){return b.f});
1497    })();
1498  }catch(e){trailLen=0}
1499}
1500if(RM){tnodes.forEach(function(n){n.classList.add('on')})}
1501
1502/* سفرِ رنگی */
1503var skyLayers=[].slice.call(document.querySelectorAll('.sky i'));
1504var skyPrev=skyLayers.map(function(){return -1});
1505var skyStops=[];
1506function measureSky(){
1507  function mid(el,cap){
1508    var r=el.getBoundingClientRect();
1509    var t=r.top+window.scrollY,h=r.height;
1510    return t+(cap?Math.min(h/2,cap):h/2);
1511  }
1512  skyStops=[
1513    {at:vh*0.5,li:-1},                    /* خلأ */
1514    {at:mid($('ch1')),li:0},              /* سرمه‌ای */
1515    {at:mid($('ch2')),li:1},              /* نیلی */
1516    {at:mid($('ch3')),li:2},              /* بنفشِ شبانه */
1517    {at:mid($('ch4')),li:3},              /* ارغوانیِ گرم */
1518    {at:mid($('proof'),vh*1.4),li:4},     /* کهرباییِ تیره */
1519    {at:mid($('ask')),li:5},              /* شبِ نئون */
1520    {at:mid($('start')),li:6}             /* سپیده — روشن‌ترین */
1521  ];
1522}
1523function applySky(pos){
1524  var t=[0,0,0,0,0,0,0],i,k;
1525  if(pos<=skyStops[0].at){/* void */}
1526  else if(pos>=skyStops[skyStops.length-1].at){t[6]=1}
1527  else{
1528    for(i=0;i<skyStops.length-1;i++){
1529      if(pos>=skyStops[i].at&&pos<skyStops[i+1].at){
1530        k=sm((pos-skyStops[i].at)/(skyStops[i+1].at-skyStops[i].at));
1531        if(skyStops[i].li>=0)t[skyStops[i].li]=1-k;
1532        if(skyStops[i+1].li>=0)t[skyStops[i+1].li]=k;
1533        break;
1534      }
1535    }
1536  }
1537  for(i=0;i<skyLayers.length;i++){
1538    var v=Math.round(t[i]*1000)/1000;
1539    if(v!==skyPrev[i]){skyPrev[i]=v;skyLayers[i].style.opacity=v}
1540  }
1541}
1542
1543function measure(){
1544  vh=window.innerHeight;
1545  chapters.forEach(function(c){
1546    var r=c.el.getBoundingClientRect();
1547    c.top=r.top+window.scrollY;c.h=r.height;
1548  });
1549  var sr=story.getBoundingClientRect();
1550  storyTop=sr.top+window.scrollY;storyBot=storyTop+sr.height;
1551  visMeta=visEls.map(function(el){
1552    var r=el.getBoundingClientRect();
1553    return {el:el,top:r.top+window.scrollY,h:r.height};
1554  });
1555  measureSky();
1556}
1557
1558/* یک واژه‌ی ماسک‌دار: خیزِ ورود با نشستِ back-out، پرتابِ خروج با مومنتوم */
1559function applyWords(ws,p,inA,inSpan,inDur,outA,outSpan,outDur){
1560  var n=ws.length||1,k,st,qi,qo,y;
1561  for(k=0;k<ws.length;k++){
1562    st=inA+(k/n)*inSpan;
1563    qi=bko(fseg(p,st,st+inDur));
1564    st=outA+(k/n)*outSpan;
1565    qo=fseg(p,st,st+outDur);qo*=qo;
1566    y=(1-qi)*132-qo*142;
1567    ws[k].style.transform='translateY('+y.toFixed(1)+'%) scale('+(0.9+0.1*Math.min(qi,1)).toFixed(3)+')';
1568  }
1569}
1570function applyCh(c,p){
1571  var ex=seg(p,0.84,0.99),exq=ex*ex;                 /* خروجِ شتاب‌گیر */
1572  var numE=seg(p,0.0,0.12),tagE=seg(p,0.02,0.14);
1573  var e1=seg(p,0.05,0.15),e1b=seg(p,0.08,0.32);      /* l1: پرده + وضوح */
1574  var d=seg(p,0.4,0.58);                             /* ضربِ دوم: l1 عقب می‌نشیند */
1575  var e2=seg(p,0.41,0.52),e2b=seg(p,0.45,0.66);
1576  var scE=seg(p,0.02,0.17);
1577  var b1=qb((1-e1b)*7),b2=qb((1-e2b)*7),bx=qb(9*ex);
1578  var ax=c.ax,ay=c.ay;
1579  /* برچسبِ فصل: خط‌های طلایی از دو سو باز می‌شوند، متن می‌نشیند */
1580  c.tag.style.opacity=(tagE*(1-ex)).toFixed(3);
1581  c.tag.style.transform='translateY('+((1-tagE)*16*ay-exq*18).toFixed(1)+'px)';
1582  for(var k=0;k<c.dashes.length;k++){
1583    c.dashes[k].style.transform='scaleX('+(tagE*(1-ex)).toFixed(3)+')';
1584  }
1585  /* خطِ اصلی: ورودِ کلمه‌به‌کلمه از پشتِ ماسک + دریفتِ جهت‌دار + بلور→وضوح */
1586  c.l1.style.opacity=(e1*(1-0.35*d)*(1-ex)).toFixed(3);
1587  c.l1.style.transform='translate('+((1-e1b)*30*ax).toFixed(1)+'px,'+(-d*15-exq*10).toFixed(1)+'px) scale('+(1-0.02*d).toFixed(3)+')';
1588  c.l1.style.filter=b1>0.2?'blur('+b1+'px)':'none';
1589  applyWords(c.w1,p,0.06,0.13,0.13,0.85,0.05,0.09);
1590  /* خطِ دوم: روی ضربِ بعدی — خیزِ ماسک + نشستِ مقیاس */
1591  c.l2.style.opacity=(e2*(1-ex)).toFixed(3);
1592  c.l2.style.transform='translate('+((1-e2b)*36*ax).toFixed(1)+'px,'+(-exq*6).toFixed(1)+'px) scale('+(0.962+0.038*bko(fseg(p,0.42,0.64))).toFixed(3)+')';
1593  c.l2.style.filter=b2>0.2?'blur('+b2+'px)':'none';
1594  applyWords(c.w2,p,0.43,0.11,0.14,0.86,0.05,0.09);
1595  /* خروجِ کلِ صحنه: مومنتومِ جهت‌دار + بلور */
1596  c.inner.style.transform='translate('+(52*exq*ax).toFixed(1)+'px,'+(-84*exq).toFixed(1)+'px) scale('+(1-0.05*exq).toFixed(3)+')';
1597  c.inner.style.filter=bx>0.2?'blur('+bx+'px)':'none';
1598  /* شماره: زودتر می‌آید، درشت→جا می‌افتد، پارالاکسِ عمیق‌تر */
1599  c.num.style.opacity=(0.9*numE*(1-ex)).toFixed(3);
1600  c.num.style.transform='translate(50%,-50%) translateY('+((0.5-p)*130).toFixed(1)+'px) scale('+(1.1-0.1*bko(fseg(p,0,0.24))).toFixed(3)+')';
1601  /* صحنه‌ی تصویری — پارالاکسِ نرم + ورودِ جهت‌دار */
1602  if(c.scene){
1603    c.scene.style.opacity=(scE*(1-ex)).toFixed(3);
1604    c.scene.style.transform='translate('+((1-scE)*-30*ax).toFixed(1)+'px,'+((1-scE)*34+(0.5-p)*-26).toFixed(1)+'px)';
1605  }
1606  for(var i=0;i<c.fx.length;i++){
1607    var f=c.fx[i],q=seg(p,f.a,f.b);
1608    if(f.kind==='draw'){
1609      f.el.style.strokeDashoffset=(1-q).toFixed(4);
1610      f.el.style.opacity=q>0.001?'1':'0';
1611    }else if(f.kind==='fade'){
1612      f.el.style.opacity=(1-q).toFixed(3);
1613    }else{
1614      f.el.style.opacity=q.toFixed(3);
1615      f.el.style.transform='scale('+(0.45+0.55*q).toFixed(3)+')';
1616    }
1617  }
1618}
1619
1620var ticking=false;
1621function update(){
1622  ticking=false;
1623  var y=window.scrollY;
1624  /* hero handoff */
1625  if(INTRO.done||y>4){
1626    var hp=clamp(y/(vh*0.85),0,1),he=sm(hp);
1627    wmWrap.style.opacity=(1-he).toFixed(3);
1628    wmWrap.style.transform='translateY('+(-46*he).toFixed(1)+'px) scale('+(1-0.05*he).toFixed(3)+')';
1629    cue.style.opacity=String(0.85*(1-clamp(y/(vh*0.25),0,1)));
1630  }
1631  if(INTRO.done||y>vh*0.6)topbar.classList.add('show');
1632  topbar.classList.toggle('scrolled',y>vh*0.5);
1633  applySky(y+vh*0.5);
1634  if(!RM){
1635    chapters.forEach(function(c){
1636      var p=(y-c.top)/(c.h-vh);
1637      if(p<-0.12||p>1.12){
1638        if(!c.off||!c.init){applyCh(c,clamp(p,-0.12,1.12));c.off=true;c.init=true}
1639        return;
1640      }
1641      c.off=false;c.init=true;
1642      applyCh(c,p);
1643    });
1644    /* مسیر با اسکرول کشیده می‌شود */
1645    if(trailLen){
1646      var sp=clamp((y+vh*0.55-storyTop)/(storyBot-storyTop),0,1);
1647      trail.style.strokeDashoffset=(trailLen*(1-sp)).toFixed(1);
1648      try{
1649        var pt=trail.getPointAtLength(trailLen*sp);
1650        trailHead.style.left=(pt.x/10).toFixed(3)+'%';
1651        trailHead.style.top=(pt.y/10.3).toFixed(3)+'%';
1652      }catch(e){}
1653      trailHead.style.opacity=(sp>0.004&&sp<0.997)?'1':'0';
1654      for(var i=0;i<tnodes.length;i++){
1655        tnodes[i].classList.toggle('on',sp>=NODE_F[i]-0.015);
1656      }
1657    }
1658    /* parallax on proof visuals */
1659    visMeta.forEach(function(v){
1660      var mid=v.top+v.h/2-(y+vh/2);
1661      if(Math.abs(mid)<vh){v.el.style.transform='translateY('+(mid*-0.045).toFixed(1)+'px)'}
1662    });
1663  }
1664}
1665function onScroll(){if(!ticking){ticking=true;requestAnimationFrame(update)}}
1666window.addEventListener('scroll',onScroll,{passive:true});
1667var rsT;
1668window.addEventListener('resize',function(){clearTimeout(rsT);rsT=setTimeout(function(){measure();update()},160)});
1669window.addEventListener('load',function(){measure();update()});
1670window.addEventListener('orientationchange',function(){setTimeout(function(){measure();update()},350)});
1671try{
1672  if(document.fonts&&document.fonts.ready)document.fonts.ready.then(function(){measure();update()});
1673}catch(e){}
1674measure();update();
1675
1676/* ————— reveals + count-up ————— */
1677function countUp(scope){
1678  scope.querySelectorAll('.num').forEach(function(el){
1679    if(el.dataset.did)return;el.dataset.did='1';
1680    var target=parseFloat(el.dataset.num),dec=parseInt(el.dataset.dec||'0',10),plain=!!el.dataset.plain;
1681    if(RM||!('requestAnimationFrame' in window)){el.textContent=faN(target,dec,plain);return}
1682    var t0=null,dur=1500;
1683    function step(ts){
1684      if(!t0)t0=ts;
1685      var k=clamp((ts-t0)/dur,0,1);
1686      var e=1-Math.pow(1-k,4);
1687      el.textContent=faN(target*e,dec,plain);
1688      if(k<1)requestAnimationFrame(step);else el.textContent=faN(target,dec,plain);
1689    }
1690    requestAnimationFrame(step);
1691  });
1692}
1693if('IntersectionObserver' in window&&!RM){
1694  var io=new IntersectionObserver(function(es){
1695    es.forEach(function(e){
1696      if(e.isIntersecting){
1697        e.target.classList.add('in');
1698        countUp(e.target);
1699        io.unobserve(e.target);
1700      }
1701    });
1702  },{threshold:0.22,rootMargin:'0px 0px -6% 0px'});
1703  document.querySelectorAll('[data-rv]').forEach(function(el){io.observe(el)});
1704}else{
1705  document.querySelectorAll('[data-rv]').forEach(function(el){el.classList.add('in');countUp(el)});
1706}
1707
1708/* ————— کارتِ دستیار — بازشدن درجا ————— */
1709var aiCard=$('aiCard'),aiPitch=$('aiPitch'),aiChatPane=$('aiChatPane'),
1710    glowbar=$('glowbar'),chatX=$('chatX'),msgs=$('msgs'),chipsEl=$('chips'),
1711    composer=$('composer'),input=$('q'),sendBtn=$('sendBtn'),
1712    quotaEl=$('quota'),gbPlus=$('gbPlus');
1713var busy=false,quotaFetched=false,quotaOut=false;
1714
1715/* چرخشِ نوارِ درخشان فقط وقتی دیده می‌شود */
1716if('IntersectionObserver' in window){
1717  var gio=new IntersectionObserver(function(es){
1718    es.forEach(function(e){glowbar.classList.toggle('live',e.isIntersecting)});
1719  },{rootMargin:'90px 0px'});
1720  gio.observe(glowbar);
1721}else{glowbar.classList.add('live')}
1722
1723function openCard(focus){
1724  if(aiCard.classList.contains('open'))return;
1725  aiCard.classList.add('open');
1726  aiPitch.setAttribute('aria-expanded','true');
1727  aiChatPane.setAttribute('aria-hidden','false');
1728  aiChatPane.inert = false;                       /* دوباره در ترتیبِ Tab */
1729  /* تیزر جمع می‌شود ولی visibility نمی‌گیرد؛ بی‌inert با Tab باز هم به آن می‌رسیم.
1730     تا فوکوس منتقل نشده بی‌اثرش نکن. */
1731  setTimeout(function(){ if(aiCard.classList.contains('open')) aiPitch.inert = true; },430);
1732  if(focus!==false)setTimeout(function(){try{input.focus({preventScroll:true})}catch(e){}},420);
1733  setTimeout(function(){
1734    try{aiCard.scrollIntoView({behavior:RM?'auto':'smooth',block:'center'})}catch(e){}
1735  },380);
1736  if(!quotaFetched){
1737    quotaFetched=true;
1738    /* کاربرِ واردشده با توکنش پرسیده می‌شود تا سهمیه‌ی خودش (نه سهمیه‌ی مهمان) نمایش داده شود */
1739    authToken().then(function(t){
1740      return fetch('/api/assistant/quota?guest_fingerprint='+encodeURIComponent(FP),
1741        {headers:t?{Authorization:'Bearer '+t}:{}});
1742    })
1743      .then(function(r){return r&&r.ok?r.json():null})
1744      .then(function(j){
1745        if(!j)return;
1746        if(typeof j.scope==='string')lastScope=j.scope;
1747        var n=j.remaining!=null?j.remaining:(j.quota_remaining!=null?j.quota_remaining:null);
1748        if(n!=null)setQuota(n);
1749        /* مهمانی که سؤال‌هایش روی این دستگاه تمام شده، قبل از نوشتن دیوار را می‌بیند */
1750        if(j.scope==='guest'&&parseInt(n,10)===0&&!busy&&!quotaOut)quotaCard('guest','');
1751      }).catch(function(){});
1752  }
1753}
1754function closeCard(){
1755  /* فوکوس داخلِ کارت بود؟ نباید در هوا بماند — تیزر همان چیزی است که جایش را می‌گیرد.
1756     (کادرِ پرسش هم داخلِ همین کارت است و input.blur پایین‌تر فوکوس را برمی‌دارد.) */
1757  var inPane=false;
1758  try{ inPane = aiCard.contains(document.activeElement); }catch(e){}
1759  aiPitch.inert = false;
1760  aiCard.classList.remove('open');
1761  aiPitch.setAttribute('aria-expanded','false');
1762  aiChatPane.setAttribute('aria-hidden','true');
1763  /* پنلِ بسته نباید با Tab قابلِ رسیدن باشد (WCAG 4.1.2) — aria-hidden به‌تنهایی
1764     عنصر را از ترتیبِ فوکوس بیرون نمی‌برد. */
1765  aiChatPane.inert = true;
1766  try{input.blur()}catch(e){}
1767  /* تیزر همین حالا از حالتِ جمع بیرون می‌آید؛ تا جا نیفتاده focus() نمی‌گیرد — چند فریم تلاش کن */
1768  if(inPane){
1769    var t=0, back=function(){
1770      try{ aiPitch.focus({preventScroll:true}); }catch(e){}
1771      if(document.activeElement===aiPitch) return;
1772      if(++t<10) setTimeout(back,60);
1773    };
1774    requestAnimationFrame(back);
1775  }
1776}
1777aiChatPane.addEventListener('transitionend',function(e){
1778  if(e.propertyName==='grid-template-rows'&&aiCard.classList.contains('open')&&!input.disabled&&!busy){
1779    try{input.focus({preventScroll:true})}catch(err){}
1780  }
1781});
1782aiPitch.addEventListener('click',function(){openCard(true)});
1783aiPitch.addEventListener('keydown',function(e){
1784  if(e.key==='Enter'||e.key===' '){e.preventDefault();openCard(true)}
1785});
1786input.addEventListener('focus',function(){openCard(false);glowbar.classList.add('hot')});
1787input.addEventListener('blur',function(){if(!input.value)glowbar.classList.remove('hot')});
1788gbPlus.addEventListener('click',function(){openCard(true)});
1789chatX.addEventListener('click',closeCard);
1790if(chipsEl){
1791  chipsEl.addEventListener('click',function(e){
1792    var b=e.target.closest('.chip');
1793    if(!b||busy||quotaOut)return;
1794    input.value=b.textContent.trim();
1795    if(typeof composer.requestSubmit==='function')composer.requestSubmit();
1796    else composer.dispatchEvent(new Event('submit',{cancelable:true}));
1797  });
1798}
1799document.addEventListener('keydown',function(e){
1800  if(e.key==='Escape'&&aiCard.classList.contains('open'))closeCard();
1801});
1802msgs.addEventListener('click',function(e){
1803  if(e.target.closest('[data-close]'))closeCard();
1804});
1805function setQuota(n){
1806  var v=parseInt(n,10);
1807  if(isNaN(v)){quotaEl.textContent='';return}
1808  quotaEl.textContent=faN(v,0,true)+' پرسشِ باقی‌مانده';
1809}
1810input.addEventListener('input',function(){
1811  glowbar.classList.toggle('hot',document.activeElement===input||!!input.value);
1812});
1813
1814/* ————— هویتِ گفت‌وگو: کاربرِ واردشده با توکن، مهمان با اثرانگشتِ دستگاه ————— */
1815var lastScope=''; /* آخرین scope که سرور گفت: guest | free | subscription */
1816function hasSession(){return !!(store(true,'bx_at')||store(true,'bx_rt'))}
1817function withTimeout(p,ms){
1818  return new Promise(function(ok,no){
1819    var t=setTimeout(function(){no(new Error('timeout'))},ms);
1820    p.then(function(v){clearTimeout(t);ok(v)},function(e){clearTimeout(t);no(e)});
1821  });
1822}
1823/* زمانِ انقضای JWT (ثانیه)؛ اگر خوانا نبود ۰ — داوری با سرور */
1824function jwtExp(t){
1825  try{
1826    var p=String(t).split('.')[1];if(!p)return 0;
1827    p=p.replace(/-/g,'+').replace(/_/g,'/');while(p.length%4)p+='=';
1828    var o=JSON.parse(atob(p));
1829    return typeof o.exp==='number'?o.exp:0;
1830  }catch(e){return 0}
1831}
1832/* تمدیدِ توکن — همان قراردادِ پنل (/auth/refresh)، تک‌درخواستی، با سقفِ زمان برای اینترنتِ کند */
1833var _refreshing=null,refreshDead=false; /* ردِ قطعیِ سرور → در این صفحه دوباره تلاش نمی‌کنیم */
1834function refreshAt(){
1835  var rt=store(true,'bx_rt');
1836  if(!rt||refreshDead)return Promise.resolve(null);
1837  if(_refreshing)return _refreshing;
1838  _refreshing=withTimeout(fetch('/api/auth/refresh',{
1839    method:'POST',headers:{'Content-Type':'application/json'},
1840    body:JSON.stringify({refresh_token:rt})
1841  }),9000)
1842    .then(function(r){
1843      if(r&&(r.status===401||r.status===403))refreshDead=true;
1844      return r&&r.ok?r.json():null;
1845    })
1846    .then(function(j){
1847      if(!j||typeof j.access_token!=='string')return null;
1848      store(false,'bx_at',j.access_token);
1849      if(typeof j.refresh_token==='string')store(false,'bx_rt',j.refresh_token);
1850      return j.access_token;
1851    })
1852    .catch(function(){return null})
1853    .then(function(v){_refreshing=null;return v});
1854  return _refreshing;
1855}
1856/* توکنِ معتبر یا null. هیچ‌وقت خطا نمی‌دهد؛ اگر تمدید نشد، گفت‌وگو مثلِ مهمان ادامه می‌یابد */
1857function authToken(){
1858  var at=store(true,'bx_at'),exp=at?jwtExp(at):0;
1859  if(at&&(!exp||exp*1000-Date.now()>30000))return Promise.resolve(at);
1860  if(!store(true,'bx_rt'))return Promise.resolve(null);
1861  return refreshAt();
1862}
1863/* رویدادِ قیف — بی‌صدا، بی‌انتظار، هرگز مانعِ رابط نیست */
1864function track(ev){
1865  try{
1866    var h={'Content-Type':'application/json'},t=store(true,'bx_at');
1867    if(t)h.Authorization='Bearer '+t;
1868    fetch('/api/track',{method:'POST',keepalive:true,headers:h,
1869      body:JSON.stringify({path:location.pathname,event:ev})}).catch(function(){});
1870  }catch(e){}
1871}
1872
1873/* ————— چتِ زنده ————— */
1874var HIST=[]; /* تا ۶ نوبتِ آخر */
1875function addUser(t){
1876  var d=document.createElement('div');d.className='m user';d.textContent=t;
1877  msgs.appendChild(d);
1877msgs.scrollTop=msgs.scrollHeight;
1878}
1879function thinkSvg(){
1880  return '<svg class="tb" viewBox="30 26 156 228" aria-hidden="true">'
1881    +'<use class="tbGlow" href="#bxMarkBold" stroke="url(#specGV)" style="filter:blur(6px)"/>'
1882    +'<use href="#bxMarkBold" stroke="#2E2C3E"/>'
1883    +'<g mask="url(#tbM)"><rect class="tbs" x="-210" y="26" width="210" height="228" fill="url(#specGV)"/></g>'
1884    +'</svg>';
1885}
1886function addAi(thinking){
1887  var d=document.createElement('div');d.className='m ai'+(thinking?' think':'');
1888  d.innerHTML='<span class="av"><svg viewBox="30 26 156 228" aria-hidden="true"><use href="#bxMarkBold" stroke="currentColor"/></svg></span><div class="tx"></div>';
1889  msgs.appendChild(d);msgs.scrollTop=msgs.scrollHeight;
1890  return d;
1891}
1892function mk(tag,cls,text){
1893  var e=document.createElement(tag);
1894  if(cls)e.className=cls;
1895  if(text!=null)e.textContent=text;
1896  return e;
1897}
1898var X_SVG='<svg width="12" height="12" viewBox="0 0 13 13" fill="none" aria-hidden="true"><path d="M2 2 L11 11 M11 2 L2 11" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>';
1899
1900/* ————— لینک‌سازیِ امن ————— */
1901/* فقط مسیرهای شناخته‌شده‌ی bixa.ai و لینکِ MPay لمس‌پذیر می‌شوند؛ باقی همان متن می‌ماند.
1902   همه‌چیز با createElement/textContent ساخته می‌شود — متنِ مدل هرگز به innerHTML نمی‌رسد. */
1903var LINK_RE=/(?:https?:\/\/)?(?:www\.)?(bixa\.ai|app\.mpay\.cards)((?:[\/?#][A-Za-z0-9\-._~\/?#=&%+]*)?)/gi;
1904var BIXA_ROUTES={'':1,auth:1,app:1,project:1,signup:1,login:1};
1905function linkFor(host,rest){
1906  host=host.toLowerCase();
1907  if(host==='app.mpay.cards'){
1908    if(rest&&!/^[\/?]/.test(rest))return null;
1909    return {href:'https://app.mpay.cards'+(rest||''),ext:true};
1910  }
1911  var m=/^(\/[A-Za-z0-9\-._~\/%]*)?([?#].*)?$/.exec(rest||'');
1912  if(!m)return null;
1913  var path=(m[1]||'/').toLowerCase();
1914  if(path.indexOf('//')===0)return null;
1915  var seg=path.split('/')[1]||'';
1916  if(!BIXA_ROUTES.hasOwnProperty(seg))return null;
1917  return {href:path+(m[2]||''),ext:false};
1918}
1919function renderRich(el,text){
1920  text=String(text||'').replace(/^\s+|\s+$/g,'');
1921  el.textContent='';
1922  var last=0,m;
1923  LINK_RE.lastIndex=0;
1924  while((m=LINK_RE.exec(text))){
1925    var s=m.index,raw=m[0],prev=s>0?text.charAt(s-1):'';
1926    /* بخشی از یک دامنه‌ی بزرگ‌تر یا ایمیل نباشد (notbixa.ai، [email protected]) */
1927    if(prev&&/[A-Za-z0-9_.@\-\/]/.test(prev))continue;
1928    /* نشانه‌گذاریِ پایانِ جمله جزوِ لینک نیست */
1929    var tail=raw.match(/[.,:;!?)\]]+$/);
1930    if(tail)raw=raw.slice(0,raw.length-tail[0].length);
1931    var nx=text.charAt(s+raw.length);
1932    /* دامنه ادامه دارد (bixa.ai.example.com) → لینک نمی‌شود */
1933    if(/[A-Za-z0-9\-_@]/.test(nx)||(nx==='.'&&/[A-Za-z0-9]/.test(text.charAt(s+raw.length+1))))continue;
1934    var hm=/^(?:https?:\/\/)?(?:www\.)?(bixa\.ai|app\.mpay\.cards)(.*)$/i.exec(raw);
1935    var L=hm&&linkFor(hm[1],hm[2]);
1936    if(!L)continue;
1937    if(s>last)el.appendChild(document.createTextNode(text.slice(last,s)));
1938    var a=mk('a','lnk',raw);
1939    a.href=L.href;a.dir='ltr';
1940    if(L.ext){a.target='_blank';a.rel='noopener noreferrer'}
1941    el.appendChild(a);
1942    last=s+raw.length;
1943    LINK_RE.lastIndex=last;
1944  }
1945  if(last<text.length)el.appendChild(document.createTextNode(text.slice(last)));
1946}
1947
1948/* ————— دیوارِ سهمیه ————— */
1949/* kind: guest (سؤال‌های مهمانِ این دستگاه تمام شده — بازگشتی ندارد) | global (سقفِ روزانه‌ی کلِ سایت)
1950         | member (سهمیه‌ی عضو؛ متنِ خودِ سرور نمایش داده می‌شود) */
1951function quotaCard(kind,serverMsg){
1952  if(quotaOut)return;
1953  var d=mk('div','m sys'),session=hasSession(),ph,title,body,cta=null;
1954  if(kind==='global'){
1955    title='ظرفیتِ امروزِ دستیار پر شده است.';
1956    body='فردا دوباره امتحان کن.';
1957    ph='فردا دوباره باز می‌شود…';
1958    if(!session){
1959      body+=' در این فاصله، با حسابِ رایگان مانیفست و پروژه‌ی رایگان برایت باز است.';
1960      cta={t:'ساختِ حسابِ رایگان',h:'/auth?from=chat_quota',gold:true};
1961    }
1962  }else if(kind==='member'){
1963    title=serverMsg||'سهمیه‌ی پرسشت فعلاً تمام شده است.';
1964    body='';
1965    ph='سهمیه‌ی پرسشت فعلاً تمام شده است…';
1966    cta={t:'رفتن به پنل',h:'/app',gold:false};
1967  }else if(session){
1968    /* توکن روی دستگاه هست ولی سرور مهمان دید (نشستِ منقضی) → راهِ برگشت به حساب */
1969    title='سؤال‌های مهمان روی این دستگاه تمام شد.';
1970    body='به پنلت برگرد تا گفت‌وگو را با حسابِ خودت ادامه بدهی.';
1971    ph='برای ادامه، به پنلت برگرد…';
1972    cta={t:'رفتن به پنل',h:'/app',gold:true};
1973  }else{
1974    title='سؤال‌های مهمان روی این دستگاه تمام شد.';
1975    body='با حسابِ رایگان، گفت‌وگو با دستیار را در پنلِ خودت ادامه می‌دهی و مانیفست و پروژه‌ی رایگان هم برایت باز می‌شوند.';
1976    ph='برای ادامه، حسابِ رایگانت را بساز…';
1977    cta={t:'ساختِ حسابِ رایگان',h:'/auth?from=chat_quota',gold:true};
1978  }
1979  d.appendChild(mk('b','',title));
1980  if(body)d.appendChild(mk('p','',body));
1981  if(cta){
1982    var a=mk('a','sys-cta'+(cta.gold?' gold':''),cta.t);a.href=cta.h;
1983    d.appendChild(a);
1984  }
1985  msgs.appendChild(d);
1985msgs.scrollTop=msgs.scrollHeight;
1986  quotaOut=true;
1987  /* شمارنده‌ی بالای کارت با دیوار هم‌خوان شود */
1988  if(kind==='global')quotaEl.textContent='';else setQuota(0);
1989  input.value='';input.disabled=true;sendBtn.disabled=true;
1990  input.placeholder=ph;
1991  glowbar.classList.remove('hot');
1992  if(chipsEl)chipsEl.classList.add('gone');
1993}
1994/* بدنه‌ی ۴۲۹: detail یا رشته است یا {scope, message} (بک‌اندِ تازه). هر دو را می‌فهمیم. */
1995function quotaFrom429(j,sentAuth){
1996  var det=j&&j.detail,msg='',sc='';
1997  if(typeof det==='string')msg=det;
1998  else if(det&&typeof det==='object'){
1999    if(typeof det.message==='string')msg=det.message;
2000    if(typeof det.scope==='string')sc=det.scope;
2001  }
2002  if(!sc&&j&&typeof j.scope==='string')sc=j.scope;
2003  if(sc==='global')return quotaCard('global',msg);
2004  if(sc==='guest')return quotaCard('guest',msg);
2005  if(sc)return quotaCard('member',msg);
2006  /* بک‌اندِ قدیمی: scope ندارد */
2007  if(sentAuth)return quotaCard('member',msg);
2008  /* برای مهمان فقط سقفِ سراسری از «فردا» حرف می‌زند */
2009  quotaCard(/فردا/.test(msg)?'global':'guest',msg);
2010}
2011
2012/* ————— دعوتِ آرام به حساب، یک بار، بعد از دومین پاسخِ موفقِ مهمان ————— */
2013var guestAnswers=0,nudgeShown=false;
2014var NUDGE_KEY='bx_chat_nudge';
2015function isGuestNow(){
2016  if(hasSession())return false;
2017  return lastScope?lastScope==='guest':true;
2018}
2019function maybeNudge(aiEl){
2020  if(!isGuestNow())return;
2021  guestAnswers++;
2022  if(guestAnswers<2||nudgeShown||quotaOut||store(true,NUDGE_KEY)==='1')return;
2023  if(!aiEl.parentNode)return;
2024  nudgeShown=true;
2025  var d=mk('div','m nudge');
2026  d.setAttribute('role','note');
2027  d.appendChild(mk('b','','با حسابِ رایگان، گفت‌وگو با دستیار را در پنلِ خودت ادامه می‌دهی.'));
2028  d.appendChild(mk('p','','مانیفست و پروژه‌ی رایگان هم برایت باز می‌شوند و مسیرت از همان‌جا شروع می‌شود.'));
2029  var a=mk('a','ng-cta','ساختِ حسابِ رایگان');
2030  a.href='/auth?from=chat';
2031  a.addEventListener('click',function(){
2032    store(false,NUDGE_KEY,'1');
2033    track('chat_signup_cta_click');
2034  });
2035  d.appendChild(a);
2036  var x=mk('button','ng-x');
2037  x.type='button';x.setAttribute('aria-label','بستن');x.innerHTML=X_SVG;
2038  x.addEventListener('click',function(){
2039    store(false,NUDGE_KEY,'1');
2040    d.classList.add('out');
2041    setTimeout(function(){if(d.parentNode)d.parentNode.removeChild(d)},RM?0:260);
2042    try{input.focus({preventScroll:true})}catch(e){}
2043  });
2044  d.appendChild(x);
2045  msgs.insertBefore(d,aiEl.nextSibling);
2046  msgs.scrollTop=msgs.scrollHeight;
2047  track('chat_signup_cta_shown');
2048}
2049
2050/* تایپ‌رایتر روی استریمِ خام؛ در پایان یک بار متنِ کامل با لینک‌های لمس‌پذیر رندر می‌شود */
2051function typewriter(el,onEnd){
2052  var st={target:'',shown:0,done:false,raf:0,ended:false};
2053  function finish(){
2054    if(st.ended)return;
2055    st.ended=true;
2056    cancelAnimationFrame(st.raf);
2057    el.classList.remove('stream');
2058    renderRich(el,st.target);
2059    msgs.scrollTop=msgs.scrollHeight;
2060    if(onEnd)onEnd();
2061  }
2062  function loop(){
2063    if(st.ended)return;
2064    if(st.shown<st.target.length){
2065      var remain=st.target.length-st.shown;
2066      st.shown+=Math.max(1,Math.min(6,Math.round(remain*0.07)));
2067      if(st.shown>st.target.length)st.shown=st.target.length;
2068      el.textContent=st.target.slice(0,st.shown);
2069      msgs.scrollTop=msgs.scrollHeight;
2070    }
2071    if(!st.done||st.shown<st.target.length){st.raf=requestAnimationFrame(loop)}
2072    else finish();
2073  }
2074  st.finish=finish;
2075  el.classList.add('stream');
2076  st.raf=requestAnimationFrame(loop);
2077  return st;
2078}
2079
2080/* سقفِ انتظار برای اینترنتِ کند: تا اولین پاسخ و بینِ دو تکه‌ی استریم */
2081var T_FIRST=45000,T_IDLE=35000;
2082
2083composer.addEventListener('submit',function(ev){
2084  ev.preventDefault();
2085  var q=input.value.trim();
2086  if(!q||busy||quotaOut)return;
2087  openCard(false);
2088  busy=true;sendBtn.disabled=true;
2089  input.value='';
2090  addUser(q);
2091  if(chipsEl)chipsEl.classList.add('gone');
2092  var aiEl=addAi(true);
2093  var tx=aiEl.querySelector('.tx');
2094  tx.innerHTML=thinkSvg()+'<span>در حال فکر کردن…</span>';
2095
2096  /* نوبتِ کاربر خوش‌بینانه ثبت می‌شود تا تلاشِ دوباره زمینه را از دست ندهد */
2097  var uTurn={role:'user',content:q};
2098  var sentHist=HIST.slice(-12);
2099  HIST.push(uTurn);
2100  var tw=null,done=false,answerOk=false,sentAuth=false,timedOut=false,dog=0;
2101  var ctl=(typeof AbortController==='function')?new AbortController():null;
2102
2103  function popTurn(){if(HIST[HIST.length-1]===uTurn)HIST.pop()}
2104  function keepAnswer(t){
2105    HIST.push({role:'assistant',content:t});
2106    if(HIST.length>12)HIST=HIST.slice(-12);
2107  }
2108  /* پایانِ قطعیِ این درخواست — هر مسیری که برود، دکمه و ورودی آزاد می‌شوند */
2109  function settle(){
2110    if(done)return false;
2111    done=true;clearTimeout(dog);
2112    busy=false;
2113    if(!quotaOut){
2114      sendBtn.disabled=false;
2115      try{input.focus({preventScroll:true})}catch(e){}
2116    }
2117    return true;
2118  }
2119  /* نگهبان: اگر شبکه ساکت ماند، درخواست بسته و حالتِ «در حال فکر» برداشته می‌شود */
2120  function watch(ms){
2121    clearTimeout(dog);
2122    dog=setTimeout(function(){
2123      if(done)return;
2124      timedOut=true;
2125      if(ctl){try{ctl.abort()}catch(e){}}
2126      fail();
2127    },ms);
2128  }
2129  function fail(err){
2130    if(done)return;
2131    aiEl.classList.remove('think');
2132    if(tw&&tw.target.replace(/\s+/g,'')){
2133      /* پاسخِ نیمه‌کاره هم زمینه است — نگهش می‌داریم */
2134      tw.done=true;tw.shown=tw.target.length;tw.finish();
2135      keepAnswer(tw.target);
2136      tx.appendChild(mk('span','note','ارتباط قطع شد؛ ادامه را کمی بعد بپرس.'));
2137    }else{
2138      if(tw){tw.done=true;tw.finish()}
2139      popTurn();
2140      var st=err&&err.status;
2141      tx.textContent=st===422?'پرسشت را کمی کامل‌تر بنویس و دوباره بفرست.'
2142        :(err&&err.empty)?'پاسخی نرسید. یک بار دیگر بپرس.'
2143        :timedOut?'پاسخ دیر رسید. اتصالت را بررسی کن و دوباره بپرس.'
2144        :'ارتباط برقرار نشد. کمی بعد دوباره امتحان کن.';
2145      tx.style.color='var(--mut)';
2146      /* پرسش گم نشود — روی اینترنتِ ناپایدار فقط یک لمس تا تلاشِ دوباره */
2147      if(!input.value&&!quotaOut)input.value=q;
2148    }
2149    msgs.scrollTop=msgs.scrollHeight;
2150    settle();
2151  }
2152  function complete(){
2153    if(done)return;
2154    if(!tw.target.replace(/\s+/g,'')){fail({empty:true});return}
2155    answerOk=true;
2156    tw.done=true;
2157    keepAnswer(tw.target);
2158    settle();
2159  }
2160
2161  watch(T_FIRST);
2162  authToken().then(function(t){
2163    if(done)return null;
2164    sentAuth=!!t;
2165    var headers={'Content-Type':'application/json'};
2166    if(t)headers.Authorization='Bearer '+t;
2167    var opts={method:'POST',headers:headers,
2168      body:JSON.stringify({question:q,guest_fingerprint:FP,history:sentHist})};
2169    if(ctl)opts.signal=ctl.signal;
2170    return fetch('/api/assistant/ask',opts);
2171  }).then(function(res){
2172    if(!res||done)return null;
2173    if(res.status===429){
2174      return res.json().catch(function(){return null}).then(function(j){
2175        if(done)return;
2176        aiEl.remove();popTurn();
2177        quotaFrom429(j,sentAuth);
2178        settle();
2179      });
2180    }
2181    if(!res.ok){var e=new Error('http');e.status=res.status;throw e}
2182    try{
2183      var sc=res.headers.get('X-Quota-Scope');if(sc)lastScope=sc;
2184      var qh=res.headers.get('X-Quota-Remaining');if(qh!=null&&qh!=='')setQuota(qh);
2185    }catch(e){}
2186    aiEl.classList.remove('think');tx.textContent='';
2187    tw=typewriter(tx,function(){if(answerOk)maybeNudge(aiEl)});
2188    watch(T_IDLE);
2189    /* مرورگرِ بدونِ استریم: کلِ متن یک‌جا */
2190    if(!res.body||typeof res.body.getReader!=='function'){
2191      return res.text().then(function(t){
2192        if(done)return;
2193        tw.target=t||'';complete();
2194      });
2195    }
2196    var reader=res.body.getReader(),dec=new TextDecoder();
2197    function pump(){
2198      return reader.read().then(function(r){
2199        if(done){try{reader.cancel()}catch(e){}return}
2200        if(r.done){
2201          tw.target+=dec.decode(); /* flush آخرین نویسه‌ی چندبایتی فارسی */
2202          complete();
2203          return;
2204        }
2205        watch(T_IDLE);
2206        tw.target+=dec.decode(r.value,{stream:true});
2207        return pump();
2208      });
2209    }
2210    return pump();
2211  }).then(null,function(err){fail(err)});
2212});
2213})();
2214</script>
2214
2215</body>
2216</html>
2217
2218<script>
2219/* ————— سشن‌آگاهی: اگر کاربر لاگین است، CTAهای «ورود» را به «پنلِ من» تبدیل کن ————— */
2220(function(){
2221  var t = null;
2222  try{ t = localStorage.getItem('bx_at') || localStorage.getItem('bx_rt'); }catch(e){}
2223
2224  /* رویدادِ قیف روی دکمه‌های اصلیِ لندینگ — بی‌صدا، keepalive تا با رفتنِ صفحه گم نشود، هرگز مانعِ کلیک نیست */
2225  function ctaTrack(){
2226    try{
2227      var h = {'Content-Type':'application/json'}, at = null;
2228      try{ at = localStorage.getItem('bx_at'); }catch(e){}
2229      if(at) h.Authorization = 'Bearer ' + at;
2230      fetch('/api/track', {method:'POST', keepalive:true, headers:h,
2231        body: JSON.stringify({path: location.pathname, event: 'landing_cta_click'})}).catch(function(){});
2232    }catch(e){}
2233  }
2234  var btns = document.querySelectorAll('.tb-start, #heroCta, .invite .cta');
2235  for(var i = 0; i < btns.length; i++){
2236    try{ btns[i].addEventListener('click', ctaTrack); }catch(e){}
2237  }
2238
2239  if(!t) return;
2240  var nav = document.querySelector('.tb-start');
2241  if(nav){ nav.textContent = 'پنلِ من'; nav.setAttribute('href','/app'); }
2242  /* دکمه‌ی هیرو و دکمه‌ی پایانی: همان شکل، مقصدِ پنل */
2243  var ctas = document.querySelectorAll('#heroCta, .invite .cta');
2244  for(var k = 0; k < ctas.length; k++){
2245    var cta = ctas[k];
2246    var arr = cta.querySelector('svg');            /* فلش را نگه دار */
2247    cta.textContent = 'برگرد به پنل';
2248    if(arr) cta.appendChild(arr);
2249    cta.setAttribute('href','/app');
2250  }
2251  var sub = document.querySelector('.cta-sub');    /* «حساب داری؟ وارد شو» برای لاگین‌شده بی‌معناست */
2252  if(sub && sub.parentNode) sub.parentNode.style.display = 'none';
2253})();
2254</script>
2254
2255
2256<script src="/redesign.js"></script>
vendor: 1 bytes, line 2256
2256
2257<script src="/scroll-scenes.js"></script>
vendor: 1 bytes, line 2257
2257

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.