Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
845 lines (843 loc) · 153 KB
/
Copy pathindex.html
File metadata and controls
845 lines (843 loc) · 153 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' https://mc.yandex.ru https://mc.yandex.com https://yastatic.net; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; font-src 'self' data:; connect-src 'self' https: wss:; frame-src 'self' blob: https:; worker-src 'self' blob:; media-src 'self' data: blob:; manifest-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests">
<meta name="referrer" content="strict-origin-when-cross-origin">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>Создание сайтов, телеграм-ботов и презентаций — YSD DEV, Казань</title>
<meta name="description" content="Сайты от 9 000 ₽, Telegram-боты от 12 000 ₽, презентации от 7 000 ₽. Смета и срок в первый день, макет до оплаты. Казань и вся Россия удалённо.">
<link rel="canonical" href="https://ysddev.com/">
<meta name="theme-color" content="#000000">
<meta name="format-detection" content="telephone=no">
<meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1">
<meta name="author" content="YSD DEV">
<meta property="og:type" content="website">
<meta property="og:url" content="https://ysddev.com/">
<meta property="og:site_name" content="YSD DEV">
<meta property="og:locale" content="ru_RU">
<meta property="og:title" content="Создание сайтов, телеграм-ботов и презентаций — YSD DEV, Казань">
<meta property="og:description" content="46 работ в портфолио, прайс на 54 услуги, смета и срок в первый день. Рейтинг 4,89 · 35 отзывов. Казань, удалённо по всей России.">
<meta property="og:image" content="https://ysddev.com/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://ysddev.com/og.png">
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png">
<link rel="icon" type="image/png" sizes="96x96" href="/icon-96.png">
<link rel="icon" type="image/png" sizes="192x192" href="/icon-192.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<title>YSD DEV</title><link rel="preload" href="/fonts/onest.woff2" as="font" type="font/woff2" crossorigin>
<style>@font-face{font-family:"Onest";src:url(/fonts/onest.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}:root{--bg:#000;--ink:#fff;--dim:#8a8a8a;--line:rgba(255,255,255,.14);--card:rgba(255,255,255,.035);--card-h:rgba(255,255,255,.07);--f:"Onest",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;--m:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;--pad:clamp(20px,5vw,72px)}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--f);font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;overflow-x:hidden}img{max-width:100%;display:block}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}.field{position:fixed;inset:0;z-index:0;pointer-events:none}.field .grid{position:absolute;inset:-2px;background-image:linear-gradient(var(--line) 1px,transparent 1px),linear-gradient(90deg,var(--line) 1px,transparent 1px);background-size:72px 72px;opacity:.28;-webkit-mask-image:radial-gradient(120% 90% at 50% 0%,#000 0%,transparent 72%);mask-image:radial-gradient(120% 90% at 50% 0%,#000 0%,transparent 72%)}.field .glow{position:absolute;left:50%;top:-30vh;width:120vmax;height:100vmax;transform:translateX(-50%);background:radial-gradient(closest-side,rgba(255,255,255,.10),transparent 70%)}.field .noise{position:absolute;inset:0;opacity:.045;mix-blend-mode:screen;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}.field .cursor{position:absolute;left:0;top:0;width:640px;height:640px;margin:-320px 0 0 -320px;border-radius:50%;background:radial-gradient(closest-side,rgba(255,255,255,.10),rgba(255,255,255,.035) 42%,transparent 72%);transform:translate3d(-999px,-999px,0);will-change:transform;opacity:0;transition:opacity .5s ease}.field .cursor.on{opacity:1}.orbit{--cw:clamp(210px,23vw,330px);position:relative;height:calc(var(--cw)*.95);margin:clamp(26px,4vw,48px) 0 0 calc(50% - 50vw);width:100vw;perspective:1700px;perspective-origin:50% 42%;overflow:hidden;touch-action:pan-y;cursor:grab;user-select:none;-webkit-user-select:none;-webkit-mask-image:linear-gradient(90deg,transparent,#000 14%,#000 86%,transparent);mask-image:linear-gradient(90deg,transparent,#000 14%,#000 86%,transparent)}.orbit.drag{cursor:grabbing}.orbit .ring{position:absolute;left:50%;top:44%;width:0;height:0;transform-style:preserve-3d}.orbit figure{position:absolute;margin:0;width:var(--cw);aspect-ratio:16/9;left:calc(var(--cw)/-2);top:calc(var(--cw)*-.28);border-radius:12px;overflow:hidden;border:1px solid rgba(255,255,255,.18);background:#0b0b0c;box-shadow:0 30px 70px -20px rgba(0,0,0,.9),0 0 50px rgba(255,255,255,.06);backface-visibility:hidden;-webkit-backface-visibility:hidden;cursor:pointer}.orbit figure img{width:100%;height:100%;object-fit:cover;display:block;opacity:0;transition:opacity .8s}.orbit figure img.ok{opacity:1}.orbit figure::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(115deg,transparent 38%,rgba(255,255,255,.16) 50%,transparent 62%);background-size:260% 100%;animation:cardsheen 5s ease-in-out infinite}@keyframes cardsheen{0%{background-position:120% 0}50%,100%{background-position:-30% 0}}.orbit .hint{position:absolute;left:50%;bottom:0;transform:translateX(-50%);font-family:var(--m);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim);opacity:.7;white-space:nowrap}.works figure.live .ph{animation:rise .9s cubic-bezier(.2,.8,.2,1) both;animation-delay:calc(var(--k,0)*70ms)}@keyframes rise{from{opacity:0;transform:perspective(900px) translateY(36px) rotateX(12deg)}to{opacity:1}}.works .ph img{animation:drift 16s ease-in-out infinite alternate;animation-delay:calc(var(--k,0)*-1.9s)}@keyframes drift{0%{transform:scale(1.03) translate(0,0)}50%{transform:scale(1.07) translate(-1.4%,-.8%)}100%{transform:scale(1.05) translate(1.2%,.6%)}}.works figure:hover .ph img{animation-play-state:paused}@media(prefers-reduced-motion:reduce){.works .ph img,.orbit figure::after,.works figure.live .ph{animation:none}}.field canvas.sky{position:absolute;inset:0;width:100%;height:100%}.hero-mark{animation:mkglow 5.5s ease-in-out infinite}@keyframes mkglow{0%,100%{filter:drop-shadow(0 0 20px rgba(255,255,255,.22))}50%{filter:drop-shadow(0 0 42px rgba(255,255,255,.42)) drop-shadow(0 0 110px rgba(255,255,255,.16))}}.brand .mk{transition:filter .4s}.brand:hover .mk{filter:drop-shadow(0 0 10px rgba(255,255,255,.75))}h1 .stroke{background:linear-gradient(100deg,transparent 0 45%,rgba(255,255,255,.9) 50%,transparent 55% 100%);background-size:300% 100%;background-position:130% 0;-webkit-background-clip:text;background-clip:text;animation:shine 7s ease-in-out 1.4s infinite}@keyframes shine{0%{background-position:130% 0}45%,100%{background-position:-30% 0}}h2{background:linear-gradient(180deg,#fff 30%,#a6a6ac 115%);-webkit-background-clip:text;background-clip:text;color:transparent}.hero .cta .btn:not(.ghost){animation:ctaglow 3.4s ease-in-out infinite}@keyframes ctaglow{0%,100%{box-shadow:0 0 0 0 rgba(255,255,255,0)}50%{box-shadow:0 0 34px 2px rgba(255,255,255,.28)}}.pack::before{content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1px;pointer-events:none;opacity:0;transition:opacity .35s;background:radial-gradient(340px circle at var(--mx,50%) var(--my,0%),rgba(255,255,255,.6),transparent 62%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pack:hover::before{opacity:1}@media(prefers-reduced-motion:reduce){.hero-mark,h1 .stroke,.hero .cta .btn{animation:none}}@media (hover:none),(pointer:coarse),(prefers-reduced-motion:reduce){.field .cursor{display:none}}main,header,footer{position:relative;z-index:1}#works,#reviews,#prices,#price,#faq,#brief,#how,#detail,#what,#art{content-visibility:auto;contain-intrinsic-size:auto 900px}.wrap{max-width:1180px;margin:0 auto;padding:0 var(--pad)}@media(min-width:1500px){.wrap{max-width:1440px}}section{padding:clamp(64px,10vw,130px) 0;border-top:1px solid var(--line);scroll-margin-top:68px}.lb:not(.on){content-visibility:hidden}img{max-width:100%}@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;transition-duration:.01ms!important}html{scroll-behavior:auto}}.eyebrow{font-family:var(--m);font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);display:flex;align-items:center;gap:12px;margin:0 0 26px}.eyebrow::after{content:"";height:1px;flex:1;background:var(--line)}h2{font-size:clamp(30px,5.2vw,58px);line-height:1.02;letter-spacing:-.03em;font-weight:700;margin:0 0 18px}.lead{color:var(--dim);max-width:56ch;font-size:clamp(15px,1.6vw,18px);margin:0}header{position:sticky;top:0;z-index:50;backdrop-filter:blur(12px);background:rgba(0,0,0,.72);border-bottom:1px solid transparent;transition:border-color .3s}header.stuck{border-bottom-color:var(--line)}.bar{display:flex;align-items:center;gap:22px;height:68px}.brand{display:flex;align-items:center;gap:11px;margin-right:auto}.brand .mk{height:22px;width:auto;color:#fff;flex:none}nav.links{display:flex;gap:26px}nav.links a{font-size:14px;color:var(--dim);transition:color .2s;position:relative}nav.links a::after{content:"";position:absolute;left:0;bottom:-6px;height:1px;width:0;background:#fff;transition:width .25s}nav.links a:hover{color:#fff}nav.links a:hover::after{width:100%}.lang{display:flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;font-family:var(--m);font-size:11px;letter-spacing:.1em}.lang button{padding:7px 12px;color:var(--dim);transition:.2s}.lang button[aria-pressed="true"]{background:#fff;color:#000}@media(max-width:860px){nav.links{display:none}}@media(max-width:620px){header,.mbar,.menu{backdrop-filter:none}header{background:rgba(0,0,0,.94)}.mbar{background:rgba(0,0,0,.94)}.menu{background:#000}}.burger{display:none;width:42px;height:42px;border:1px solid var(--line);border-radius:12px;place-items:center;flex-direction:column;gap:5px;flex:none}.burger i{display:block;width:17px;height:1.5px;background:#fff;border-radius:2px;transition:transform .3s,opacity .3s}.burger[aria-expanded="true"] i:first-child{transform:translateY(3.25px) rotate(45deg)}.burger[aria-expanded="true"] i:last-child{transform:translateY(-3.25px) rotate(-45deg)}@media(max-width:860px){.burger{display:flex;align-items:center;justify-content:center}}.menu{position:fixed;inset:68px 0 0;z-index:45;background:rgba(0,0,0,.97);backdrop-filter:blur(18px);display:none;flex-direction:column;gap:2px;padding:26px var(--pad) calc(40px + env(safe-area-inset-bottom));overflow-y:auto}.menu.on{display:flex}.menu a{font-size:clamp(26px,7vw,34px);font-weight:700;letter-spacing:-.03em;padding:16px 0;border-bottom:1px solid var(--line)}.btn{display:inline-flex;align-items:center;gap:10px;padding:15px 26px;border-radius:999px;font-weight:700;font-size:15px;border:1px solid #fff;background:#fff;color:#000;transition:transform .2s,box-shadow .3s,background .2s;white-space:nowrap}.btn:hover{transform:translateY(-2px);box-shadow:0 12px 40px rgba(255,255,255,.22)}.btn.ghost{background:transparent;color:#fff;border-color:var(--line)}.btn.ghost:hover{border-color:#fff;box-shadow:none}.btn svg{width:16px;height:16px;flex:none}.btn[disabled]{opacity:.35;pointer-events:none}.hero{padding:clamp(56px,9vw,110px) 0 clamp(48px,7vw,88px);border-top:0}.chip{display:inline-flex;align-items:center;gap:9px;font-family:var(--m);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);border:1px solid var(--line);border-radius:999px;padding:7px 15px}.dot{width:6px;height:6px;border-radius:50%;background:#fff;box-shadow:0 0 0 0 rgba(255,255,255,.6);animation:pulse 2.4s infinite}@keyframes pulse{70%{box-shadow:0 0 0 9px rgba(255,255,255,0)}100%{box-shadow:0 0 0 0 rgba(255,255,255,0)}}.hero-mark{height:clamp(50px,8.6vw,100px);width:auto;color:#fff;display:block;margin:34px 0 26px;filter:drop-shadow(0 0 40px rgba(255,255,255,.3))}h1{font-size:clamp(38px,7.4vw,90px);line-height:.98;letter-spacing:-.045em;font-weight:700;margin:0 0 22px;max-width:16ch}h1 .stroke{-webkit-text-stroke:1px rgba(255,255,255,.55);color:transparent;white-space:nowrap}.hero h1 .stroke{display:block}.hero p.lead{max-width:52ch}.cta{display:flex;flex-wrap:wrap;gap:12px;margin-top:34px}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;background:var(--line);border:1px solid var(--line);margin-top:clamp(44px,7vw,72px)}.stats div{background:#000;padding:20px 18px}.stats b{display:block;font-size:clamp(22px,3.4vw,34px);letter-spacing:-.03em;line-height:1}.stats small{font-family:var(--m);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);display:block;margin-top:9px}@media(max-width:640px){.stats{grid-template-columns:1fr 1fr}}.ticker{border-top:1px solid var(--line);border-bottom:1px solid var(--line);overflow:hidden;padding:15px 0;-webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}.ticker ul{display:flex;gap:44px;list-style:none;margin:0;padding:0;width:max-content;animation:slide 34s linear infinite}.ticker li{font-family:var(--m);font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);display:flex;align-items:center;gap:44px;white-space:nowrap}.ticker li::after{content:"◆";font-size:7px;color:rgba(255,255,255,.35)}@keyframes slide{to{transform:translateX(-50%)}}@media(prefers-reduced-motion:reduce){.ticker ul{animation:none}}.note{margin-top:22px;display:inline-flex;align-items:center;gap:12px;border:1px dashed var(--line);border-radius:999px;padding:11px 20px;font-size:13px;color:var(--dim)}.note b{color:#fff;font-family:var(--m)}.filters{display:flex;flex-wrap:wrap;gap:9px;margin-top:34px}.filters button{border:1px solid var(--line);border-radius:999px;padding:10px 18px;font-size:14px;color:var(--dim);transition:.2s;display:inline-flex;align-items:center;gap:8px}.filters button:hover{border-color:rgba(255,255,255,.5);color:#fff}.filters button[aria-pressed="true"]{background:#fff;color:#000;border-color:#fff}.filters button i{font-style:normal;font-family:var(--m);font-size:10px;opacity:.55}.works{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(10px,1.4vw,16px);margin-top:30px}@media(min-width:1500px){.works{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(max-width:720px){.works{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}}.works figure[hidden]{display:none}.wmore{display:flex;flex-direction:column;align-items:center;gap:14px;margin-top:30px}.wmore button{position:relative;border:1px solid var(--line);border-radius:999px;padding:15px 32px;font-size:14.5px;letter-spacing:-.01em;color:#fff;display:inline-flex;align-items:center;gap:12px;overflow:hidden;transition:color .3s,border-color .3s}.wmore button::before{content:"";position:absolute;inset:0;background:#fff;transform:scaleX(0);transform-origin:left;transition:transform .45s cubic-bezier(.2,.8,.2,1);z-index:-1}.wmore button:hover{color:#000;border-color:#fff}.wmore button:hover::before{transform:scaleX(1)}.wmore button i{font-style:normal;font-family:var(--m);font-size:11px;letter-spacing:.14em;opacity:.6}.wmore button svg{width:14px;height:14px;transition:transform .35s}.wmore button:hover svg{transform:translateY(3px)}.works figure{margin:0;position:relative;cursor:pointer;outline:none;transform:none!important}.works .ph{position:relative;aspect-ratio:16/9;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:linear-gradient(150deg,#101010,#070707);transition:border-color .3s,transform .5s cubic-bezier(.2,.8,.2,1),box-shadow .5s}.works .ph::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:3;box-shadow:inset 0 1px 0 rgba(255,255,255,.08)}.works figure:hover .ph{border-color:rgba(255,255,255,.45);box-shadow:0 24px 60px -26px rgba(0,0,0,.95);transform:translateY(-3px)}.works figure:focus-visible .ph{border-color:#fff;transform:translateY(-3px)}.works .ph img{width:100%;height:100%;display:block;object-fit:cover;background:#0a0a0a;transition:transform .9s cubic-bezier(.2,.8,.2,1)}.works figure:hover .ph img{transform:scale(1.04)}.works .sheen{display:none;position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;transition:opacity .35s;background:radial-gradient(460px circle at var(--mx,50%) var(--my,50%),rgba(255,255,255,.10),transparent 62%)}.works figure:hover .sheen{opacity:1}@media(hover:hover) and (min-width:861px){.works .sheen{display:block}}.works .ph::after{content:"↗";position:absolute;top:10px;right:10px;z-index:4;width:28px;height:28px;border-radius:50%;background:#fff;color:#000;display:grid;place-items:center;font-size:13px;opacity:0;transform:scale(.6);transition:.3s}.works figure:hover .ph::after,.works figure:focus-visible .ph::after{opacity:1;transform:none}.works figure.noimg .ph img{display:none}.qas{display:grid;gap:10px;margin-top:34px}.qa{border:1px solid var(--line);border-radius:14px;background:#080808;overflow:hidden}.qa summary{list-style:none;cursor:pointer;padding:18px 22px;font-size:16.5px;font-weight:700;letter-spacing:-.01em;display:flex;align-items:center;gap:14px;transition:background .2s}.qa summary::-webkit-details-marker{display:none}.qa summary::after{content:"+";margin-left:auto;font-family:var(--m);font-size:19px;color:var(--dim);transition:transform .25s,color .2s}.qa[open] summary::after{content:"\2212";color:#fff}.qa summary:hover{background:rgba(255,255,255,.04)}.qa summary:focus-visible{outline:2px solid #fff;outline-offset:-2px}.qa p{margin:0;padding:0 22px 20px;color:#c2c2c2;font-size:15px;line-height:1.68;max-width:78ch}@media(max-width:620px){.qa summary{padding:16px 17px;font-size:15.5px}.qa p{padding:0 17px 17px;font-size:14.5px}}.lb{outline:none;position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.95);backdrop-filter:blur(10px);display:none;flex-direction:column;padding:clamp(8px,1.6vw,20px)}.lb.on{display:flex}.lb-top{display:flex;align-items:center;justify-content:flex-end;gap:20px;min-height:40px;padding-bottom:8px;padding-right:clamp(52px,1.6vw + 44px,70px)}.lb-top div{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.lb-top strong{display:block;font-size:clamp(16px,2.2vw,22px);letter-spacing:-.02em}.lb-top em{font-style:normal;color:var(--dim);font-size:13.5px}.lb-top .cnt{margin-left:auto;font-family:var(--m);font-size:11px;letter-spacing:.16em;color:var(--dim);white-space:nowrap;padding-top:4px}.lb-link{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border-radius:999px;background:#fff;color:#000;font-weight:700;font-size:13px;text-decoration:none;white-space:nowrap}.lb-link:hover{background:#e6e6e6}.lb-link[hidden]{display:none}figure.live .lv{position:absolute;left:10px;top:10px;z-index:2;padding:4px 9px;border-radius:999px;background:rgba(10,10,12,.72);color:#fff;font-family:var(--m);font-size:10px;letter-spacing:.14em;text-transform:uppercase;backdrop-filter:blur(6px)}figure.live .lv::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:#fff;margin-right:6px;vertical-align:1px}.lb-stage{position:relative;flex:1;min-height:0;overflow:hidden;display:flex;align-items:center;justify-content:center;gap:clamp(8px,2vw,20px)}.lb-stage img{max-width:100%;max-height:100%;object-fit:contain;border-radius:12px;border:1px solid var(--line);animation:pop .35s cubic-bezier(.2,.8,.2,1);cursor:zoom-in;transition:transform .35s cubic-bezier(.2,.8,.2,1),border-radius .35s;will-change:transform}.lb.zm .lb-stage img{cursor:zoom-out;border-color:transparent;border-radius:0;transition:transform .35s cubic-bezier(.2,.8,.2,1),transform-origin .08s linear}.lb.zm .nav-b{opacity:0;pointer-events:none}.lb-top .hint{font-family:var(--m);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);white-space:nowrap;margin-left:auto}.lb-top .hint+.cnt{margin-left:18px}@media(max-width:620px){.lb-top .hint{display:none}}@keyframes pop{from{opacity:0;transform:scale(.97)}}.lb-thumbs{display:flex;gap:8px;overflow-x:auto;padding:10px 2px 2px;scrollbar-width:none}.lb-thumbs::-webkit-scrollbar{display:none}.lb-thumbs button{flex:none;width:72px;height:40px;border-radius:7px;overflow:hidden;border:1px solid var(--line);opacity:.42;transition:.25s;padding:0}.lb-thumbs button img{width:100%;height:100%;object-fit:cover;display:block}.lb-thumbs button:hover{opacity:.8}.lb-thumbs button.on{opacity:1;border-color:#fff;transform:translateY(-2px)}@media(max-width:620px){.lb-thumbs{padding-top:10px}.lb-thumbs button{width:56px;height:32px}}.nav-b{flex:none;width:46px;height:46px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.05);display:grid;place-items:center;font-size:19px;transition:.2s}.nav-b:hover{background:#fff;color:#000;border-color:#fff}.lb-close{position:absolute;top:clamp(8px,1.6vw,20px);right:clamp(8px,1.6vw,20px);width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:rgba(0,0,0,.5);font-size:20px;line-height:1;transition:.2s;z-index:2}.lb-close:hover{background:#fff;color:#000}@media(max-width:620px){.lb-top .cnt{display:none}.nav-b{width:38px;height:38px}}.ptable{margin-top:34px;border-top:1px solid var(--line)}.pgroup{border-bottom:1px solid var(--line)}.phead{display:flex;align-items:center;gap:14px;width:100%;padding:20px 2px;text-align:left;transition:padding .25s}.phead:hover{padding-left:10px}.phead .pt{font-size:clamp(16px,2vw,19px);letter-spacing:-.02em;font-weight:700}.phead .pc{font-family:var(--m);font-size:11px;color:var(--dim);border:1px solid var(--line);border-radius:999px;padding:3px 9px}.phead .pf{margin-left:auto;font-family:var(--m);font-size:13px;color:var(--dim);white-space:nowrap}.phead .pi{width:15px;height:15px;flex:none;position:relative}.phead .pi::before,.phead .pi::after{content:"";position:absolute;left:0;top:7px;width:15px;height:1.5px;background:#fff;transition:transform .3s}.phead .pi::after{transform:rotate(90deg)}.pgroup.open .phead .pi::after{transform:rotate(0)}.pgroup.open .phead .pt{color:#fff}.pbody{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s cubic-bezier(.2,.8,.2,1)}.pgroup.open .pbody{grid-template-rows:1fr}.pin{overflow:hidden}@media(max-width:560px){.phead .pf{display:none}}.ptable .row{display:flex;align-items:baseline;gap:14px;padding:14px 2px;border-top:1px solid var(--line);transition:background .25s,padding .25s}.ptable .row:hover{background:rgba(255,255,255,.035);padding-left:12px;padding-right:12px}.ptable .row .nm{font-size:16px;letter-spacing:-.01em}.ptable .row .dots{flex:1;height:1px;min-width:18px;background-image:radial-gradient(circle,rgba(255,255,255,.3) 1px,transparent 1px);background-size:6px 1px;background-repeat:repeat-x;transform:translateY(-3px)}.ptable .row .pr{font-family:var(--m);font-size:15px;font-weight:700;white-space:nowrap}.ptable .row .pr.soft{font-weight:400;color:var(--dim);font-size:13.5px}@media(max-width:560px){.ptable .row{flex-wrap:wrap;gap:4px}.ptable .row .dots{display:none}.ptable .row .nm{width:100%}}.pnotes{display:flex;flex-wrap:wrap;gap:10px;margin-top:26px}@supports (content-visibility:auto){#works,#prices,#reviews,#faq,#about,#brief{content-visibility:auto;contain-intrinsic-size:auto 900px}}.packs{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:38px 0 46px}@media(max-width:960px){.packs{grid-template-columns:1fr}}.pack{position:relative;border:1px solid var(--line);background:linear-gradient(180deg,#121214,#070708);border-radius:18px;padding:28px 26px 26px;display:flex;flex-direction:column}.pack.best{border-color:rgba(255,255,255,.42);box-shadow:0 28px 70px -30px rgba(0,0,0,.95)}.pack .tag{position:absolute;top:-10px;left:26px;font-family:var(--m);font-size:10px;letter-spacing:.18em;text-transform:uppercase;background:#fff;color:#000;border-radius:999px;padding:5px 12px}.pack h3{font-size:19px;letter-spacing:-.02em;margin:0 0 6px;font-weight:700}.pack .who{color:var(--dim);font-size:13.5px;line-height:1.5;margin:0 0 20px;min-height:40px}.pack .sum{display:flex;align-items:baseline;gap:10px;margin:0 0 4px}.pack .sum b{font-family:var(--m);font-size:30px;letter-spacing:-.03em;font-weight:700}.pack .sum i{font-style:normal;font-size:13px;color:var(--dim)}.pack .trm{font-family:var(--m);font-size:12px;color:var(--dim);margin:0 0 10px}.pack .sep{font-size:12.5px;color:var(--dim);margin:0 0 20px;line-height:1.45;min-height:34px}.pack .sep s{color:rgba(255,255,255,.55)}.pack ul{list-style:none;padding:0;margin:0 0 24px;flex:1}.pack li{position:relative;padding:0 0 0 26px;margin:0 0 11px;font-size:14.5px;line-height:1.55;color:#d2d2d2}.pack li::before{content:"";position:absolute;left:2px;top:6px;width:5px;height:10px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.8}.pack .btn{width:100%;justify-content:center}.guar{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:0 0 46px}@media(max-width:900px){.guar{grid-template-columns:repeat(2,1fr)}}@media(max-width:520px){.guar{grid-template-columns:1fr}}.guar div{border:1px solid var(--line);border-radius:14px;padding:18px 18px 17px}.guar b{display:block;font-family:var(--m);font-size:13px;margin-bottom:7px}.guar span{color:var(--dim);font-size:13.5px;line-height:1.5}.cmp{margin:0 0 44px}.cmph{font-family:var(--m);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--dim);margin:0 0 16px}.cmpg{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:16px;overflow:hidden}@media(max-width:860px){.cmpg{grid-template-columns:1fr}}.cmpg>div{background:var(--bg);padding:22px 22px 20px}.cmpg b{display:block;font-size:15px;letter-spacing:-.01em;margin:0 0 8px}.cmpg em{display:block;font-style:normal;font-family:var(--m);font-size:20px;font-weight:700;letter-spacing:-.02em;margin:0 0 12px;color:#fff}.cmpg span{display:block;color:var(--dim);font-size:13.5px;line-height:1.55}.cmpn{color:var(--dim);font-size:12.5px;line-height:1.5;margin:14px 0 0;opacity:.75}.rev{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:1fr;gap:14px;margin-top:44px}@media(max-width:1080px){.rev{grid-template-columns:repeat(2,1fr)}}.rev figure{margin:0;border:1px solid var(--line);background:var(--card);padding:24px;border-radius:14px;display:flex;flex-direction:column;min-height:250px;transition:background .3s,border-color .3s}.rev figure:hover{background:var(--card-h);border-color:rgba(255,255,255,.28)}.rev .stars{font-size:12px;letter-spacing:.28em;margin-bottom:14px;display:flex;align-items:center;line-height:1}.rev .stars span.off{color:rgba(255,255,255,.2)}.rev .stars b{font-family:var(--m);font-size:11px;letter-spacing:.1em;color:var(--dim);margin-left:6px;font-weight:500}.rev .reply{margin:-4px 0 16px;font-size:13px;line-height:1.55;color:var(--dim);border-left:2px solid var(--line);padding-left:12px}.rev .reply b{color:#fff;font-weight:500}.revmore{margin-top:26px;display:flex;justify-content:center}.revmore button{cursor:pointer;font-family:inherit}.rev blockquote{margin:0 0 18px;font-size:15.5px;line-height:1.6;letter-spacing:-.01em;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}.rev figcaption{margin-top:auto;font-family:var(--m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}.rev figcaption b{color:#fff;font-weight:500}.rev figcaption .amt{display:block;margin-top:7px;color:#fff;font-size:12px;letter-spacing:.06em}.rev figure.nop .amt{color:var(--dim)}@media(max-width:640px){.rev{grid-template-columns:1fr}}.src{margin-top:22px;font-size:13px;color:var(--dim)}.src a{border-bottom:1px solid var(--line)}.src a:hover{border-color:#fff;color:#fff}.slinks{display:grid;grid-template-columns:repeat(3,1fr);column-gap:36px;margin:26px 0 34px;border-top:1px solid var(--line)}@media(max-width:980px){.slinks{grid-template-columns:repeat(2,1fr)}}@media(max-width:620px){.slinks{grid-template-columns:1fr}}.slinks a{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 0;border-bottom:1px solid var(--line);font-size:14.5px;letter-spacing:-.01em;color:#cfcfcf;transition:color .2s}.slinks a::after{content:"\2192";font-family:var(--m);color:var(--dim);transition:transform .2s,color .2s}.slinks a:hover{color:#fff}.slinks a:hover::after{transform:translateX(3px);color:#fff}.ctc{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:22px;font-size:14px;color:var(--dim)}.ctc a{border:1px solid var(--line);border-radius:999px;padding:9px 16px;color:#fff;transition:.22s;white-space:nowrap}.ctc a:hover{border-color:#fff;background:rgba(255,255,255,.06)}.ctc a.ph{font-family:var(--m);letter-spacing:.02em}@media(max-width:560px){.ctc{gap:8px}.ctc a{font-size:13.5px;padding:8px 14px}}.brief{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(28px,4vw,56px);margin-top:46px;align-items:start}@media(max-width:940px){.brief{grid-template-columns:1fr}}.fields{display:grid;gap:9px}input,textarea{width:100%;background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:12px;padding:14px 16px;color:#fff;font:inherit;font-size:16px;transition:border-color .2s,background .2s}input:focus,textarea:focus{outline:none;border-color:#fff;background:rgba(255,255,255,.07)}input:focus-visible,textarea:focus-visible{outline:2px solid #fff;outline-offset:2px}a:focus-visible,button:focus-visible,figure:focus-visible,[tabindex]:focus-visible{outline:2px solid #fff;outline-offset:3px;border-radius:6px}input::placeholder,textarea::placeholder{color:#8f8f8f;opacity:1}textarea{min-height:96px;resize:vertical}.brief{display:block;margin-top:40px}.card{max-width:600px;border:1px solid var(--line);border-radius:18px;background:rgba(255,255,255,.035);padding:clamp(22px,3vw,30px);display:grid;gap:20px}.card.ok .fields,.card.ok .agree,.card.ok #send,.card.ok .hint{display:none}.card.ok .done{display:block}.fields{display:grid;gap:16px}.fields label{display:grid;gap:8px}.fields label>span{font-family:var(--m);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim)}.agree{display:flex;gap:11px;align-items:flex-start;font-size:13px;line-height:1.5;color:var(--dim);cursor:pointer}.agree input{appearance:none;-webkit-appearance:none;width:22px;height:22px;flex:none;margin:0;border:1px solid rgba(255,255,255,.35);border-radius:6px;background:transparent;cursor:pointer;transition:.2s;position:relative}.agree input:hover{border-color:#fff}.agree input:checked{background:#fff;border-color:#fff}.agree input:checked::after{content:"";position:absolute;left:50%;top:46%;width:6px;height:11px;border:solid #000;border-width:0 2.5px 2.5px 0;transform:translate(-50%,-50%) rotate(45deg)}.agree input:focus-visible{outline:2px solid #fff;outline-offset:2px}.lk{color:#fff;border-bottom:1px solid rgba(255,255,255,.4);padding:0;font:inherit}.lk:hover{border-color:#fff}#send{justify-content:center}.hint{font-size:12.5px;color:var(--dim);line-height:1.55;margin:0}.done{display:none;text-align:center;padding:16px 0 6px}.done .tick{width:56px;height:56px;border-radius:50%;background:#fff;color:#000;display:grid;place-items:center;margin:0 auto 20px;font-size:26px}.done b{display:block;font-size:21px;letter-spacing:-.02em;margin-bottom:8px}.done p{color:var(--dim);font-size:14px;line-height:1.6;margin:0 auto;max-width:36ch}.seo{margin-top:14px}.seo h2,.seo p{max-width:76ch}.seo h2{font-size:clamp(24px,3.4vw,38px);margin-bottom:20px}.seo p{color:var(--dim);font-size:15.5px;line-height:1.7;margin:0 0 14px}.seo p:last-child{margin-bottom:0}footer{border-top:1px solid var(--line);padding:44px 0 54px}.fbar{display:flex;flex-wrap:wrap;gap:20px;align-items:center;justify-content:space-between}.fbar .mk-ft{height:21px;width:auto;color:#fff;opacity:.85}.fnav{display:flex;flex-wrap:wrap;gap:22px;font-size:14px;color:var(--dim)}.fnav a:hover{color:#fff}.fnav a,.src a,a.brand{display:inline-flex;align-items:center;min-height:24px}.copy{margin-top:26px;font-family:var(--m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:#8a8a8a}.mbar{position:fixed;left:0;right:0;bottom:0;z-index:60;display:none;gap:10px;padding:10px 14px calc(10px + env(safe-area-inset-bottom));background:rgba(0,0,0,.82);backdrop-filter:blur(14px);border-top:1px solid var(--line);transform:translateY(120%);transition:transform .35s cubic-bezier(.2,.8,.2,1)}.mbar.on{transform:none}.mbar a{flex:1;justify-content:center;padding:14px 18px;font-size:15px}@media(max-width:860px){.mbar{display:flex}body{padding-bottom:0}}.ai-launch{position:fixed;right:20px;bottom:20px;z-index:70;width:62px;height:62px;border-radius:50%;background:#fff;color:#000;display:grid;place-items:center;box-shadow:0 14px 40px -8px rgba(0,0,0,.9);transition:transform .25s,opacity .25s,bottom .35s}.ai-launch .mk{width:38px;height:auto;display:block}.ai-launch:hover{transform:scale(1.06)}.ai-launch .dot2{position:absolute;top:-4px;right:-4px;width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid #000}.ai-launch .dot2::after{content:"";position:absolute;inset:1px;border-radius:50%;background:#000;animation:blink 2.2s infinite}@keyframes blink{0%,100%{opacity:1}50%{opacity:.25}}body.ai-on .ai-launch{transform:scale(.6);opacity:0;pointer-events:none}@media(max-width:860px){.ai-launch{bottom:88px;width:56px;height:56px}.ai-launch .mk{width:34px}}.ai{position:fixed;right:22px;bottom:22px;z-index:75;padding:0;width:min(520px,calc(100vw - 32px));height:min(760px,calc(100dvh - 120px));display:none;flex-direction:column;background:#070707;border:1px solid var(--line);border-radius:22px;overflow:hidden;box-shadow:0 34px 90px -22px rgba(0,0,0,.95)}body.ai-on .ai{display:flex;animation:aiIn .28s cubic-bezier(.2,.8,.2,1)}@keyframes aiIn{from{opacity:0;transform:translateY(16px) scale(.985)}}@media(max-width:620px){.ai{right:0;left:0;bottom:0;width:100%;height:92dvh;border-radius:20px 20px 0 0;border-width:1px 0 0}body.ai-on{overflow:hidden}}:root{--aip:20px}.ai-hd{display:flex;align-items:center;gap:12px;padding:14px var(--aip);border-bottom:1px solid var(--line);flex:none;background:#070707}.ai-av{width:48px;height:48px;border-radius:50%;background:#fff;color:#000;display:grid;place-items:center;flex:none;box-shadow:0 0 0 1px rgba(255,255,255,.16)}.ai-av .mk{width:33px;height:auto;display:block}.ai-hd strong{display:block;font-size:15.5px;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ai-hd>div{min-width:0;flex:1}.ai-hd em{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ai-hd>div{min-width:0}@media(max-width:360px){.ai-av{width:40px;height:40px}.ai-av .mk{width:27px}.ai-hd strong{font-size:14px}}.ai-hd em{font-style:normal;font-size:11.5px;color:var(--dim)}.ai-hd button{margin-left:auto;width:30px;height:30px;border-radius:50%;border:1px solid var(--line);font-size:18px;line-height:1;transition:.2s}.ai-hd button:hover{background:#fff;color:#000}.ai-log{flex:1;overflow-y:auto;padding:22px var(--aip);display:flex;flex-direction:column;gap:12px;scrollbar-width:thin;overscroll-behavior:contain}.ai-log p{margin:0;max-width:92%;padding:13px 16px;border-radius:16px;font-size:15.5px;line-height:1.62;white-space:pre-line}.ai-log p.bot{background:rgba(255,255,255,.07);border:1px solid var(--line);border-bottom-left-radius:5px;align-self:flex-start}.ai-log p.me{background:#fff;color:#000;border-bottom-right-radius:5px;align-self:flex-end}.ai-log p.op{background:rgba(255,255,255,.07);border:1px solid var(--line);border-left:2px solid #fff;border-bottom-left-radius:5px;align-self:flex-start}.ai-log p.op::before{content:attr(data-who);display:block;font-family:var(--m);font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--dim);margin-bottom:6px}.ai-log p.sys{align-self:center;max-width:100%;padding:0;background:none;border:0;font-family:var(--m);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}.ai-log p a.ai-tg{display:block;margin-top:10px;color:#fff;text-decoration:underline;text-underline-offset:3px}.ai-launch.new{animation:aiNew 1.8s infinite}@keyframes aiNew{0%{box-shadow:0 0 0 0 rgba(255,255,255,.4)}100%{box-shadow:0 0 0 13px rgba(255,255,255,0)}}.ai-log p.typing{display:flex;gap:4px;align-items:center;padding:14px}.ai-log p.typing i{width:6px;height:6px;border-radius:50%;background:var(--dim);animation:bob 1.1s infinite}.ai-log p.typing i:nth-child(2){animation-delay:.15s}.ai-log p.typing i:nth-child(3){animation-delay:.3s}@keyframes bob{0%,60%,100%{transform:translateY(0);opacity:.4}30%{transform:translateY(-4px);opacity:1}}.cc{position:fixed;left:0;right:0;bottom:0;z-index:80;display:flex;align-items:center;gap:20px;padding:16px clamp(16px,4vw,44px) calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:rgba(7,7,7,.96);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);transform:translateY(105%);transition:transform .42s cubic-bezier(.2,.8,.2,1);pointer-events:none}.cc[hidden]{display:none}.cc.on{transform:none;pointer-events:auto}.cc p{margin:0;font-size:13px;line-height:1.55;color:var(--dim);max-width:880px}.cc p a{color:#fff;text-decoration:underline;text-underline-offset:3px}.ccb{display:flex;gap:9px;margin-left:auto;flex:none}.ccb button{border:1px solid var(--line);border-radius:999px;padding:9px 17px;font-size:13px;color:var(--dim);white-space:nowrap;transition:.2s}.ccb button:hover{border-color:#fff;color:#fff}.ccb button,.ccb button.y{background:none;color:#fff;border-color:rgba(255,255,255,.55)}.ccb button:hover,.ccb button.y:hover{background:#fff;color:#000;border-color:#fff}body.cc-on .ai-launch{bottom:100px}body.cc-on .mbar{display:none}@media(max-width:620px){.cc{flex-direction:column;align-items:stretch;gap:13px;padding-top:16px}.ccb{margin-left:0}.ccb button{flex:1}body.cc-on .ai-launch{display:none}}.ai-chips:empty{display:none}.ai-chips{display:flex;gap:8px;overflow-x:auto;padding:0 var(--aip) 14px;flex:none;scrollbar-width:none}.ai-chips::-webkit-scrollbar{display:none}.ai-chips button{flex:none;border:1px solid var(--line);border-radius:999px;padding:8px 14px;font-size:13px;color:var(--dim);white-space:nowrap;transition:.2s}.ai-chips button:hover{border-color:#fff;color:#fff}.ai-in{display:flex;gap:9px;padding:14px var(--aip) calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--line);flex:none;background:#070707}.ai-in input{flex:1;border-radius:999px;padding:12px 16px;font-size:16px}.ai-in input:focus-visible{outline:none;border-color:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.13)}.ai-in button{width:44px;height:44px;flex:none;border-radius:50%;background:#fff;color:#000;display:grid;place-items:center;transition:.2s}.ai-in button svg{width:17px;height:17px}.ai-in button:hover{transform:scale(1.06)}.r{opacity:0;transform:translateY(20px);transition:opacity .7s cubic-bezier(.2,.8,.2,1),transform .7s cubic-bezier(.2,.8,.2,1)}.r.in{opacity:1;transform:none}@media(prefers-reduced-motion:reduce){.r{opacity:1;transform:none}}</style>
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false"><symbol id="ysdmk" viewBox="0 0 2346 852"><g transform="translate(0,852) scale(.1,-.1)" fill="currentColor"><path d="M0 8494 c0 -15 13 -38 33 -58 160 -160 1370 -1381 1867 -1884 344
-348 735 -745 870 -881 371 -375 1408 -1426 1549 -1570 68 -69 215 -218 326
-331 112 -113 208 -214 213 -226 8 -15 12 -543 13 -1725 1 -989 5 -1711 11
-1721 13 -27 56 -22 86 10 15 16 239 242 497 503 514 519 735 746 838 856 l67
72 0 988 c1 861 3 991 16 1008 8 11 124 130 257 265 133 135 302 308 376 385
108 112 614 631 981 1005 36 37 209 214 385 394 995 1020 1349 1378 1373 1387
35 14 9534 12 9742 -2 91 -6 208 -19 260 -30 52 -11 138 -28 190 -39 145 -29
312 -86 460 -156 71 -34 89 -43 167 -85 110 -58 311 -198 443 -308 81 -67 282
-271 332 -337 134 -175 244 -350 327 -519 48 -99 91 -193 95 -210 4 -16 18
-55 31 -85 41 -96 74 -213 95 -331 11 -63 27 -137 35 -164 42 -131 38 -779 -5
-940 -12 -44 -28 -111 -35 -150 -15 -86 -59 -239 -91 -322 -13 -34 -24 -67
-24 -74 0 -24 -174 -360 -234 -450 -15 -24 -40 -62 -54 -84 -81 -123 -285
-358 -377 -435 -41 -33 -91 -77 -113 -98 -85 -80 -333 -241 -482 -313 -58 -28
-126 -62 -151 -75 -26 -13 -53 -24 -60 -24 -8 0 -41 -14 -74 -30 -33 -16 -69
-30 -81 -30 -11 0 -45 -8 -75 -19 -30 -10 -106 -28 -169 -40 -63 -12 -135 -26
-160 -31 -25 -6 -135 -17 -245 -25 -286 -21 -1901 -22 -1931 -1 -19 14 -19 46
-24 1671 -5 1625 -5 1657 -24 1671 -17 12 -132 14 -726 14 -686 0 -707 -1
-724 -19 -17 -19 -18 -146 -17 -2423 1 -2307 2 -2404 20 -2421 17 -18 94 -18
1872 -17 1084 0 1902 5 1969 10 293 25 509 59 607 98 28 12 75 24 105 28 29 4
69 15 88 24 19 10 69 28 110 41 41 12 118 40 170 61 52 22 115 46 140 55 25 9
52 21 60 28 8 6 57 33 109 59 52 26 105 56 119 66 14 11 30 20 36 20 6 0 37
17 68 38 31 20 96 62 144 92 48 30 105 69 125 85 20 17 71 57 113 90 145 114
232 193 397 361 180 183 235 244 289 323 19 28 59 84 88 123 48 66 110 161
188 291 102 170 243 459 281 577 8 25 21 56 28 70 7 14 22 54 33 90 11 36 29
85 40 110 10 25 22 63 26 85 4 22 18 74 30 115 40 126 65 250 90 437 9 67 21
114 35 136 21 34 21 41 21 707 0 660 0 673 -20 706 -14 21 -26 70 -35 141 -21
159 -60 360 -83 428 -11 33 -30 94 -41 135 -25 94 -68 222 -93 276 -10 23 -18
47 -18 54 0 15 -113 267 -173 385 -22 44 -53 104 -67 133 -15 28 -36 62 -47
75 -12 12 -28 39 -37 61 -9 21 -34 64 -56 95 -23 31 -71 99 -108 152 -187 267
-483 571 -802 824 -145 115 -393 276 -487 316 -26 11 -57 28 -68 38 -11 10
-63 38 -115 61 -52 24 -100 47 -106 51 -12 9 -124 57 -234 100 -98 38 -296 95
-398 114 -45 9 -98 23 -118 31 -21 9 -94 22 -162 30 -68 8 -147 24 -175 34
-51 20 -109 20 -5504 20 -3030 0 -5453 -4 -5453 -9 0 -4 -53 -62 -118 -127
-130 -132 -343 -353 -587 -610 -88 -93 -243 -254 -345 -359 -102 -104 -210
-217 -240 -250 -29 -33 -146 -155 -259 -270 -113 -116 -336 -348 -496 -515
-230 -242 -544 -569 -575 -600 -3 -3 -52 -54 -109 -115 -58 -60 -170 -178
-250 -261 -81 -83 -202 -211 -270 -285 -120 -131 -163 -169 -189 -169 -6 0
-87 77 -180 172 -92 94 -262 267 -377 382 -116 116 -397 400 -625 632 -228
231 -847 855 -1374 1386 -528 532 -963 974 -968 982 -8 14 -114 16 -1053 16
l-1045 0 0 -26z M9655 4911 c-11 -5 -72 -62 -135 -126 -63 -65 -178 -182 -255
-260 -77 -78 -207 -211 -290 -296 -82 -85 -233 -241 -335 -345 -102 -105 -226
-233 -276 -285 -50 -52 -103 -104 -117 -116 -29 -23 -32 -30 -17 -53 8 -13
299 -16 2482 -20 l2473 -5 60 -28 c226 -105 328 -191 458 -384 102 -151 132
-270 132 -518 -1 -155 -4 -192 -24 -265 -28 -106 -68 -209 -91 -235 -9 -11
-33 -45 -53 -77 -51 -80 -159 -192 -221 -227 -85 -48 -207 -90 -302 -106 -76
-13 -440 -15 -2499 -15 -2275 0 -2411 -1 -2436 -18 -27 -18 -151 -142 -659
-658 -558 -567 -760 -778 -760 -795 0 -9 6 -22 14 -28 11 -10 753 -12 3222
-12 2835 1 3222 3 3338 17 146 17 297 52 384 88 31 13 71 26 87 30 49 12 313
145 405 205 227 148 569 487 675 671 17 29 40 65 53 80 12 15 22 32 22 38 0 5
15 32 33 58 72 107 190 396 217 529 6 33 20 88 30 121 18 60 37 181 59 370 35
298 -15 740 -121 1064 -27 85 -85 227 -108 265 -10 17 -21 41 -25 55 -4 14
-20 42 -36 62 -16 20 -33 48 -39 62 -9 25 -157 248 -209 315 -36 48 -211 222
-309 308 -125 110 -383 274 -542 344 -25 11 -76 35 -115 54 -38 19 -79 35 -90
35 -11 0 -51 11 -88 24 -37 14 -100 30 -140 36 -40 7 -108 19 -152 28 -72 15
-259 17 -1880 19 -990 1 -1809 -2 -1820 -6z"/></g></symbol></svg>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"ProfessionalService","name":"YSD DEV","url":"https://ysddev.com/","email":"theysddev@gmail.com","image":"https://ysddev.com/og.png","logo":"https://ysddev.com/apple-touch-icon.png","description":"Разработка сайтов, Telegram-ботов, вёрстка из Figma и оформление презентаций под ключ. Казань, работа удалённо по всей России.","areaServed":[{"@type":"City","name":"Казань"},{"@type":"Country","name":"Россия"}],"priceRange":"1000-60000 RUB","sameAs":["https://t.me/ysddev","https://profi.ru/profile/SherzodaYN/","https://github.com/theysddev"],"knowsLanguage":["ru","en"],"hasOfferCatalog":{"@type":"OfferCatalog","name":"Услуги YSD DEV","itemListElement":[{"@type":"Offer","itemOffered":{"@type":"Service","name":"Пакет «Страница» — сайт на одну услугу под ключ"},"price":"12000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"12000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Пакет «Сайт» — многостраничный сайт под ключ"},"price":"30000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"30000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Пакет «Магазин» — интернет-магазин под ключ"},"price":"45000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"45000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Создание сайта-визитки"},"price":"9000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"9000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Создание сайта на Tilda"},"price":"15000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"15000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Создание сайта на WordPress"},"price":"18000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"18000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Разработка корпоративного сайта"},"price":"30000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"30000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Создание интернет-магазина"},"price":"45000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"45000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Вёрстка сайта из макета Figma"},"price":"5000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"5000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Разработка Telegram-бота"},"price":"12000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"12000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Оформление презентации"},"price":"7000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"7000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Дизайн коммерческого предложения"},"price":"5000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"5000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Презентация для инвесторов (питч-дек)"},"price":"7000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"7000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Видеопрезентация"},"price":"10000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"10000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Разработка чат-бота для бизнеса"},"price":"12000","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"12000","priceCurrency":"RUB"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Доработка сайта"},"price":"2500","priceCurrency":"RUB","availability":"https://schema.org/InStock","priceSpecification":{"@type":"PriceSpecification","minPrice":"2500","priceCurrency":"RUB"}}]}}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Сколько стоит разработка сайта?","acceptedAnswer":{"@type":"Answer","text":"Есть три готовых пакета: страница — 12 000 ₽ за 1–2 дня, сайт до шести страниц — 30 000 ₽ за 3–5 дней, интернет-магазин — 45 000 ₽ за 5–7 дней. Если нужно что-то отдельно: сайт-визитка — 9 000 ₽, лендинг — 12 000 ₽, сайт на Tilda — 15 000 ₽, на WordPress — 18 000 ₽, корпоративный сайт — 30 000 ₽, интернет-магазин — 45 000 ₽. Это стартовые цены по прайсу. Точная сумма называется после короткого уточнения задачи, фиксируется письменно и не меняется, пока не меняется задача."}},{"@type":"Question","name":"Сколько стоит заказать Telegram-бота?","acceptedAnswer":{"@type":"Answer","text":"Разработка Telegram-бота — 12 000 ₽ по прайсу, срок от 1 дня. В цену входит подключение к таблицам или CRM и уведомления о заявках."}},{"@type":"Question","name":"Какие сроки разработки?","acceptedAnswer":{"@type":"Answer","text":"Сайт-визитка или лендинг — 1–2 дня, корпоративный сайт — 3–5 дней, интернет-магазин — 5–7 дней, Telegram-бот — 1 день, презентация — 1 день."}},{"@type":"Question","name":"Что входит в стоимость сайта?","acceptedAnswer":{"@type":"Answer","text":"Структура, дизайн, адаптивная вёрстка от 320 px, формы заявок, базовая SEO-настройка (мета-теги, sitemap, robots), подключение домена и SSL, обучение по самостоятельному изменению текстов и 14 дней бесплатных правок в рамках согласованного ТЗ."}},{"@type":"Question","name":"Сколько стоит оформление презентации?","acceptedAnswer":{"@type":"Answer","text":"От 7 000 ₽ за проект или от 700 ₽ за слайд. Срок от 1 дня, срочные беру. Файл отдаётся в редактируемом виде — PowerPoint, Google Slides или Figma."}},{"@type":"Question","name":"Вы работаете только по Казани?","acceptedAnswer":{"@type":"Answer","text":"Нет. Мы в Казани, но работаем удалённо — по всей России и за её пределами. Офиса для приёма нет: задача обсуждается в переписке или созвоне, приезжать никуда не нужно."}},{"@type":"Question","name":"Нужно ли отдельно платить за хостинг и домен?","acceptedAnswer":{"@type":"Answer","text":"Подключение домена и выпуск SSL входят в работу и отдельно не оплачиваются. Сам домен покупается у регистратора на ваше имя — для зоны .ru это обычно 700–1100 ₽ в год, для .com дороже. Хостинг подбирается под задачу: часть сайтов работает на бесплатном хостинге, для остальных это обычно 150–400 ₽ в месяц."}},{"@type":"Question","name":"Как происходит оплата?","acceptedAnswer":{"@type":"Answer","text":"По этапам. Сначала бесплатно показываю макет главной страницы. Понравился — вносите часть суммы, остаток — после сдачи и проверки. Большой проект можно разбить на несколько этапов. Стоимость фиксируется письменно до начала работ и не меняется, пока не меняется задача."}}]}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"YSD DEV","url":"https://ysddev.com/","inLanguage":"ru"}</script>
</head>
<body>
<div class="field" aria-hidden="true"><div class="glow"></div><div class="cursor"></div><div class="grid"></div><div class="noise"></div></div><header id="hdr"><div class="wrap bar"><a class="brand" href="#top"><svg class="mk" viewBox="0 0 2346 852" role="img" aria-label="YSD DEV"><use href="#ysdmk"></use></svg></a><nav class="links"><a href="#works" data-i="nav5">Работы</a><a href="#prices" data-i="nav6">Цены</a><a href="#reviews" data-i="nav3">Отзывы</a><a href="#brief" data-i="nav4">Заявка</a></nav><div class="lang" role="group" aria-label="Language"><button data-lang="ru" aria-pressed="true">RU</button><button data-lang="en" aria-pressed="false">EN</button></div><button class="burger" id="burger" aria-label="Menu" aria-expanded="false"><i></i><i></i></button></div></header><nav class="menu" id="menu"><a href="#works" data-i="nav5">Работы</a><a href="#prices" data-i="nav6">Цены</a><a href="#reviews" data-i="nav3">Отзывы</a><a href="#brief" data-i="nav4">Заявка</a></nav><main id="top"><section class="hero"><div class="wrap"><span class="chip"><i class="dot"></i><span data-i="status">Приём заявок открыт</span></span><svg class="mk hero-mark" viewBox="0 0 2346 852" role="img" aria-label="YSD DEV"><defs><linearGradient id="mkg" gradientUnits="userSpaceOnUse" x1="-700" y1="0" x2="700" y2="420"><stop offset="0" stop-color="#f3f3f6"/><stop offset=".44" stop-color="#f3f3f6"/><stop offset=".5" stop-color="#fff"/><stop offset=".56" stop-color="#f3f3f6"/><stop offset="1" stop-color="#f3f3f6"/><animateTransform attributeName="gradientTransform" type="translate" values="-900 0;3300 0;3300 0" keyTimes="0;.42;1" dur="6.5s" repeatCount="indefinite"/></linearGradient><mask id="mkm"><use href="#ysdmk" color="#fff"></use></mask></defs><rect width="2346" height="852" fill="url(#mkg)" mask="url(#mkm)"></rect></svg><h1><span data-i="h1a">Сайты, Telegram-боты и презентации</span> <span class="stroke" data-i="h1b">под ключ.</span></h1><p class="lead" data-i="sub">Смету и точный срок присылаю в первый день, показываю этапы каждый день, 14 дней правок — бесплатно.</p><div class="cta"><a class="btn" href="#brief"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M21.7 3.3a1 1 0 0 0-1.05-.16L2.9 10.6c-.85.36-.8 1.6.07 1.9l4.4 1.48 1.7 5.3c.26.8 1.29.99 1.82.34l2.35-2.9 4.5 3.3c.6.44 1.46.12 1.62-.6l3.2-14.2a1 1 0 0 0-.3-.92ZM9.4 14.1l9-6.6-6.9 7.5-.3 3-1.8-3.9Z"/></svg><span data-i="cta1">Оставить заявку</span></a><a class="btn ghost" href="#prices" data-i="cta2">Цены на услуги</a></div><div class="orbit" id="orbit" role="region" aria-label="Избранные работы"><div class="ring" id="ring"></div><span class="hint" data-i="orb">Крутите и нажмите на работу</span></div><div class="stats"><div><b><span data-i="st0v">4,89</span></b><small data-i="st1">Рейтинг</small></div><div><b><span data-i="st2v">35</span></b><small data-i="st2">Отзывов</small></div><div><b>36</b><small data-i="st3">Услуг</small></div><div><b><span data-i="st4v">от 1 дня</span></b><small data-i="st4">Срок</small></div></div></div></section><div class="ticker" aria-hidden="true"><ul id="tick"></ul></div><section id="works"><div class="wrap"><p class="eyebrow r" data-i="ey-w">Работы</p><h2 class="r" data-i="w-h">46 работ<br>в портфолио</h2><p class="lead r" data-i="w-l">Сайты, Telegram-боты, презентации, веб-сервисы и дизайн. 46 проектов работают онлайн — откройте по кнопке «Открыть проект»: покликайте калькуляторы, пройдите сценарий бота, полистайте презентацию. Так будет выглядеть и ваш проект.</p><div class="filters r" id="filters"></div><div class="works" id="worksGrid"></div><div class="wmore" id="wMore"></div></div></section><section id="prices"><div class="wrap"><p class="eyebrow r" data-i="ey-p">Цены</p><h2 class="r" data-i="pr-h">Цены известны<br>до разговора</h2><p class="lead r" data-i="pr-l">Никаких «рассчитаем индивидуально». Три готовых пакета закрывают девять задач из десяти — суммы и сроки ниже. Акция: −20% на первый заказ и месяц бесплатных правок после запуска.</p><div class="packs r"><div class="pack"><h3 data-i="pk1h">Страница</h3><p class="who" data-i="pk1w">Одна услуга или продукт. Нужно, чтобы человек понял и написал.</p><div class="sum"><b>12 000</b><i>₽</i></div><p class="trm" data-i="pk1t">1–2 дня</p><p class="sep" data-i="pk1s">Домен, хостинг и SSL — настрою без доплаты</p><ul><li data-i="pk1a">До 5 экранов: оффер, услуги, цены, отзывы, заявка</li><li data-i="pk1b">Адаптив под телефон и планшет</li><li data-i="pk1c">Форма заявки с уведомлением вам в Telegram</li><li data-i="pk1d">Домен, хостинг и SSL настрою сам</li><li data-i="pk1e">14 дней правок после сдачи</li></ul><a class="btn ghost" href="#brief" data-i="pk-cta">Обсудить задачу</a></div><div class="pack best"><span class="tag" data-i="pk-tag">Берут чаще всего</span><h3 data-i="pk2h">Сайт</h3><p class="who" data-i="pk2w">Несколько услуг или направлений. Нужно, чтобы находили из поиска.</p><div class="sum"><b>30 000</b><i>₽</i></div><p class="trm" data-i="pk2t">3–5 дней</p><p class="sep" data-i="pk2s">Те же работы по прайсу поштучно — <s>42 000 ₽</s></p><ul><li data-i="pk2a">До 6 страниц, каждая под свой запрос</li><li data-i="pk2b">Свой дизайн, не готовый шаблон</li><li data-i="pk2c">Помогу собрать и написать тексты</li><li data-i="pk2d">Онлайн-запись, калькулятор или квиз на выбор</li><li data-i="pk2e">Метрика с целями и SEO-разметка</li><li data-i="pk2f">30 дней правок после сдачи</li></ul><a class="btn" href="#brief" data-i="pk-cta2">Обсудить задачу</a></div><div class="pack"><h3 data-i="pk3h">Магазин</h3><p class="who" data-i="pk3w">Продажи прямо на сайте или работа с заявками в CRM.</p><div class="sum"><b>45 000</b><i>₽</i></div><p class="trm" data-i="pk3t">5–7 дней</p><p class="sep" data-i="pk3s">Те же работы по прайсу поштучно — <s>55 000 ₽</s></p><ul><li data-i="pk3a">Каталог, карточки, корзина, оформление заказа</li><li data-i="pk3b">Онлайн-оплата и расчёт доставки</li><li data-i="pk3c">Или корпоративный сайт с интеграцией в CRM</li><li data-i="pk3d">Админка и обучение — дальше справитесь сами</li><li data-i="pk3e">60 дней правок после сдачи</li></ul><a class="btn ghost" href="#brief" data-i="pk-cta3">Обсудить задачу</a></div></div><div class="cmp r"><p class="cmph" data-i="cm-h">С чем обычно сравнивают</p><div class="cmpg"><div><b data-i="cm1b">Конструктор</b><em data-i="cm1p">от 10 900 ₽</em><span data-i="cm1s">Готовый шаблон, абонентская плата 490–800 ₽ в месяц. Сайт живёт на чужой платформе: перестали платить — он выключился.</span></div><div><b data-i="cm2b">Веб-студия</b><em data-i="cm2p">от 108 000 ₽</em><span data-i="cm2s">Менеджер, бриф на сорок вопросов, 14–45 дней. Работа хорошая — но под неё нужен бюджет и запас времени.</span></div><div class="me"><b data-i="cm3b">YSD DEV</b><em data-i="cm3p">9 000 – 45 000 ₽</em><span data-i="cm3s">Свой дизайн, без абонплаты, домен и исходники ваши. 2–10 дней. Делаю сам — вы не платите за офис и менеджеров.</span></div></div><p class="cmpn" data-i="cm-n">Цены взяты с публичных страниц этих компаний в сентябре 2026 года.</p></div><div class="guar r"><div><b data-i="g1b">Макет до оплаты</b><span data-i="g1s">Сначала показываю дизайн главной. Не понравилось — расходимся, вы ничего не должны.</span></div><div><b data-i="g2b">Цена не растёт</b><span data-i="g2s">Сумма фиксируется письменно и не меняется, пока не меняется задача.</span></div><div><b data-i="g3b">Всё оформлено на вас</b><span data-i="g3s">Домен, хостинг, исходники и доступы — ваши с первого дня.</span></div><div><b data-i="g4b">Оплата по этапам</b><span data-i="g4s">Часть после согласования макета, остаток после сдачи.</span></div></div><p class="lead r" data-i="pr-l2">Нужно что-то отдельное — полный прайс на 54 услуги ниже. Это стартовые цены, точную сумму называю после короткого брифа.</p><div class="ptable r" id="ptable"></div><div class="pnotes r"><span class="note"><b>−30%</b><span data-i="pn1">на второй продукт в одном заказе: сайт + бот или презентация</span></span><span class="note"><b>0 ₽</b><span data-i="pn2">оценка задачи и смета</span></span><span class="note"><b data-i="pn3b">до 60</b><span data-i="pn3">дней правок после сдачи — зависит от пакета</span></span></div></div></section><section id="reviews"><div class="wrap"><p class="eyebrow r" data-i="ey3">Отзывы</p><h2 class="r" data-i="r-h">4,89 из 5 · 35 отзывов</h2><p class="lead r" data-i="r-l">Отзывы с моего профиля на Профи.ру, рейтинг там 4,89 из 5. Сначала отзывы с суммой заказа, остальные открываются по кнопке. Оригиналы — по ссылке ниже.</p><div class="rev r" id="revGrid"></div><div class="wmore revmore r" id="revMore"></div><p class="src r"><span data-i="r-src">Источник:</span> <a href="https://profi.ru/profile/SherzodaYN/" target="_blank" rel="noopener">profi.ru/profile/SherzodaYN</a></p></div></section><section id="faq"><div class="wrap"><p class="eyebrow r" data-i="ey-f">Частые вопросы</p><h2 class="r" data-i="f-h">Что спрашивают<br>до заказа</h2><div class="qas"><details class="qa r"><summary data-i="q1">Сколько стоит разработка сайта?</summary><p data-i="fa1">Есть три готовых пакета: страница — 12 000 ₽ за 1–2 дня, сайт до шести страниц — 30 000 ₽ за 3–5 дней, интернет-магазин — 45 000 ₽ за 5–7 дней. Если нужно что-то отдельно: сайт-визитка — 9 000 ₽, лендинг — 12 000 ₽, сайт на Tilda — 15 000 ₽, на WordPress — 18 000 ₽, корпоративный сайт — 30 000 ₽, интернет-магазин — 45 000 ₽. Это стартовые цены по прайсу. Точная сумма называется после короткого уточнения задачи, фиксируется письменно и не меняется, пока не меняется задача.</p></details><details class="qa r"><summary data-i="q2">Сколько стоит заказать Telegram-бота?</summary><p data-i="fa2">Разработка Telegram-бота — 12 000 ₽ по прайсу, срок от 1 дня. В цену входит подключение к таблицам или CRM и уведомления о заявках.</p></details><details class="qa r"><summary data-i="q3">Какие сроки разработки?</summary><p data-i="fa3">Сайт-визитка или лендинг — 1–2 дня, корпоративный сайт — 3–5 дней, интернет-магазин — 5–7 дней, Telegram-бот — 1 день, презентация — 1 день.</p></details><details class="qa r"><summary data-i="q4">Что входит в стоимость сайта?</summary><p data-i="fa4">Структура, дизайн, адаптивная вёрстка от 320 px, формы заявок, базовая SEO-настройка (мета-теги, sitemap, robots), подключение домена и SSL, обучение по самостоятельному изменению текстов и 14 дней бесплатных правок в рамках согласованного ТЗ.</p></details><details class="qa r"><summary data-i="q5">Сколько стоит оформление презентации?</summary><p data-i="fa5">От 7 000 ₽ за проект или от 700 ₽ за слайд. Срок от 1 дня, срочные беру. Файл отдаётся в редактируемом виде — PowerPoint, Google Slides или Figma.</p></details><details class="qa r"><summary data-i="q6">Вы работаете только по Казани?</summary><p data-i="fa6">Нет. Мы в Казани, но работаем удалённо — по всей России и за её пределами. Офиса для приёма нет: задача обсуждается в переписке или созвоне, приезжать никуда не нужно.</p></details><details class="qa r"><summary data-i="q7">Нужно ли отдельно платить за хостинг и домен?</summary><p data-i="fa7">Подключение домена и выпуск SSL входят в работу и отдельно не оплачиваются. Сам домен покупается у регистратора на ваше имя — для зоны .ru это обычно 700–1100 ₽ в год, для .com дороже. Хостинг подбирается под задачу: часть сайтов работает на бесплатном хостинге, для остальных это обычно 150–400 ₽ в месяц.</p></details><details class="qa r"><summary data-i="q8">Как происходит оплата?</summary><p data-i="fa8">По этапам. Сначала бесплатно показываю макет главной страницы. Понравился — вносите часть суммы, остаток — после сдачи и проверки. Большой проект можно разбить на несколько этапов. Стоимость фиксируется письменно до начала работ и не меняется, пока не меняется задача.</p></details></div></div></section><section id="about"><div class="wrap"><p class="eyebrow r" data-i="ey-a">О студии</p><div class="seo r"><h2 data-i="a-h">Разработка сайтов, Telegram-ботов и презентаций</h2><p data-i="a-1">YSD DEV — студия из Казани. Работаем дистанционно по всей России и за рубежом: заказчику не нужно никуда ехать, всё обсуждаем в переписке или созвоне. Офиса для приёма нет — только удалённо.</p><p data-i="a-2">Делаем сайты под ключ — сайты-визитки, лендинги, корпоративные сайты и интернет-магазины на WordPress, Tilda и на чистом коде. Разрабатываем Telegram-ботов для записи, заказов, оплат и поддержки клиентов, подключаем их к CRM и таблицам. Верстаем по макетам Figma и PSD с адаптивом от 320 пикселей. Оформляем презентации и коммерческие предложения.</p><p data-i="a-3">В цену сайта входит структура, дизайн, адаптивная вёрстка, формы заявок, базовое SEO, подключение домена и SSL-сертификата, а также обучение — как самостоятельно менять тексты. Смету и точный срок присылаем в первый день, показываем этапы каждый день, 14 дней правок после сдачи бесплатно.</p><nav class="slinks" aria-label="Услуги"><a href="/sozdanie-saytov.html" data-i="sl1">Создание сайтов в Казани под ключ — от 15 000 ₽</a><a href="/lending.html" data-i="sl7">Лендинг под ключ — от 12 000 ₽</a><a href="/sayt-na-tilda.html" data-i="sl8">Сайт на Тильде под ключ — 15 000 ₽</a><a href="/sayt-na-wordpress.html" data-i="sl3">Сайт на WordPress — 18 000 ₽</a><a href="/korporativnyy-sayt.html" data-i="sl9">Корпоративный сайт — 30 000 ₽</a><a href="/internet-magazin.html" data-i="sl2">Интернет-магазин — 45 000 ₽</a><a href="/telegram-bot.html" data-i="sl4">Телеграм-бот на заказ — 12 000 ₽</a><a href="/verstka-figma.html" data-i="sl5">Вёрстка из Figma — от 5 000 ₽</a><a href="/prezentacii.html" data-i="sl6">Презентации на заказ — от 7 000 ₽</a><a href="/dorabotka-sayta.html" data-i="sl10">Доработка сайта — от 2 500 ₽</a><a href="/prezentaciya-dlya-biznesa.html" data-i="sl11">Презентация компании — от 7 000 ₽</a><a href="/pitch-deck.html" data-i="sl12">Презентация для инвесторов — от 7 000 ₽</a><a href="/video-prezentaciya.html" data-i="sl13">Видеопрезентация — от 10 000 ₽</a><a href="/chat-bot-dlya-biznesa.html" data-i="sl14">Чат-бот для бизнеса — 12 000 ₽</a><a href="/skolko-stoit-sayt.html" data-i="sl15">Сколько стоит сайт — разбор цен</a><a href="/sayt-dlya-salona-krasoty.html" data-i="sl16">Сайт для салона красоты — от 9 000 ₽</a><a href="/sayt-dlya-avtoservisa.html" data-i="sl17">Сайт для автосервиса — от 9 000 ₽</a><a href="/sayt-dlya-stroitelnoy-kompanii.html" data-i="sl18">Сайт для строительной компании — от 15 000 ₽</a><a href="/bot-dlya-zapisi-klientov.html" data-i="sl19">Бот для записи клиентов — 12 000 ₽</a><a href="/prezentaciya-dlya-tendera.html" data-i="sl20">Презентация для тендера — от 7 000 ₽</a><a href="/sayt-vizitka.html" data-i="sl21">Сайт-визитка под ключ — 9 000 ₽</a><a href="/sayt-katalog.html" data-i="sl22">Сайт-каталог товаров — от 25 000 ₽</a></nav><p data-i="a-5">Разбираем цены на рынке — сколько на самом деле стоят такие работы у фрилансеров, студий и агентств, из чего складывается сумма и на чём экономить нельзя.</p><nav class="slinks" aria-label="Разборы цен"><a href="/skolko-stoit-prezentaciya.html" data-i="ar1">Сколько стоит презентация</a><a href="/skolko-stoit-lending.html" data-i="ar2">Сколько стоит лендинг</a><a href="/skolko-stoit-internet-magazin.html" data-i="ar3">Сколько стоит интернет-магазин</a><a href="/skolko-stoit-sayt-na-tilde.html" data-i="ar4">Сколько стоит сайт на Тильде</a><a href="/skolko-stoit-sayt-vizitka.html" data-i="ar5">Сколько стоит сайт-визитка</a><a href="/skolko-stoit-telegram-bot.html" data-i="ar6">Сколько стоит Telegram-бот</a><a href="/lending-ili-sayt.html" data-i="ar7">Чем лендинг отличается от сайта</a><a href="/skolko-stoit-chat-bot.html" data-i="ar8">Сколько стоит чат-бот</a><a href="/tilda-ili-wordpress.html" data-i="ar9">Tilda или WordPress</a><a href="/skolko-stoit-domen-i-hosting.html" data-i="ar10">Сколько стоит домен и хостинг</a><a href="/skolko-stoit-podderzhka-sayta.html" data-i="ar11">Сколько стоит поддержка сайта</a><a href="/chto-vhodit-v-sozdanie-sayta.html" data-i="ar12">Что входит в создание сайта</a><a href="/neyroset-dlya-sozdaniya-sayta.html" data-i="ar13">Сайт нейросетью: что получается</a><a href="/neyroset-dlya-prezentacii.html" data-i="ar14">Презентация нейросетью: что получается</a></nav><p data-i="a-4">Рейтинг 4,89 на Профи.ру, здесь собраны 34 отзыва. В портфолио 46 работ. Оценка задачи бесплатная — опишите, что нужно, и получите цену со сроком.</p></div></div></section><section id="brief"><div class="wrap"><p class="eyebrow r" data-i="ey4">Заявка</p><h2 class="r" data-i="b-h">Оставьте заявку</h2><p class="lead r" data-i="b-l">Три поля — этого хватит. Отвечаем круглосуточно, в течение 5 минут, называем точную цену и срок.</p><div class="brief r"><form class="card" id="form" onsubmit="return false"><div class="fields"><label><span data-i="f1">Как вас зовут</span><input id="name" type="text" placeholder="Имя" data-ph="ph0" autocomplete="name"></label><label><span data-i="f2">Куда ответить</span><input id="contact" type="text" placeholder="@telegram, телефон или e-mail" data-ph="ph1" autocomplete="on"></label><label><span data-i="f3">Что нужно сделать</span><textarea id="details" placeholder="Например: сайт-визитка для автосервиса, есть логотип, нужно за неделю" data-ph="ph2"></textarea></label></div><label class="agree"><input type="checkbox" id="agree"><span data-i="agree">Даю <a class="lk" href="/soglasie.html" target="_blank">согласие на обработку персональных данных</a></span></label><button class="btn" id="send"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M21.7 3.3a1 1 0 0 0-1.05-.16L2.9 10.6c-.85.36-.8 1.6.07 1.9l4.4 1.48 1.7 5.3c.26.8 1.29.99 1.82.34l2.35-2.9 4.5 3.3c.6.44 1.46.12 1.62-.6l3.2-14.2a1 1 0 0 0-.3-.92ZM9.4 14.1l9-6.6-6.9 7.5-.3 3-1.8-3.9Z"/></svg><span data-i="send">Оставить заявку</span></button><p class="hint" id="hint" data-i="hint">Оценка задачи и смета бесплатные. Отвечаем круглосуточно, в течение 5 минут.</p><p class="hint" data-i="terms" style="opacity:.75">Как обрабатываются данные — в <a class="lk" href="/privacy.html" target="_blank">политике обработки персональных данных</a>.</p><div class="done"><div class="tick">✓</div><b data-i="okT">Заявка отправлена</b><p data-i="okD">Уже вижу её в Telegram. Отвечу в течение 5 минут и пришлю точную смету со сроком.</p></div></form><div class="ctc r"><span data-i="ctc0">Не любите формы —</span><a href="https://t.me/ysddev" target="_blank" rel="noopener">Telegram @ysddev</a><a href="mailto:theysddev@gmail.com">theysddev@gmail.com</a></div></div></div></section></main><footer><div class="wrap"><div class="fbar"><svg class="mk mk-ft" viewBox="0 0 2346 852" role="img" aria-label="YSD DEV"><use href="#ysdmk"></use></svg><nav class="fnav"><a href="https://t.me/ysddev" target="_blank" rel="noopener">Telegram — @ysddev</a><a href="https://profi.ru/profile/SherzodaYN/" target="_blank" rel="noopener">Профи.ру</a><a href="/sozdanie-saytov.html" data-i="fsv">Услуги</a><a href="#prices" data-i="nav6">Цены</a><a href="#brief" data-i="nav4">Заявка</a><a href="/privacy.html" data-i="fpol">Политика</a><a href="/soglasie.html" data-i="fsog">Согласие</a><a href="/usloviya.html" data-i="fusl">Условия</a><a href="/privacy.html#cookie" id="ccOpen" data-i="ccL">Куки</a></nav></div><p class="copy"><span data-i="fcopy">© 2026 YSD DEV</span></p></div></footer><button class="ai-launch" id="aiOpen" aria-label="Консультант"><svg class="mk" viewBox="0 0 2346 852" role="img" aria-label="YSD DEV"><use href="#ysdmk"></use></svg><span class="dot2"></span></button><div class="cc" id="cc" role="region" aria-label="Cookie"><p data-i="ccT">Сайт использует куки и Яндекс Метрику, чтобы видеть, какие страницы полезны. Метрика включится только после вашего согласия, рекламных куки нет. <a class="lk" href="/privacy.html#cookie">Подробнее</a></p><div class="ccb"><button type="button" id="ccNo" data-i="ccN">Только необходимые</button><button type="button" class="y" id="ccYes" data-i="ccY">Принять</button></div></div><section class="ai" id="ai" aria-live="polite"><header class="ai-hd"><span class="ai-av"><svg class="mk" viewBox="0 0 2346 852" role="img" aria-label="YSD DEV"><use href="#ysdmk"></use></svg></span><div><strong data-i="aiT">Помощник YSD DEV</strong><em data-i="aiS">Отвечаю сразу · позову человека, если нужно</em></div><button id="aiClose" aria-label="Close">×</button></header><div class="ai-log" id="aiLog"></div><div class="ai-chips" id="aiChips"></div><form class="ai-in" id="aiForm"><input id="aiText" type="text" placeholder="Спросите что угодно о заказе" data-ph="aiPh" autocomplete="off"><button type="submit" aria-label="Send"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M21.7 3.3a1 1 0 0 0-1.05-.16L2.9 10.6c-.85.36-.8 1.6.07 1.9l4.4 1.48 1.7 5.3c.26.8 1.29.99 1.82.34l2.35-2.9 4.5 3.3c.6.44 1.46.12 1.62-.6l3.2-14.2a1 1 0 0 0-.3-.92ZM9.4 14.1l9-6.6-6.9 7.5-.3 3-1.8-3.9Z"/></svg></button></form></section><div class="mbar" id="mbar"><a class="btn" href="#brief" data-i="mb1">Оставить заявку</a></div><div class="lb" id="lb" role="dialog" aria-modal="true" tabindex="-1"><button class="lb-close" id="lbClose" aria-label="Close">×</button><div class="lb-top"><div><strong id="lbT"></strong><em id="lbS"></em></div><span class="hint" data-i="lb-z">Нажмите на работу — приблизить</span><a class="lb-link" id="lbLink" href="#" target="_blank" rel="noopener" hidden>Открыть проект ↗</a><span class="cnt" id="lbC"></span></div><div class="lb-stage"><button class="nav-b" id="lbPrev" aria-label="Previous">‹</button><img id="lbI" alt="" referrerpolicy="no-referrer" onerror="YSD.fix(this)"><button class="nav-b" id="lbNext" aria-label="Next">›</button></div><div class="lb-thumbs" id="lbTh"></div></div>
<script>(function(){
/* =====================================================================
НАСТРОЙКИ — единственное место, где что-то нужно поменять
===================================================================== */
var TG = "ysddev"; /* ваш ник в Telegram, без @ */
var SEND = {
mode : "script",
/* Адрес приёмника заявок на РОССИЙСКОМ хостинге (zayavka.php из архива ysddev-server).
Пока пусто — сайт сам ничего никуда не отправляет: текст заявки копируется
и открывается ваш Telegram. Так персональные данные не уходят за рубеж
через сайт (ст. 18 ч. 5 152-ФЗ). Google Apps Script больше не используется. */
url : ""
};
var STATS = ""; /* серверного счётчика на GitHub Pages нет */
var METRIKA = "112490537"; /* номер счётчика Яндекс.Метрики. Пусто — статистики нет */
/* ================= РАБОТЫ =================
Картинки лежат в папке img на вашем домене: 400, 800, 1200, 1920 и 3840 px по ширине, 16:9.
Нативная генерация — 1672×941, 1920 и 3840 — аккуратное увеличение Lanczos без «дорисовки». */
var IMG = "img/";
function pad(i){ return WORKS[i].f; }
function pic(i, w){ return IMG + pad(i) + "-" + (w <= 400 ? 400 : w <= 800 ? 800 : w <= 1200 ? 1200 : w <= 1920 ? 1920 : 3840) + ".webp"; }
function srcset(i, ws){ return (ws || [400, 800, 1200, 1920]).map(function(w){ return IMG + pad(i) + "-" + w + ".webp " + w + "w"; }).join(", "); }
var WORKS = [
{c:"site",t:"Туры по Байкалу «Сибирский маршрут»",te:"Siberian Route Baikal tours",s:"Карта Байкала «лёд/лето», конструктор тура, календарь заездов",se:"Ice/summer Baikal map, tour builder, departures calendar",g:["Сайт","Конструктор"],f:"82",u:"https://travel.ysdprojects.space/"},
{c:"bot",t:"Telegram-бот доставки «Сытый двор»",te:"Sytyi Dvor food delivery bot",s:"Меню и корзина в чате, оплата, статусы с картой курьера, экран кухни",se:"In-chat menu and cart, payment, courier tracking, kitchen screen",g:["Telegram","Оплата"],f:"87",u:"https://bots.ysdprojects.space/food/"},
{c:"site",t:"Часовая мастерская «Меридиан»",te:"Meridian watch workshop",s:"Конфигуратор часов с живым ходом, гравировка, расчёт сервиса",se:"Live-ticking watch configurator, engraving, service calculator",g:["Сайт","Конфигуратор"],f:"86",u:"https://watches.ysdprojects.space/"},
{c:"deck",t:"Франшиза пекарни «Хлеб & Сахар»",te:"Bread & Sugar franchise deck",s:"Форматы точек, инвестиции по статьям, калькулятор окупаемости",se:"Store formats, investment breakdown, payback calculator",g:["Франшиза","Калькулятор"],f:"95",u:"https://slides.ysdprojects.space/franchise/"},
{c:"site",t:"Бюро брендинга «Параллель»",te:"Parallel branding studio",s:"Песочница бренда: логотипы на лету, кейсы, смета услуг",se:"Brand sandbox with live logos, cases, service estimate",g:["Сайт","Генератор"],f:"83",u:"https://studio.ysdprojects.space/"},
{c:"software",t:"Диспетчерская доставки «Маршрут»",te:"Marshrut delivery dispatch",s:"Курьеры на карте в реальном времени, назначение заказов, оптимизация маршрутов",se:"Live courier map, order assignment, route optimisation",g:["Веб-сервис","Логистика"],f:"100",u:"https://apps.ysdprojects.space/dispatch/"},
{c:"site",t:"Салон красоты «NOIR»",te:"NOIR beauty salon",s:"Зеркало образов, онлайн-запись с учётом длительности, мастера, сертификаты",se:"Look mirror, duration-aware booking, stylists, gift cards",g:["Сайт","Онлайн-запись"],f:"64",u:"https://salon.ysdprojects.space/"},
{c:"bot",t:"Telegram-бот записи в салон NOIR",te:"NOIR salon booking bot",s:"Запись к мастеру за минуту, напоминания с переносом, журнал салона",se:"One-minute booking, reminders with rescheduling, salon schedule",g:["Telegram","Онлайн-запись"],f:"88",u:"https://bots.ysdprojects.space/beauty/"},
{c:"site",t:"Логистика «Восточный вектор»",te:"Vostochny Vector logistics",s:"Карта маршрутов из Китая, калькулятор доставки, трекинг груза",se:"China route map, freight calculator, cargo tracking",g:["Сайт","Калькулятор"],f:"80",u:"https://logistics.ysdprojects.space/"},
{c:"deck",t:"Тендерная презентация «ОСНОВА»",te:"OSNOVA tender deck",s:"Чертёжный стиль, график Ганта, КП с вариантами каркаса",se:"Blueprint style, Gantt chart, offer with frame options",g:["Тендер","Инфографика"],f:"96",u:"https://slides.ysdprojects.space/tender/"},
{c:"site",t:"Мебельная фабрика «Лён & Дуб»",te:"Linen & Oak furniture factory",s:"Конструктор дивана, примерка в комнате, каталог с корзиной",se:"Sofa configurator, room fit, catalogue with cart",g:["Сайт","Конфигуратор"],f:"85",u:"https://furniture.ysdprojects.space/"},
{c:"software",t:"CRM «Воронка» для отдела продаж",te:"Voronka sales CRM",s:"Канбан сделок с перетаскиванием, карточка клиента, дашборд план/факт",se:"Drag-and-drop deal board, client card, plan vs actual dashboard",g:["Веб-сервис","CRM"],f:"99",u:"https://apps.ysdprojects.space/crm/"},
{c:"site",t:"Загородный отель «Лесная тишина»",te:"Forest Silence country hotel",s:"Время суток на Алтае в первом экране, бронь с календарём, территория",se:"Altai time-of-day hero, calendar booking, grounds map",g:["Сайт","Бронирование"],f:"77",u:"https://hotel.ysdprojects.space/"},
{c:"design",t:"Фирменный стиль кофеен «НОРД»",te:"NORD coffee roasters brand identity",s:"Живой брендбук: конструктор логотипа, палитра, носители, меню-борд",se:"Live brand book: logo builder, palette, mockups, menu board",g:["Айдентика", "Брендбук"],f:"48",u:"https://design.ysdprojects.space/nord/"},
{c:"bot",t:"Telegram-бот автосервиса «ГАРАЖ 116»",te:"GARAGE 116 car service bot",s:"Расчёт ТО, фотоотчёт, согласование работ кнопками, доска приёмщика",se:"Service estimate, photo report, one-tap approvals, service board",g:["Telegram","CRM"],f:"89",u:"https://bots.ysdprojects.space/auto/"},
{c:"site",t:"Юридическое бюро «Статус»",te:"Status law firm",s:"Навигатор по ситуации с дорожной картой, смета по этапам, запись",se:"Case navigator with a roadmap, staged pricing, booking",g:["Сайт","Квиз"],f:"81",u:"https://law.ysdprojects.space/"},
{c:"deck",t:"Питч-дек стартапа «Смена»",te:"Smena startup pitch deck",s:"Живое демо продукта на слайде, рынок, юнит-экономика, раунд",se:"Live product demo slide, market, unit economics, round",g:["Инвесторам","Инфографика"],f:"94",u:"https://slides.ysdprojects.space/pitch/"},
{c:"site",t:"Приложение «Запас»",te:"Zapas savings app",s:"Рабочий прототип в телефоне, симулятор накоплений, тарифы",se:"Working phone prototype, savings simulator, plans",g:["Сайт","Прототип"],f:"84",u:"https://fintech.ysdprojects.space/"},
{c:"software",t:"BI-дашборд «Пульс»",te:"Pulse BI dashboard",s:"KPI сети магазинов, графики с фильтрами, аномалии, экспорт",se:"Retail KPIs, filterable charts, anomalies, export",g:["Веб-сервис","Аналитика"],f:"102",u:"https://apps.ysdprojects.space/bi/"},
{c:"site",t:"Ресторан «ТЕРРАСА»",te:"TERRACE restaurant",s:"Схема зала с бронью и светом заката, меню, банкеты",se:"Floor-plan booking with sunset light, menu, banquets",g:["Сайт","Бронирование"],f:"72",u:"https://resto.ysdprojects.space/"},
{c:"bot",t:"ИИ-ассистент «Секретарь» в Telegram",te:"Secretary AI assistant bot",s:"Ответы на отзывы, пересказ договоров, поиск по базе знаний",se:"Review replies, contract summaries, knowledge-base answers",g:["Telegram","ИИ"],f:"91",u:"https://bots.ysdprojects.space/ai/"},
{c:"site",t:"ЖК «Речной квартал»",te:"River Quarter residential",s:"Шахматка квартир по домам, планировки, ипотечный калькулятор",se:"Apartment grid by building, layouts, mortgage calculator",g:["Сайт","Калькулятор"],f:"76",u:"https://realty.ysdprojects.space/"},
{c:"deck",t:"Презентация «Траектория для бизнеса»",te:"Trajectory for Business deck",s:"Программы, интерфейс платформы, калькулятор стоимости обучения",se:"Programmes, platform screens, training cost calculator",g:["B2B","Калькулятор"],f:"97",u:"https://slides.ysdprojects.space/edu/"},
{c:"site",t:"Стоматология «Белый квадрат»",te:"White Square dental clinic",s:"Интерактивная карта зубов, калькулятор имплантации, онлайн-запись",se:"Interactive tooth map, implant calculator, online booking",g:["Сайт","Онлайн-запись"],f:"70",u:"https://dental.ysdprojects.space/"},
{c:"design",t:"Айдентика фестиваля «РИТМ 2027»",te:"RITM 2027 festival identity",s:"Генеративная лента, генератор афиш, лайнап, билеты и мерч",se:"Generative ribbon, poster generator, line-up, tickets and merch",g:["Айдентика", "Афиши"],f:"50",u:"https://design.ysdprojects.space/ritm/"},
{c:"software",t:"Складской учёт «Остаток»",te:"Ostatok warehouse system",s:"Приёмка и отгрузка со сканером, инвентаризация, карта склада",se:"Receiving and shipping with a scanner, stocktake, warehouse map",g:["Веб-сервис","Склад"],f:"101",u:"https://apps.ysdprojects.space/warehouse/"},
{c:"site",t:"Барбершоп «KRAFT»",te:"KRAFT barbershop",s:"Техкарта стрижки на «расчёске», запись к барберу, абонементы",se:"Haircut spec on a comb slider, barber booking, memberships",g:["Сайт","Онлайн-запись"],f:"65",u:"https://barber.ysdprojects.space/"},
{c:"bot",t:"Telegram-бот ЖК «Речной квартал»",te:"River Quarter apartment bot",s:"Подбор квартиры, ипотека в чате, запись на показ, лид в CRM",se:"Apartment search, in-chat mortgage, viewing booking, CRM lead",g:["Telegram","Лиды"],f:"90",u:"https://bots.ysdprojects.space/realty/"},
{c:"site",t:"Пекарня «Хлеб & Сахар»",te:"Bread & Sugar bakery",s:"Коробка, в которую «падает» выпечка, зоны доставки, торты",se:"Fill-the-box builder, delivery zones, cake calculator",g:["Сайт","Конфигуратор"],f:"73",u:"https://bakery.ysdprojects.space/"},
{c:"deck",t:"Презентация IT-компании «Северный код»",te:"Northern Code IT company deck",s:"Кейсы с метриками, модели работы, калькулятор оценки проекта",se:"Cases with metrics, engagement models, project estimator",g:["Веб-презентация","Калькулятор"],f:"93",u:"https://slides.ysdprojects.space/it/"},
{c:"site",t:"Клиника косметологии «LUMEN»",te:"LUMEN cosmetology clinic",s:"Луч по слоям кожи, квиз-подбор процедуры, запись к врачу",se:"Skin-depth light beam, procedure quiz, doctor booking",g:["Сайт","Квиз"],f:"71",u:"https://cosmo.ysdprojects.space/"},
{c:"software",t:"Управление проектами «Спринт»",te:"Sprint project management",s:"Доска задач, диаграмма Ганта с перетаскиванием, загрузка команды",se:"Task board, draggable Gantt, team workload",g:["Веб-сервис","Задачи"],f:"103",u:"https://apps.ysdprojects.space/pm/"},
{c:"site",t:"Автосервис «ГАРАЖ 116»",te:"GARAGE 116 car service",s:"Диагностический сканер «что беспокоит», калькулятор ТО, статус ремонта",se:"Diagnostic scanner, service calculator, live repair status",g:["Сайт","Калькулятор"],f:"66",u:"https://garage.ysdprojects.space/"},
{c:"bot",t:"Бот поддержки магазина «Тёплый дом»",te:"Warm Home support bot",s:"Статус заказа, возврат с QR-кодом, оператор и хелпдеск с SLA",se:"Order status, QR returns, live operator and SLA helpdesk",g:["Telegram","Поддержка"],f:"92",u:"https://bots.ysdprojects.space/shop/"},
{c:"site",t:"Детейлинг-центр «POLISH LAB»",te:"POLISH LAB detailing",s:"Тест-участок 50/50 с лампой, калькулятор пакетов, статус заказа",se:"50/50 inspection-lamp panel, package calculator, order status",g:["Сайт","Калькулятор"],f:"67",u:"https://detailing.ysdprojects.space/"},
{c:"deck",t:"Презентация ЖК «Речной квартал»",te:"River Quarter residential deck",s:"Генплан с наличием, планировки, ход стройки, ипотека",se:"Site plan with availability, layouts, progress, mortgage",g:["Недвижимость","Инфографика"],f:"98",u:"https://slides.ysdprojects.space/realty/"},
{c:"site",t:"Строительная компания «ОСНОВА»",te:"OSNOVA construction",s:"Дом в разрезе со стройкой по шагам, калькулятор, объекты на Кубани",se:"Step-by-step house cutaway, cost calculator, projects in Kuban",g:["Сайт","Калькулятор"],f:"68",u:"https://stroy.ysdprojects.space/"},
{c:"software",t:"База знаний «Справочная»",te:"Spravochnaya knowledge base",s:"Поиск с подсветкой, редактор статей, история версий, онбординг",se:"Highlighted search, article editor, version history, onboarding",g:["Веб-сервис","Wiki"],f:"104",u:"https://apps.ysdprojects.space/kb/"},
{c:"design",t:"Упаковка косметики «TERRA»",te:"TERRA skincare packaging",s:"Флакон на 360°, анатомия этикетки, материалы, конструктор набора",se:"360° bottle, label anatomy, materials, gift set builder",g:["Упаковка", "3D"],f:"49",u:"https://design.ysdprojects.space/terra/"},
{c:"site",t:"Ремонт квартир «Чистый лист»",te:"Clean Slate renovation",s:"План квартиры с покраской стен, калькулятор по комнатам, график работ",se:"Floor plan with wall colours, room calculator, schedule",g:["Сайт","Калькулятор"],f:"69",u:"https://remont.ysdprojects.space/"},
{c:"site",t:"Фитнес-клуб «FORMA»",te:"FORMA fitness club",s:"Пульс занятия в реальном времени, расписание, конструктор абонемента",se:"Live class heart-rate, schedule, membership builder",g:["Сайт","Расписание"],f:"74",u:"https://fitness.ysdprojects.space/"},
{c:"site",t:"Йога-студия «ПРАНА»",te:"PRANA yoga studio",s:"Дыхательный круг, ведущий скролл, расписание, абонементы",se:"Scroll-led breathing circle, schedule, passes",g:["Сайт","Расписание"],f:"75",u:"https://yoga.ysdprojects.space/"},
{c:"site",t:"Детский центр «Умка»",te:"Umka kids centre",s:"Живые персонажи-фигуры, подбор программы по возрасту, расписание",se:"Living shape characters, age-based programme picker, schedule",g:["Сайт","Расписание"],f:"78",u:"https://kids.ysdprojects.space/"},
{c:"site",t:"Онлайн-школа «Траектория»",te:"Trajectory online school",s:"Дорожная карта-траектория, вебинары по вашему поясу, калькулятор",se:"Trajectory roadmap, time-zone webinars, price calculator",g:["Сайт","Калькулятор"],f:"79",u:"https://online.ysdprojects.space/"},
{c:"design",t:"Каталог архбюро «ЛИНИЯ»",te:"LINIYA architecture catalogue",s:"Интерактивный каталог: развороты, планы, материалы и свет",se:"Interactive catalogue: spreads, plans, materials and light",g:["Каталог", "Вёрстка"],f:"51",u:"https://design.ysdprojects.space/liniya/"},
{c:"design",t:"Приложение привычек «DAILY»",te:"DAILY habit app",s:"Дизайн и живой прототип: кольца прогресса, неделя, статистика, темы",se:"Design and live prototype: progress rings, week view, stats, themes",g:["UI/UX", "Прототип"],f:"53",u:"https://design.ysdprojects.space/daily/"}
];
var FILTERS = [
{k:"all", ru:"Все", en:"All"},
{k:"site", ru:"Сайты", en:"Websites"},
{k:"bot", ru:"Telegram-боты", en:"Telegram bots"},
{k:"deck", ru:"Презентации", en:"Presentations"},
{k:"software", ru:"Разработка ПО", en:"Software"},
{k:"design", ru:"Дизайн", en:"Design"}
];
var PRICES = [
{k:"sites", ru:"Сайты", en:"Websites", items:[
["Создание сайта-визитки","Business-card site","9 000 ₽"],
["Landing page","Landing page","12 000 ₽"],
["Прелендинг","Pre-landing page","10 000 ₽"],
["Quiz-сайт","Quiz site","14 000 ₽"],
["Страница благодарности","Thank-you page","3 000 ₽"],
["Сайт-портфолио","Portfolio site","12 000 ₽"],
["Создание сайтов — под ключ","Website, end to end","от 15 000 ₽"],
["Создание сайта на Tilda","Website on Tilda","15 000 ₽"],
["Создание сайтов на WordPress","Website on WordPress","18 000 ₽"],
["Сайт на 1С-Битрикс","Website on 1C-Bitrix","25 000 ₽"],
["Корпоративный сайт","Corporate website","30 000 ₽"],
["Создание интернет-магазина","Online store","45 000 ₽"],
["Разработка концепции сайта","Website concept","от 7 000 ₽"],
["Создание сайта с помощью нейросети","AI-assisted website","от 8 000 ₽"]
]},
{k:"design", ru:"Дизайн и вёрстка", en:"Design & front-end", items:[
["Веб-дизайн","Web design","от 15 000 ₽"],
["Вёрстка сайтов","Front-end build","от 5 000 ₽"],
["Вёрстка из Figma / PSD","Figma / PSD to HTML","от 5 000 ₽"],
["Адаптивная вёрстка","Responsive build","от 5 000 ₽"],
["Мобильная версия сайта","Mobile version","от 7 000 ₽"],
["Вёрстка email-писем","Email templates","от 4 000 ₽"],
["Логотип","Logo","8 000 ₽"],
["Дизайн упаковки","Packaging design","12 000 ₽"]
]},
{k:"bots", ru:"Боты и приложения", en:"Bots & apps", items:[
["Настройка готового бота","Setting up an existing bot","6 000 ₽"],
["Разработка ботов Telegram","Telegram bots","12 000 ₽"],
["Чат-бот для сайта и мессенджеров","Chatbot for a site or messengers","12 000 ₽"],
["Создание ботов WhatsApp","WhatsApp bots","12 000 ₽"],
["Создание AI-ботов","AI bots","20 000 ₽"],
["Telegram Mini App","Telegram Mini App","30 000 ₽"],
["Мобильное приложение (Mini App / PWA)","Mobile app (Mini App / PWA)","от 60 000 ₽"]
]},
{k:"dev", ru:"Разработка, доработка и интеграции", en:"Development, support & integrations", items:[
["Веб-приложение","Web app","от 40 000 ₽"],
["CRM","CRM","от 40 000 ₽"],
["Дашборд","Dashboard","от 25 000 ₽"],
["Доработка сайта","Site fixes & improvements","от 2 500 ₽"],
["Доработка сайта на WordPress","WordPress fixes","от 2 500 ₽"],
["Доработка сайта на Bitrix","Bitrix fixes","от 2 500 ₽"],
["Доработка сайта на Joomla","Joomla fixes","от 2 500 ₽"],
["Доработка сайта на OpenCart","OpenCart fixes","от 2 500 ₽"],
["Доработка сайта на MODx","MODx fixes","от 2 500 ₽"],
["Написание скриптов для сайтов","Custom scripts","от 3 000 ₽"],
["Виджеты для сайта","Site widgets","от 3 000 ₽"],
["Калькулятор для сайта","Price calculator","от 10 000 ₽"],
["Личный кабинет для сайта","User dashboard","от 20 000 ₽"],
["Создание онлайн-конструктора","Online configurator","от 25 000 ₽"],
["Настройка API","API integrations","от 5 000 ₽"],
["Подключение онлайн-оплаты","Payment gateways","5 000 ₽"],
["Перенос сайта на другую CMS","CMS migration","от 10 000 ₽"],
["Домен + хостинг + SSL","Domain + hosting + SSL","1 000 ₽"],
["Настройка Яндекс.Метрики","Yandex Metrica setup","2 000 ₽"],
["Установка счётчиков","Analytics counters","1 000 ₽"],
["Почасовая работа программиста","Hourly development","2 000 ₽/ч"]
]},
{k:"deck", ru:"Презентации", en:"Presentations", items:[
["Оформление презентаций","Presentation design","от 7 000 ₽"],
["Видеопрезентации","Video presentations","от 10 000 ₽"],
["Интерактивная презентация","Interactive presentation","12 000 ₽"],
["Дизайн коммерческих предложений","Sales proposal design","5 000 ₽"]
]}
];
var EN = null;
var RU = {
_greet:"Новая заявка с сайта YSD DEV",
_task:"Задача", _name:"Имя", _contact:"Связь", _from:"Страница",
_pick:"выберите пункт слева",
_sending:"Отправляю…",
_copied:"Заявка скопирована, открываю Telegram — вставьте текст в чат и нажмите «Отправить».",
_manual:"Открываю Telegram — опишите задачу сообщением, отвечу в течение 5 минут."
};
var lang = "ru", node = document.querySelectorAll("[data-i]"), ph = document.querySelectorAll("[data-ph]");
node.forEach(function(el){ el.dataset.ru = el.innerHTML; });
ph.forEach(function(el){ el.dataset.phru = el.placeholder; });
function T(k){ return lang === "en" && EN ? (EN[k] || RU[k] || k) : (RU[k] || k); }
function withEN(cb){
if (EN) { cb(); return; }
var sc = document.createElement("script");
sc.src = "/en.js";
sc.onload = function(){ EN = window.__EN || {}; cb(); };
sc.onerror = function(){ EN = {}; cb(); };
document.head.appendChild(sc);
}
function setLang(L){
if (L === "en" && !EN) { withEN(function(){ setLang("en"); }); return; }
lang = L;
document.documentElement.lang = L;
document.documentElement.classList.toggle("en", L === "en");
node.forEach(function(el){
var k = el.dataset.i;
el.innerHTML = L === "en" && EN ? (EN[k] !== undefined ? EN[k] : el.dataset.ru) : el.dataset.ru;
});
ph.forEach(function(el){
var k = el.dataset.ph;
el.placeholder = L === "en" && EN ? (EN[k] || el.dataset.phru) : el.dataset.phru;
});
document.querySelectorAll(".lang button").forEach(function(b){
b.setAttribute("aria-pressed", String(b.dataset.lang === L));
});
draw(); if (typeof drawTick === "function") drawTick(); if (typeof heavyDone !== "undefined" && heavyDone) { drawFilters(); drawWorks(); drawPrices(); drawReviews(); }
if(lb.classList.contains("on")) paintLb();
if(window.YSD_AI) YSD_AI.reset();
}
document.querySelectorAll(".lang button").forEach(function(b){
b.addEventListener("click", function(){ setLang(b.dataset.lang); });
if (b.dataset.lang === "en") {
var warm = function(){ b.removeEventListener("pointerenter", warm); b.removeEventListener("focus", warm); withEN(function(){}); };
b.addEventListener("pointerenter", warm, {passive:true});
b.addEventListener("focus", warm);
}
});
var fBox = document.getElementById("filters"), wGrid = document.getElementById("worksGrid"),
wMore = document.getElementById("wMore"), cur = "all";
function matchF(w, k){ return k === "all" || (k === "live" ? !!w.u : w.c === k); }
function drawFilters(){
fBox.innerHTML = FILTERS.map(function(f){
var n = WORKS.filter(function(w){ return matchF(w, f.k); }).length;
return '<button type="button" data-k="' + f.k + '" aria-pressed="' + (f.k === cur) + '">' +
(lang === "en" ? f.en : f.ru) + '<i>' + n + '</i></button>';
}).join("");
fBox.querySelectorAll("button").forEach(function(b){
b.addEventListener("click", function(){ cur = b.dataset.k; wAll = false; drawFilters(); drawWorks(); });
});
}
/* показываем вперемешку: сайт — презентация — бот, чтобы соседние работы
не выглядели как один и тот же проект */
var MIX = WORKS.map(function(_, i){ return i; });
var LIM = 12, wAll = false;
function fillRow(){}
var CAT = {site:["Сайт","Website"], bot:["Telegram-бот","Telegram bot"], deck:["Презентация","Presentation"],
software:["Разработка ПО","Software"], design:["Дизайн","Design"]};
function isConcept(w){ return /—\s*концепт$/i.test(w.t); }
function bare(t){ return t.replace(/\s*—\s*(концепт|concept)$/i, ""); }
addEventListener("resize", function(){ clearTimeout(fillRow._t); fillRow._t = setTimeout(fillRow, 150); });
function drawWorks(){
var shown = 0;
LIM = (getComputedStyle(wGrid).gridTemplateColumns.split(" ").length || 3) * 3;
wGrid.innerHTML = MIX.map(function(i){
var w = WORKS[i];
if(!matchF(w, cur)) return "";
shown++;
var hide = !wAll && shown > LIM;
var nm = lang === "en" ? w.te : w.t;
return '<figure class="live" style="--k:' + ((shown - 1) % 12) + '" tabindex="0" role="button" aria-label="' + nm + '" data-i="' + i + '"' + (hide ? " hidden" : "") + '>' +
'<div class="ph">' + (w.u ? '<span class="lv">online</span>' : '') + '<span class="sheen"></span>' +
'<img alt="' + nm + '" width="1920" height="1080" ' +
(shown <= 6 ? 'decoding="async" ' : 'loading="lazy" decoding="async" ') +
'sizes="(max-width:720px) 47vw, (max-width:1500px) 31vw, 340px" ' +
'srcset="' + srcset(i, [400, 800, 1200]) + '" src="' + pic(i, 400) + '" onerror="YSD.fix(this)"></div></figure>';
}).join("");
wGrid.querySelectorAll("figure").forEach(function(f){
tilt(f);
f.addEventListener("click", function(){ openLb(+f.dataset.i); });
f.addEventListener("keydown", function(e){ if(e.key === "Enter" || e.key === " "){ e.preventDefault(); openLb(+f.dataset.i); } });
});
var left = shown - LIM;
wMore.innerHTML = (wAll || left <= 0) ? "" :
'<button type="button">' + (lang === "en" ? "Show all work" : "Показать все работы") +
'<i>+' + left + '</i>' +
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14M19 12l-7 7-7-7"/></svg>' +
'</button>';
fillRow();
var btn = wMore.querySelector("button");
if(btn) btn.addEventListener("click", function(){
wAll = true; drawWorks();
var f = wGrid.querySelectorAll("figure")[LIM];
if(f) f.scrollIntoView({behavior: "smooth", block: "center"});
});
}
window.YSD = {
fix: function(img){ var f = img.closest("figure"); if(f) f.classList.add("noimg"); }
};
function tilt(f){
var raf;
f.addEventListener("pointermove", function(e){
if(!matchMedia("(hover:hover)").matches || innerWidth < 861 || matchMedia("(prefers-reduced-motion:reduce)").matches) return;
cancelAnimationFrame(raf);
raf = requestAnimationFrame(function(){
var r = f.getBoundingClientRect();
var x = (e.clientX - r.left) / r.width - .5, y = (e.clientY - r.top) / r.height - .5;
f.style.transform = "perspective(900px) rotateX(" + (-y * 4).toFixed(2) + "deg) rotateY(" + (x * 5).toFixed(2) + "deg) translateY(-4px)";
f.style.setProperty("--mx", (x * 100 + 50).toFixed(1) + "%");
f.style.setProperty("--my", (y * 100 + 50).toFixed(1) + "%");
});
});
f.addEventListener("pointerleave", function(){ cancelAnimationFrame(raf); f.style.transform = ""; });
}
var lb = document.getElementById("lb"), lbI = document.getElementById("lbI"),
lbT = document.getElementById("lbT"), lbS = document.getElementById("lbS"), lbC = document.getElementById("lbC"),
at = 0, lbList = [], pos = 0;
function paintLb(){
var w = WORKS[at];
unzoom();
lbI.sizes = "(max-aspect-ratio:16/9) 100vw, 178vh";
lbI.srcset = srcset(at, [1200, 1920, 3840]);
lbI.src = pic(at, 1920);
lbI.alt = lang === "en" ? w.te : w.t;
lbT.textContent = lang === "en" ? w.te : w.t;
lbS.textContent = (lang === "en" ? w.se : w.s) + " · " + w.g.join(" · ");
lbC.textContent = (pos + 1) + " / " + lbList.length;
var lbL = document.getElementById("lbLink"); if(lbL){ if(w.u){ lbL.href = w.u; lbL.hidden = false; lbL.textContent = w.c === "site" ? (lang === "en" ? "Open project ↗" : "Открыть проект ↗") : (lang === "en" ? "Open project ↗" : "Открыть проект ↗"); } else { lbL.hidden = true; } }
syncThumbs();
}
var lbTh = document.getElementById("lbTh");
function paintThumbs(){
lbTh.innerHTML = lbList.map(function(i, p){
return '<button type="button" data-p="' + p + '" aria-label="' + (p + 1) + '"' + (p === pos ? ' class="on"' : "") +
'><img loading="lazy" decoding="async" referrerpolicy="no-referrer" src="' + pic(i, 400) + '" onerror="YSD.fix(this)" alt=""></button>';
}).join("");
lbTh.querySelectorAll("button").forEach(function(b){
b.addEventListener("click", function(){ pos = +b.dataset.p; at = lbList[pos]; paintLb(); });
});
}
function syncThumbs(){
var bs = lbTh.querySelectorAll("button");
bs.forEach(function(b, p){ b.classList.toggle("on", p === pos); });
if(bs[pos]) bs[pos].scrollIntoView({inline:"center", block:"nearest", behavior:"smooth"});
}
document.addEventListener("click", function(e){
var a = e.target.closest && e.target.closest('a[href^="#"]');
if(!a) return;
var id = a.getAttribute("href").slice(1);
if(!id) return;
var el = document.getElementById(id);
if(!el) return;
e.preventDefault();
el.scrollIntoView({behavior: "smooth", block: "start"});
history.replaceState(null, "", "#" + id);
});
addEventListener("load", function(){
if(!location.hash) return;
var el = document.getElementById(location.hash.slice(1));
if(el) setTimeout(function(){ el.scrollIntoView({block: "start"}); }, 60);
});
var SEL = 'a[href],button:not([disabled]),input:not([disabled]),textarea,select,[tabindex]:not([tabindex="-1"])';
var lastFocus = null;
function vis(el){ return el.offsetWidth || el.offsetHeight || el.getClientRects().length; }
function focusables(box){ return [].slice.call(box.querySelectorAll(SEL)).filter(vis); }
function trapOn(box, first){
lastFocus = document.activeElement;
box._trap = function(e){
if(e.key !== "Tab") return;
var f = focusables(box); if(!f.length) return;
var a = f[0], z = f[f.length - 1];
if(e.shiftKey && document.activeElement === a){ e.preventDefault(); z.focus(); }
else if(!e.shiftKey && document.activeElement === z){ e.preventDefault(); a.focus(); }
};
box.addEventListener("keydown", box._trap);
setTimeout(function(){
var t = (first && vis(first)) ? first : focusables(box)[0];
if(t) t.focus();
}, 60);
}
function trapOff(box){
if(box._trap) box.removeEventListener("keydown", box._trap);
if(lastFocus && lastFocus.focus) try{ lastFocus.focus(); }catch(e){}
lastFocus = null;
}
var zm = false, zr = null;
function unzoom(){ zm = false; lb.classList.remove("zm"); lbI.style.transform = ""; lbI.style.transformOrigin = ""; }
function zAt(x, y){
var fx = Math.max(0, Math.min(1, (x - zr.left) / zr.width)), fy = Math.max(0, Math.min(1, (y - zr.top) / zr.height));
lbI.style.transformOrigin = (fx * 100).toFixed(2) + "% " + (fy * 100).toFixed(2) + "%";
}
lbI.addEventListener("click", function(e){
e.stopPropagation();
if(zm){ unzoom(); return; }
zr = lbI.getBoundingClientRect();
var k = Math.max(2, Math.min(3, 1920 / zr.width));
lbI.sizes = Math.round(zr.width * k) + "px";
zm = true; lb.classList.add("zm"); zAt(e.clientX, e.clientY);
lbI.style.transform = "scale(" + k.toFixed(2) + ")";
});
lbI.addEventListener("pointermove", function(e){ if(zm && e.pointerType !== "touch") zAt(e.clientX, e.clientY); });
function openLb(i){
lbList = MIX.filter(function(j){ return matchF(WORKS[j], cur); });
pos = lbList.indexOf(i);
if(pos < 0){ lbList = MIX.slice(); pos = lbList.indexOf(i); }
at = i; paintThumbs(); paintLb(); lb.classList.add("on"); document.body.style.overflow = "hidden"; trapOn(lb, lb);
}
function closeLb(){ unzoom(); lb.classList.remove("on"); document.body.style.overflow = ""; trapOff(lb); }
function step(d){ pos = (pos + d + lbList.length) % lbList.length; at = lbList[pos]; paintLb(); }
document.getElementById("lbClose").addEventListener("click", closeLb);
document.getElementById("lbPrev").addEventListener("click", function(e){ e.stopPropagation(); step(-1); });
document.getElementById("lbNext").addEventListener("click", function(e){ e.stopPropagation(); step(1); });
lb.addEventListener("click", function(e){ if(e.target === lb || e.target.classList.contains("lb-stage")) closeLb(); });
(function(){
var x0 = null, y0 = null, inScr = false;
lb.addEventListener("touchstart", function(e){
x0 = e.touches[0].clientX; y0 = e.touches[0].clientY;
inScr = false;
}, {passive:true});
lb.addEventListener("touchmove", function(e){ if(zm && zr) zAt(e.touches[0].clientX, e.touches[0].clientY); }, {passive:true});
lb.addEventListener("touchend", function(e){
if(x0 === null) return;
if(zm){ x0 = null; return; }
var dx = e.changedTouches[0].clientX - x0, dy = e.changedTouches[0].clientY - y0;
if(Math.abs(dx) > 55 && Math.abs(dx) > Math.abs(dy)) step(dx < 0 ? 1 : -1);
else if(!inScr && dy > 90 && Math.abs(dy) > Math.abs(dx)) closeLb();
x0 = null;
}, {passive:true});
})();
addEventListener("keydown", function(e){
if(!lb.classList.contains("on")) return;
if(e.key === "Escape") closeLb();
if(e.key === "ArrowLeft") step(-1);
if(e.key === "ArrowRight") step(1);
});
var REVIEWS = [
{n:"Анна", w:"Интернет-магазин · перенос на WordPress", we:"Online store · WordPress migration", p:"", d:"10 октября 2026", de:"10 October 2026", r:5, m:1, t:"Спасибо за перенос сайта. Все товары и букеты на месте. По моей просьбе разработчик оперативно настроил удобную мобильную панель для изменения цен и убрал лишние блоки с экрана телефона. Работа сделана, спасибо. Однозначно рекомендую!", te:"Thanks for migrating the site — every product and bouquet is in place. At my request the developer quickly set up a handy mobile panel for changing prices and removed the extra blocks from the phone screen. Job done, thank you. Definitely recommended!"},
{n:"Никита", w:"Лендинг · WordPress", we:"Landing page · WordPress", p:"25 000 ₽", d:"21 сентября 2026", de:"21 September 2026", r:5, m:1, t:"Спасибо большое специалисту, сделал всё, что необходимо, в точный срок. Справился со всеми установленными задачами. Спасибо!", te:"Many thanks to the specialist — he did everything that was needed, exactly on time, and handled every task we set. Thank you!"},
{n:"Александр", w:"Оформление презентаций", we:"Presentation design", p:"12 000 ₽", d:"17 сентября 2026", de:"17 September 2026", r:5, t:"Качественная и быстрая работа! Однозначно рекомендую!", te:"High-quality, fast work. Definitely recommended!"},
{n:"Дарья", w:"Корпоративный сайт · Tilda", we:"Corporate site · Tilda", p:"", d:"16 сентября 2026", de:"16 September 2026", r:5, m:1, t:"Осталась очень довольна результатом. Сразу поняли, какой сайт я хочу, помогли с оформлением и учли все мои пожелания. Все правки вносили быстро, всегда были на связи. В итоге сайт получился красивым, удобным и именно таким, как я представляла. Спасибо за отличную работу!", te:"Very happy with the result. They understood straight away what kind of site I wanted, helped with the design and took all my wishes into account. Every revision was made quickly and they were always reachable. The site came out beautiful, easy to use and exactly as I had imagined. Thank you for the great work!"},
{n:"Вероника", w:"Интернет-магазин", we:"Online store", p:"20 000 ₽", d:"15 сентября 2026", de:"15 September 2026", r:5, m:1, t:"Спасибо за проделанную работу. Специалист создал сайт по моим пожеланиям. Выполнил множество переделок, пока не достигли ожидаемого результата. Однозначно рекомендую.", te:"Thank you for the work. He built the site exactly to my wishes and made a lot of revisions until we reached the result I wanted. I recommend him without reservation."},
{n:"Екатерина", w:"Сайт-визитка", we:"Business-card site", p:"15 000 ₽", d:"15 сентября 2026", de:"15 September 2026", r:5, t:"Результатом довольна. Работа выполнена быстро, красиво и недорого. Спасибо!", te:"Happy with the result. The work was done fast, beautifully and inexpensively. Thank you!"},
{n:"Андрей", w:"Оформление презентаций", we:"Presentation design", p:"36 000 ₽", d:"11 сентября 2026", de:"11 September 2026", r:5, m:1, t:"Работа выполнена быстро и профессионально. Все доработки по презентации сделаны оперативно. Определённо рекомендую тем, для кого важны качество и скорость.", te:"The work was done fast and professionally. Every revision to the deck was handled promptly. I definitely recommend him to anyone who values quality and speed."},
{n:"Норман", w:"Интернет-магазин · доработка", we:"Online store · improvements", p:"15 000 ₽", d:"11 сентября 2026", de:"11 September 2026", r:5, t:"Быстро, чётко, продуктивно! Специалист сразу приступил к работе и быстро выполнил. Качество соответствующее. Очень хорошо!", te:"Fast, precise, productive. He got to work straight away and delivered quickly. The quality matches. Very good!"},
{n:"Екатерина", w:"Анимированная презентация", we:"Animated presentation", p:"10 000 ₽", d:"10 сентября 2026", de:"10 September 2026", r:5, m:1, t:"Выполнили заказ даже раньше оговорённого времени! Хочется отметить творческий подход, учитывающий и пожелания заказчика, и креатив. Прекрасное понимание задач, чёткое выполнение и быстрая корректировка.", te:"Delivered even earlier than agreed. A creative approach that took my wishes into account. An excellent grasp of the task, precise execution and fast revisions."},
{n:"Ruslan", w:"Интернет-магазин", we:"Online store", p:"68 000 ₽", d:"7 сентября 2026", de:"7 September 2026", r:5, m:1, t:"Сделали не просто сайт-открытку, а полноценную админ-панель с контролем, учётом заказов и доставок. Результатом остался доволен.", te:"They built not just a postcard of a shop, but a full admin panel with control, order tracking and deliveries. I am happy with the result."},
{n:"Саид", w:"Интернет-магазин", we:"Online store", p:"25 000 ₽", d:"5 сентября 2026", de:"5 September 2026", r:5, m:1, t:"Надо было срочно сделать сайт для магазина с функционалом — специалист взялся и сделал всё отлично, нареканий нет. Другие хотели втрое больше времени и вдвое больше цену. Лучший из всех вариантов.", te:"I needed a working shop site urgently — he took it on and did an excellent job, no complaints. Others wanted three times the time and twice the price. The best of all the options."},
{n:"Максим Шафирлв", w:"Сайт-визитка · WordPress", we:"Business-card site · WordPress", p:"", d:"1 сентября 2026", de:"1 September 2026", r:5, t:"Всё сделал быстро и качественно! Всегда был на связи и максимально понятно объяснил всё по шагам. Я доволен!", te:"Everything done fast and well. Always reachable, and he explained every step in plain language. I am happy."},
{n:"Игорь", w:"Telegram-бот", we:"Telegram bot", p:"15 000 ₽", d:"1 сентября 2026", de:"1 September 2026", r:5, t:"Юсуф практически сразу приступил к выполнению задачи, всё чётко!", te:"Yusuf got started on the task almost immediately — all crisp and clear."},
{n:"Анастасия", w:"Оформление презентаций", we:"Presentation design", p:"5 000 ₽", d:"31 августа 2026", de:"31 August 2026", r:5, t:"Очень быстро, качественно, максимальная рекомендация.", te:"Very fast, high quality, the strongest possible recommendation."},
{n:"Максим", w:"Оформление презентаций", we:"Presentation design", p:"10 000 ₽", d:"29 августа 2026", de:"29 August 2026", r:5, t:"Хорошая оперативная работа.", te:"Good, prompt work."},
{n:"Дайана Александровна", w:"Корпоративный сайт · WordPress", we:"Corporate site · WordPress", p:"", d:"27 августа 2026", de:"27 August 2026", r:5, t:"Всё хорошо.", te:"All good."},
{n:"Алисия", w:"Telegram-бот", we:"Telegram bot", p:"20 000 ₽", d:"25 августа 2026", de:"25 August 2026", r:5, m:1, t:"Понял меня буквально с полуслова! Очень быстро разобрался, что именно мне нужно, и сделал бота за пару часов, хотя срок был 1–2 дня. Всё работает именно так, как я хотела.", te:"He understood me instantly. He worked out exactly what I needed and built the bot in a couple of hours, though the estimate was 1–2 days. It works exactly the way I wanted."},
{n:"Наталья", w:"Оформление презентаций", we:"Presentation design", p:"", d:"25 августа 2026", de:"25 August 2026", r:5, t:"Быстро и оперативно решает задачи. Всегда на связи. Предлагает разные варианты. Гибкий подход.", te:"Solves tasks fast. Always reachable. Offers options. A flexible approach."},
{n:"Дмитрий", w:"Лендинг · Joomla", we:"Landing page · Joomla", p:"12 000 ₽", d:"25 августа 2026", de:"25 August 2026", r:5, m:1, t:"Быстро откликнулся, оперативно вышел на связь, быстро согласовали объём работ, в течение дня всё было уже готово: загружена информация, исправлены ошибки, ускорена загрузка, установлены сертификаты. Рекомендую.", te:"Replied fast, got in touch straight away, we agreed the scope quickly and within the day everything was ready: content uploaded, errors fixed, loading speeded up, certificates installed. Recommended."},
{n:"Хадиджа", w:"Презентация · видеопрезентация", we:"Presentation · video deck", p:"", d:"25 августа 2026", de:"25 August 2026", r:5, t:"Презентацию подготовил очень быстро, грамотно и красиво! Досрочно! Рекомендую эксперта!", te:"He prepared the deck very fast, competently and beautifully — ahead of schedule. I recommend this expert."},
{n:"Андрей", w:"Дизайн лендинга", we:"Landing page design", p:"", d:"25 августа 2026", de:"25 August 2026", r:5, t:"Юсуф всё сделал на высшем уровне! Заказывал сайт, всё сделал буквально за день. По ходу работы было несколько правок — всё без проблем внёс. В итоге сайт получился именно таким, как я хотел.", te:"Yusuf did everything at the highest level. I ordered a site and it was done in a single day. There were a few revisions along the way — all handled without fuss. It came out exactly as I wanted."},
{n:"Юлия", w:"Интерактивная презентация", we:"Interactive presentation", p:"3 000 ₽", d:"24 августа 2026", de:"24 August 2026", r:5, m:1, t:"Презентация отлично адаптирована для детской аудитории: выдержан баланс между информацией и визуалом, текст лаконичный, без перегруза. Крупные шрифты, спокойные цвета, анимация поддерживает сюжет.", te:"Perfectly adapted for a children's audience: a good balance of information and visuals, concise text, no clutter. Large type, calm colours, animation that supports the story."},
{n:"Лиана", w:"Оформление презентаций", we:"Presentation design", p:"", d:"24 августа 2026", de:"24 August 2026", r:5, t:"Всё было выполнено отлично, сверхбыстро и профессионально.", te:"Everything was done excellently — super fast and professional."},
{n:"Андрей", w:"Telegram-бот", we:"Telegram bot", p:"8 000 ₽", d:"23 августа 2026", de:"23 August 2026", r:5, m:1, t:"Задача: сделать бота в телеграмме для бизнеса по распределению задач с диспетчером. Созвонились, и в онлайн-режиме по телефону сделали всё за пару часов. Огромный респект.", te:"The task: a Telegram bot for a business, distributing jobs through a dispatcher. We got on a call and had it all done live in a couple of hours. Huge respect."},
{n:"Александр", w:"Регистрация домена", we:"Domain registration", p:"", d:"23 августа 2026", de:"23 August 2026", r:5, t:"Всем рекомендую. Если надумаете делать сайт — то к нему. Работать было легко, понятно и приятно.", te:"I recommend him to everyone. If you are thinking about a site, go to him. Easy, clear and pleasant to work with."},
{n:"Татьяна", w:"Презентация на английском", we:"Presentation in English", p:"", d:"22 августа 2026", de:"22 August 2026", r:5, t:"Работа выполнена досрочно и качественно. Изначально было предложено несколько вариантов дизайна, вместе обсудили и выбрали. Все мои пожелания в финальной версии учтены, исходники любезно предоставлены.", te:"Delivered ahead of schedule and to a high standard. Several design options were offered up front, we discussed and chose together. Every request of mine made it into the final version, and the source files were kindly provided."},
{n:"Константин", w:"Создание аватарок", we:"Avatar design", p:"", d:"21 августа 2026", de:"21 August 2026", r:5, t:"Делал всё что мог. Конечный результат не совпал с тем, что хотел, но в наработках есть полезные вещи, так что всё хорошо.", te:"He did everything he could. The end result was not quite what I had in mind, but there are useful things in the work, so all is well."},
{n:"Гаджи", w:"Оформление презентаций", we:"Presentation design", p:"", d:"21 августа 2026", de:"21 August 2026", r:5, t:"Нашёл понимание к сложной задаче, вник в суть и сделал всё как нужно. Индивидуально подходит к решениям, несмотря на трудности!", te:"He got his head round a difficult task, understood the essence and did it exactly as needed. An individual approach, difficulties notwithstanding."},
{n:"Даня", w:"Веб-дизайн", we:"Web design", p:"5 750 ₽", d:"20 августа 2026", de:"20 August 2026", r:5, t:"Спасибо, оперативно помог с дизайном. Был на связи.", te:"Thanks — quick help with the design, and always reachable."},
{n:"Ульяна", w:"Telegram-бот", we:"Telegram bot", p:"", d:"19 августа 2026", de:"19 August 2026", r:5, t:"Отличный специалист, выполнил задачу по Telegram чётко по ТЗ и очень быстро! Мелкие правки вносил моментально, да ещё и добавил от себя классные фишки, которые улучшили результат.", te:"An excellent specialist — delivered the Telegram task exactly to spec and very fast. Small fixes were made instantly, and he added neat touches of his own that improved the result."},
{n:"Дмитрий", w:"Лендинг", we:"Landing page", p:"10 000 ₽", d:"15 августа 2026", de:"15 August 2026", r:5, t:"Сделал крутой сайт за 2 дня! Рекомендую, всем доволен.", te:"Built a great site in two days. Recommended — happy with everything."},
{n:"Арсений", w:"Создание сайта", we:"Website", p:"15 000 ₽", d:"15 августа 2026", de:"15 August 2026", r:5, m:1, t:"Специалист 100% знает толк в своём деле, сделали всё по красоте, полностью доверился ему и не пожалел. Дизайн для меня и невесты подошёл по вкусу на 5+.", te:"He absolutely knows his craft. Everything was done beautifully; I trusted him completely and did not regret it — the design was spot on for me and my fiancée."},
{n:"Григорий", w:"Аватарки · дизайн YouTube-канала", we:"Avatars · YouTube channel design", p:"", d:"15 августа 2026", de:"15 August 2026", r:5, t:"Быстро! Чётко! Качественно! Рекомендую!", te:"Fast. Precise. High quality. Recommended."},
{n:"Вадим", w:"Настройка оборудования", we:"Remote setup", p:"", d:"14 августа 2026", de:"14 August 2026", r:5, t:"Очень доволен услугой дистанционного подключения и настройки роутера! Специалист оказался настоящим профи, всё сделал быстро и чётко, подробно объяснил — теперь я сам знаю, как управлять роутером.", te:"Very happy with the remote router setup. A real pro — fast, clean work, and he explained everything in detail, so now I can manage the router myself."}
];
var revGrid = document.getElementById("revGrid"), revMore = document.getElementById("revMore"), revAll = false, revMain = 0;
function revStars(r){
var out = '<div class="stars" aria-label="' + r + (lang === "en" ? " out of 5" : " из 5") + '">';
for (var i = 1; i <= 5; i++) out += '<span' + (i <= r ? '' : ' class="off"') + '>\u2605</span>';
return out + '<b>' + (lang === "en" ? r + ".0" : r + ",0") + '</b></div>';
}
function revCard(r){
var meta = (r.p ? (lang === "en" ? "order " : "\u0437\u0430\u043a\u0430\u0437 \u043d\u0430 ") + r.p + " \u00b7 " : "") + (lang === "en" ? r.de : r.d);
return '<figure' + (r.p ? '' : ' class="nop"') + '>' + revStars(r.r) +
'<blockquote>\u00ab' + (lang === "en" ? r.te : r.t) + '\u00bb</blockquote>' +
(r.a ? '<p class="reply"><b>' + (lang === "en" ? "Reply" : "\u041e\u0442\u0432\u0435\u0442") + ':</b> ' + (lang === "en" ? r.ae : r.a) + '</p>' : '') +
'<figcaption><b>' + r.n + '</b> \u2014 ' + (lang === "en" ? r.we : r.w) +
'<span class="amt">' + meta + '</span></figcaption></figure>';
}
function drawReviews(){
var paid = REVIEWS.filter(function(r){ return r.p; }), free = REVIEWS.filter(function(r){ return !r.p; });
var cols = getComputedStyle(revGrid).gridTemplateColumns.split(" ").length || 1;
var main = paid.slice(0, paid.length - paid.length % cols || paid.length);
var rest = paid.slice(main.length).concat(free);
revMain = main.length;
var list = revAll ? paid.concat(free) : main;
revGrid.innerHTML = list.map(revCard).join("");
if (revMore) revMore.innerHTML = (revAll || !rest.length) ? "" :
'<button type="button">' + (lang === "en" ? "Show all reviews" : "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0442\u0437\u044b\u0432\u044b") +
'<i>+' + rest.length + '</i>' +
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14M19 12l-7 7-7-7"/></svg>' +
'</button>';
}
var revCols = 0;
addEventListener("resize", function(){
var c = getComputedStyle(revGrid).gridTemplateColumns.split(" ").length;
if(c !== revCols){ revCols = c; if(!revAll) drawReviews(); }
});
if (revMore) revMore.addEventListener("click", function(e){
if(!e.target.closest("button")) return;
revAll = true; drawReviews();
var f = revGrid.querySelectorAll("figure")[revMain];
if(f) f.scrollIntoView({behavior: "smooth", block: "center"});
});
var heavyDone = false;
var pTable = document.getElementById("ptable"), pOpen = -1;
function money(x){ return x; }
function drawPrices(){
pTable.innerHTML = PRICES.map(function(g, gi){
var rows = g.items.map(function(it){
var price = it[2], soft = /догов/.test(price);
if(soft && lang === "en") price = "on request";
else if(lang === "en") price = String(price).replace(/^от /, "from ").replace("₽/ч", "₽/h");
return '<div class="row"><span class="nm">' + (lang === "en" ? it[1] : it[0]) + '</span>' +
'<span class="dots"></span><span class="pr' + (soft ? " soft" : "") + '">' + price + "</span></div>";
}).join("");
var from = g.items.map(function(it){ return parseInt(String(it[2]).replace(/[^0-9]/g, ""), 10) || 0; })
.filter(function(n){ return n > 0; });
var min = from.length ? Math.min.apply(null, from).toLocaleString("ru-RU") + " ₽" : "";
return '<div class="pgroup' + (gi === pOpen ? " open" : "") + '">' +
'<button type="button" class="phead"><span class="pt">' + (lang === "en" ? g.en : g.ru) + "</span>" +
'<span class="pc">' + g.items.length + "</span>" +
'<span class="pf">' + (min ? (lang === "en" ? "from " : "от ") + min : "") + "</span>" +
'<i class="pi"></i></button>' +
'<div class="pbody"><div class="pin">' + rows + "</div></div></div>";
}).join("");
pTable.querySelectorAll(".phead").forEach(function(b, gi){
b.addEventListener("click", function(){
var g = b.parentElement, was = g.classList.contains("open");
pTable.querySelectorAll(".pgroup").forEach(function(x){ x.classList.remove("open"); });
if(!was){ g.classList.add("open"); pOpen = gi; } else { pOpen = -1; }
});
});
}
/* ================= КОНСУЛЬТАНТ =================
s — сильные фразы (вес 3), k — обычные слова (вес 1). Побеждает наибольший счёт. */
(function(){
var bg = document.getElementById("burger"), mn = document.getElementById("menu");
function close(){ mn.classList.remove("on"); bg.setAttribute("aria-expanded", "false"); document.body.style.overflow = ""; }
bg.addEventListener("click", function(){
var on = mn.classList.toggle("on");
bg.setAttribute("aria-expanded", String(on));
document.body.style.overflow = on ? "hidden" : "";
});
mn.querySelectorAll("a").forEach(function(a){ a.addEventListener("click", close); });
addEventListener("keydown", function(e){ if(e.key === "Escape") close(); });
matchMedia("(min-width:861px)").addEventListener("change", close);
})();
var TICK = {
ru: ["Сайты","Telegram-боты","Лендинги","WordPress","Вёрстка из Figma","Адаптив под телефон","Презентации","Базовое SEO","Домен и SSL","Казань · удалённо"],
en: ["Websites","Telegram bots","Landing pages","WordPress","Figma → HTML","Responsive","Presentations","Basic SEO","Domain & SSL","Kazan · Remote"]
};
var ul = document.getElementById("tick");
function drawTick(){ var w = TICK[lang === "en" ? "en" : "ru"]; ul.innerHTML = w.concat(w).map(function(x){ return "<li>" + x + "</li>"; }).join(""); }
drawTick();
var card = document.querySelector(".card"), agree = document.getElementById("agree"),
send = document.getElementById("send"), hint = document.getElementById("hint"),
nameEl = document.getElementById("name"), contactEl = document.getElementById("contact"),
detEl = document.getElementById("details");
function draw(){
send.disabled = !contactEl.value.trim() || !detEl.value.trim() || !agree.checked;
}
[nameEl, contactEl, detEl].forEach(function(el){ el.addEventListener("input", draw); });
agree.addEventListener("change", draw);
function build(){
if(!contactEl.value.trim() || !detEl.value.trim()) return "";
var L = [T("_greet"), ""];
if(nameEl.value.trim()) L.push(T("_name") + ": " + nameEl.value.trim());
L.push(T("_contact") + ": " + contactEl.value.trim());
L.push(T("_task") + ": " + detEl.value.trim());
L.push("", T("_from") + ": " + location.href);
return L.join("\n");
}
function fallback(msg){
if(window.YSD && YSD.lead) try { YSD.lead(); } catch(e){}
var fin = function(ok){ hint.textContent = ok ? T("_copied") : T("_manual"); hint.className = "hint sent";
window.open("https://t.me/" + TG, "_blank", "noopener"); };
if(navigator.clipboard && navigator.clipboard.writeText){
navigator.clipboard.writeText(msg).then(function(){ fin(true); }, function(){ fin(false); });
} else { fin(false); }
}
send.addEventListener("click", function(){
var msg = build(); if(!msg || !agree.checked) return;
send.disabled = true;
hint.textContent = T("_sending"); hint.className = "hint";
var ok = function(){ card.classList.add("ok"); if(window.YSD && YSD.lead) YSD.lead(); };
var no = function(){ send.disabled = false; fallback(msg); };
if(SEND.mode === "script" && SEND.url){
fetch(SEND.url, {method:"POST", headers:{"Content-Type":"application/json"}, body:JSON.stringify({text:msg, name:nameEl.value.trim(), contact:contactEl.value.trim(), details:detEl.value.trim(), page:location.href, consent:agree.checked})})
.then(function(r){ return r.ok ? r.json().catch(function(){ return {ok:true}; }) : Promise.reject(); })
.then(function(j){ if(j && j.ok === false) throw 0; ok(); })
.catch(no);
} else { send.disabled = false; fallback(msg); }
});
if(location.hash === "#legal"){ location.replace("/privacy.html"); }
(function(){
var el = document.querySelector(".field .cursor");
if(!el || !window.matchMedia) return;
if(!matchMedia("(hover:hover) and (pointer:fine)").matches) return;
if(matchMedia("(prefers-reduced-motion:reduce)").matches) return;
var x = 0, y = 0, tx = 0, ty = 0, raf = 0, live = false;
function loop(){
x += (tx - x) * .16; y += (ty - y) * .16;
el.style.transform = "translate3d(" + x.toFixed(1) + "px," + y.toFixed(1) + "px,0)";
raf = (Math.abs(tx - x) > .4 || Math.abs(ty - y) > .4) ? requestAnimationFrame(loop) : 0;
}
addEventListener("pointermove", function(e){
if(e.pointerType === "touch") return;
tx = e.clientX; ty = e.clientY;
if(!live){ live = true; x = tx; y = ty; el.classList.add("on"); }
if(!raf) raf = requestAnimationFrame(loop);
}, {passive:true});
document.addEventListener("mouseleave", function(){ el.classList.remove("on"); live = false; });
document.addEventListener("mouseenter", function(){ if(live) el.classList.add("on"); });
})();
var io = new IntersectionObserver(function(es){
es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add("in"); io.unobserve(e.target); } });
}, { threshold:.12 });
document.querySelectorAll(".r").forEach(function(el, i){
el.style.transitionDelay = (Math.min(i,4) * 60) + "ms";
io.observe(el);
});
var hdr = document.getElementById("hdr"), mbar = document.getElementById("mbar");
addEventListener("scroll", function(){
hdr.classList.toggle("stuck", scrollY > 8);
var brief = document.getElementById("brief").getBoundingClientRect();
mbar.classList.toggle("on", scrollY > 520 && brief.top > innerHeight * .75);
}, { passive:true });
(function(){
if(!METRIKA) return;
/* очередь целей доступна сразу, сам счётчик грузим после первого действия
пользователя или в простое — чтобы не занимать поток при загрузке */
window.ym = window.ym || function(){ (window.ym.a = window.ym.a || []).push(arguments); };
window.ym.l = 1 * new Date();
var started = false;
function startMetrika(){
if (started || (window.YSD_CC && !YSD_CC.ok())) return; started = true;
EV.forEach(function(t){ removeEventListener(t, startMetrika, OPT); });
var k = document.createElement("script"), a = document.getElementsByTagName("script")[0];
k.async = 1; k.src = "https://mc.yandex.ru/metrika/tag.js";
a.parentNode.insertBefore(k, a);
ym(METRIKA, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true});
}
var EV = ["pointerdown","keydown","scroll","touchstart"], OPT = {passive:true, once:false};
EV.forEach(function(t){ addEventListener(t, startMetrika, OPT); });
addEventListener("ysd-consent", startMetrika);
if ("requestIdleCallback" in window) requestIdleCallback(startMetrika, {timeout: 3500});
else setTimeout(startMetrika, 3500);
})();
window.YSD.lead = function(){
if(window.ym && METRIKA) try { ym(METRIKA, "reachGoal", "zayavka"); } catch(e){}
};
(function(){
var box = document.getElementById("orbit"), ring = document.getElementById("ring");
if (!box || !ring) return;
var red = matchMedia("(prefers-reduced-motion:reduce)").matches;
var pick = [], seen = {};
MIX.forEach(function(i){ var c = WORKS[i].c; seen[c] = (seen[c] || 0) + 1; if (seen[c] <= 3 && pick.length < 12) pick.push(i); });
var N = pick.length, cards = [], ang = 0, vel = red ? 0 : .09, target = vel, drag = null, live = true, R = 0, mx = 0;
ring.innerHTML = pick.map(function(i, k){
var nm = lang === "en" ? WORKS[i].te : WORKS[i].t;
return '<figure data-i="' + i + '" tabindex="0" role="button" aria-label="' + nm + '"><img alt="' + nm + '" width="800" height="450" decoding="async" data-src="' + pic(i, 800) + '"></figure>';
}).join("");
cards = [].slice.call(ring.children);
function layout(){
var cw = cards[0].getBoundingClientRect().width || 300;
R = Math.round(cw * N / (2 * Math.PI) * 1.12);
cards.forEach(function(f, k){ f.style.transform = "rotateY(" + (k * 360 / N) + "deg) translateZ(" + R + "px)"; });
}
function load(){
cards.forEach(function(f){ var im = f.querySelector("img"); if (im.dataset.src){ im.onload = function(){ im.classList.add("ok"); }; im.src = im.dataset.src; im.removeAttribute("data-src"); } });
}
function paint(){
ring.style.transform = "translateZ(" + (-R) + "px) rotateX(-4deg) rotateY(" + (-ang + mx) + "deg)";
cards.forEach(function(f, k){
var a = ((k * 360 / N - ang + mx) % 360 + 540) % 360 - 180, c = Math.cos(a * Math.PI / 180);
f.style.filter = "brightness(" + (0.35 + 0.65 * Math.max(0, c)).toFixed(3) + ")";
f.style.zIndex = Math.round(c * 100) + 100;
});
}
function tick(){
if (!live) return;
if (!drag){ vel += (target - vel) * .04; ang += vel; }
paint(); requestAnimationFrame(tick);
}
box.addEventListener("pointerdown", function(e){ drag = {x: e.clientX, a: ang, t: performance.now(), moved: 0}; box.classList.add("drag"); });
addEventListener("pointermove", function(e){
if (drag){ var dx = e.clientX - drag.x; drag.moved = Math.max(drag.moved, Math.abs(dx)); var na = drag.a - dx * .25; vel = na - ang; ang = na; if (red) paint(); }
else if (matchMedia("(hover:hover)").matches){ var r = box.getBoundingClientRect(); if (e.clientY > r.top - 200 && e.clientY < r.bottom + 200) mx = ((e.clientX / innerWidth) - .5) * 14; }
}, {passive: true});
addEventListener("pointerup", function(e){
if (!drag) return; var d = drag; drag = null; box.classList.remove("drag");
if (d.moved < 6){ var f = e.target.closest && e.target.closest(".orbit figure"); if (f) openLb(+f.dataset.i); }
vel = Math.max(-3, Math.min(3, vel));
});
box.addEventListener("keydown", function(e){
var f = e.target.closest(".orbit figure"); if (f && (e.key === "Enter" || e.key === " ")){ e.preventDefault(); openLb(+f.dataset.i); }
});
box.addEventListener("mouseenter", function(){ target = red ? 0 : .025; });
box.addEventListener("mouseleave", function(){ target = red ? 0 : .09; });
addEventListener("resize", function(){ clearTimeout(layout.t); layout.t = setTimeout(function(){ layout(); paint(); }, 150); });
layout(); paint();
if ("requestIdleCallback" in window) requestIdleCallback(load, {timeout: 1200}); else setTimeout(load, 400);
if (red) return;
if ("IntersectionObserver" in window) new IntersectionObserver(function(es){
var vis = es[0].isIntersecting; if (vis && !live){ live = true; requestAnimationFrame(tick); } else if (!vis) live = false;
}).observe(box);
document.addEventListener("visibilitychange", function(){ if (document.hidden) live = false; else if (!live){ live = true; requestAnimationFrame(tick); } });
requestAnimationFrame(tick);
})();
(function(){
var field = document.querySelector(".field"); if (!field) return;
var c = document.createElement("canvas"); c.className = "sky";
var x = c.getContext && c.getContext("2d"); if (!x) return;
field.insertBefore(c, field.firstChild);
var red = matchMedia("(prefers-reduced-motion:reduce)").matches;
var W, H, D = Math.min(window.devicePixelRatio || 1, 1.5), S = [], M = [], run = true, last = 0, next = 1800, my = scrollY, fc = 0;
function size(){
W = innerWidth; H = innerHeight; c.width = W * D; c.height = H * D; x.setTransform(D, 0, 0, D, 0, 0);
var n = Math.min(240, Math.round(W * H / 7500)); S = [];
for (var i = 0; i < n; i++) S.push({x: Math.random() * W, y: Math.random() * H, r: Math.random() * 1.05 + .25,
a: Math.random() * .6 + .25, t: Math.random() * 6.28, s: Math.random() * .02 + .004, p: Math.random() * .7 + .15});
if (red) paint(0);
}
function shoot(){
var left = Math.random() < .5, sx = left ? Math.random() * W * .55 : W * .45 + Math.random() * W * .55,
sy = Math.random() * H * .32, ang = (left ? .42 : Math.PI - .42) + (Math.random() - .5) * .3, v = W > 720 ? 14 : 9;
M.push({x: sx, y: sy, vx: Math.cos(ang) * v, vy: Math.sin(ang) * v, l: 0, L: 55 + Math.random() * 30});
}
function paint(t){
x.clearRect(0, 0, W, H); x.fillStyle = "#fff";
for (var i = 0; i < S.length; i++){
var s = S[i]; if (!red) s.t += s.s;
var yy = ((s.y - my * s.p * .12) % H + H) % H;
x.globalAlpha = s.a * (.55 + .45 * Math.sin(s.t)); x.beginPath(); x.arc(s.x, yy, s.r, 0, 6.283); x.fill();
}
x.globalAlpha = 1;
if (red) return;
if (t - last > next){ last = t; next = 3200 + Math.random() * 4800; shoot(); }
for (var j = M.length - 1; j >= 0; j--){
var m = M[j]; m.x += m.vx; m.y += m.vy; m.l++;
var k = 1 - m.l / m.L; if (k <= 0){ M.splice(j, 1); continue; }
var tx = m.x - m.vx * 10, ty = m.y - m.vy * 10, g = x.createLinearGradient(m.x, m.y, tx, ty);
g.addColorStop(0, "rgba(255,255,255," + (.9 * k) + ")"); g.addColorStop(1, "rgba(255,255,255,0)");
x.strokeStyle = g; x.lineWidth = 1.5; x.lineCap = "round"; x.beginPath(); x.moveTo(m.x, m.y); x.lineTo(tx, ty); x.stroke();
x.fillStyle = "rgba(255,255,255," + k + ")"; x.beginPath(); x.arc(m.x, m.y, 1.5, 0, 6.283); x.fill();
}
}
function frame(t){
if (!run) return;
fc++; if (W > 720 || fc % 2 === 0) paint(t); /* на телефоне 30 кадров — бережём батарею */
requestAnimationFrame(frame);
}
size();
addEventListener("resize", function(){ clearTimeout(size.t); size.t = setTimeout(size, 200); });
addEventListener("scroll", function(){ my = scrollY; if (red) paint(0); }, {passive: true});
if (red) return;
document.addEventListener("visibilitychange", function(){
if (document.hidden) run = false; else if (!run){ run = true; requestAnimationFrame(frame); }
});
requestAnimationFrame(frame);
})();
document.querySelectorAll(".pack").forEach(function(el){
el.addEventListener("pointermove", function(e){
var r = el.getBoundingClientRect();
el.style.setProperty("--mx", (e.clientX - r.left) + "px"); el.style.setProperty("--my", (e.clientY - r.top) + "px");
});
});
/* Первый экран рисуем сразу, тяжёлые блоки ниже сгиба — когда main thread свободен
или когда до них доскроллили. Это снимает блокировку при загрузке. */
draw();
function drawHeavy(){
if (heavyDone) return; heavyDone = true;
drawFilters(); drawWorks(); drawPrices(); drawReviews();
}
var worksSec = document.getElementById("works");
if ("IntersectionObserver" in window && worksSec) {
var hio = new IntersectionObserver(function(es){
if (es.some(function(e){ return e.isIntersecting; })) { hio.disconnect(); drawHeavy(); }
}, {rootMargin: "800px 0px"});
hio.observe(worksSec);
}
if ("requestIdleCallback" in window) requestIdleCallback(drawHeavy, {timeout: 2500});
else setTimeout(drawHeavy, 300);
})();</script>
<script>(function(){var b=document.getElementById("aiOpen");if(!b)return;var l=0;function go(){if(l)return;l=1;var s=document.createElement("script");s.src="/widget.js";document.head.appendChild(s);}b.addEventListener("pointerenter",go,{once:true});b.addEventListener("click",function(){document.body.classList.add("ai-on");go();});var c=document.getElementById("aiClose");if(c)c.addEventListener("click",function(){document.body.classList.remove("ai-on");});})();</script><script>(function(){var el=document.getElementById("cc");if(!el)return;var K="ysd_cc",v=null;try{v=localStorage.getItem(K)}catch(e){}var tz="";try{tz=Intl.DateTimeFormat().resolvedOptions().timeZone||""}catch(e){}var ru=/^Europe\/(Moscow|Kaliningrad|Samara|Volgograd|Saratov|Astrakhan|Ulyanovsk|Kirov|Minsk|Kiev|Kyiv|Simferopol)$/.test(tz);var strict=/^Europe\//.test(tz)&&!ru;function fire(){try{dispatchEvent(new Event("ysd-consent"))}catch(e){var ev=document.createEvent("Event");ev.initEvent("ysd-consent",false,false);dispatchEvent(ev)}}function show(){el.hidden=false;setTimeout(function(){el.classList.add("on");document.body.classList.add("cc-on")},30);}function hide(){el.classList.remove("on");document.body.classList.remove("cc-on");setTimeout(function(){el.hidden=true},450);}function pick(val){v=val;try{localStorage.setItem(K,val)}catch(e){}hide();if(val==="all")fire();}document.getElementById("ccYes").addEventListener("click",function(){pick("all")});document.getElementById("ccNo").addEventListener("click",function(){pick("min")});var o=document.getElementById("ccOpen");if(o)o.addEventListener("click",function(e){e.preventDefault();show()});window.YSD_CC={ok:function(){return v==="all"},strict:strict,choice:function(){return v},open:show};if(v){el.hidden=true;return;}setTimeout(show,900);})();</script>
</body>
</html>