1- <!DOCTYPE html>
2- < html lang ="ru ">
3- < head >
4- < meta charset ="UTF-8 ">
5- < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
6- < title > {{.Title}}</ title >
7- < style >
8- : root {
9- /* Палитра (Dark Zinc/Slate style) */
10- --bg-color : # 09090b ;
11- --card-bg : # 18181b ;
12- --border-color : # 27272a ;
13- --text-main : # e4e4e7 ;
14- --text-muted : # a1a1aa ;
15- --accent-blue : # 3b82f6 ;
16- --accent-red : # ef4444 ;
17- --accent-glow : rgba (59 , 130 , 246 , 0.15 );
18- --font-stack : system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI' , Roboto, sans-serif;
19- --font-mono : 'SF Mono' , 'Menlo' , 'Monaco' , 'Courier New' , monospace;
20- }
21-
22- * {
23- box-sizing : border-box;
24- margin : 0 ;
25- padding : 0 ;
26- }
27-
28- body {
29- background-color : var (--bg-color );
30- color : var (--text-main );
31- font-family : var (--font-stack );
32- height : 100vh ;
33- display : flex;
34- align-items : center;
35- justify-content : center;
36- overflow : hidden;
37- /* Тонкая сетка на фоне для технического вида */
38- background-image :
39- linear-gradient (rgba (255 , 255 , 255 , 0.03 ) 1px , transparent 1px ),
40- linear-gradient (90deg , rgba (255 , 255 , 255 , 0.03 ) 1px , transparent 1px );
41- background-size : 30px 30px ;
42- }
43-
44- .container {
45- width : 100% ;
46- max-width : 480px ;
47- padding : 20px ;
48- }
49-
50- .card {
51- background : var (--card-bg );
52- border : 1px solid var (--border-color );
53- border-radius : 12px ;
54- padding : 40px 32px ;
55- text-align : center;
56- box-shadow : 0 4px 24px -1px rgba (0 , 0 , 0 , 0.3 );
57- position : relative;
58- overflow : hidden;
59- }
60-
61- /* Декоративная полоса сверху */
62- .card ::before {
63- content : '' ;
64- position : absolute;
65- top : 0 ;
66- left : 0 ;
67- width : 100% ;
68- height : 2px ;
69- background : linear-gradient (90deg , transparent, var (--accent-blue ), transparent);
70- opacity : 0.8 ;
71- transition : background 0.3s ease;
72- }
73-
74- /* Состояние ошибки меняет цвет полосы */
75- .card .error-state ::before {
76- background : linear-gradient (90deg , transparent, var (--accent-red ), transparent);
77- }
78-
79- /* --- Анимация Радара (Loader) --- */
80- .loader-container {
81- position : relative;
82- width : 64px ;
83- height : 64px ;
84- margin : 0 auto 24px auto;
85- display : flex;
86- align-items : center;
87- justify-content : center;
88- }
89-
90- .radar-spinner {
91- width : 100% ;
92- height : 100% ;
93- border-radius : 50% ;
94- border : 2px solid var (--border-color );
95- border-top-color : var (--accent-blue );
96- animation : spin 1.2s cubic-bezier (0.55 , 0.055 , 0.675 , 0.19 ) infinite;
97- }
98-
99- .radar-pulse {
100- position : absolute;
101- width : 100% ;
102- height : 100% ;
103- border-radius : 50% ;
104- background : var (--accent-blue );
105- opacity : 0.2 ;
106- animation : pulse 2s ease-out infinite;
107- }
108-
109- /* --- Иконка ошибки (Скрыта по умолчанию) --- */
110- .error-icon {
111- display : none;
112- width : 64px ;
113- height : 64px ;
114- margin : 0 auto 24px auto;
115- color : var (--accent-red );
116- }
117-
118- .error-icon svg {
119- width : 100% ;
120- height : 100% ;
121- }
122-
123- /* --- Progress Bar --- */
124- .progress-container {
125- width : 100% ;
126- background-color : var (--border-color );
127- border-radius : 4px ;
128- margin : 20px 0 ;
129- height : 8px ;
130- overflow : hidden;
131- }
132-
133- .progress-bar {
134- height : 100% ;
135- background : linear-gradient (90deg , var (--accent-blue ), # 60a5fa );
136- border-radius : 4px ;
137- width : 0% ;
138- transition : width 0.3s ease;
139- }
140-
141- /* --- CAPTCHA Styles --- */
142- .captcha-container {
143- position : relative;
144- display : inline-block;
145- margin : 20px 0 ;
146- border : 1px solid var (--border-color );
147- border-radius : 8px ;
148- overflow : hidden;
149- }
150-
151- .captcha-image {
152- display : block;
153- max-width : 100% ;
154- }
155-
156- .captcha-input {
157- background : var (--card-bg );
158- border : 1px solid var (--border-color );
159- color : var (--text-main );
160- padding : 12px 16px ;
161- border-radius : 6px ;
162- font-size : 14px ;
163- margin : 16px 0 ;
164- width : 200px ;
165- text-align : center;
166- font-family : var (--font-mono );
167- letter-spacing : 2px ;
168- }
169-
170- .captcha-input : focus {
171- outline : none;
172- border-color : var (--accent-blue );
173- box-shadow : 0 0 0 2px var (--accent-glow );
174- }
175-
176- @keyframes spin {
177- 0% { transform : rotate (0deg ); }
178- 100% { transform : rotate (360deg ); }
179- }
180-
181- @keyframes pulse {
182- 0% { transform : scale (0.8 ); opacity : 0.5 ; }
183- 100% { transform : scale (1.5 ); opacity : 0 ; }
184- }
185-
186- h1 {
187- font-size : 20px ;
188- font-weight : 600 ;
189- margin-bottom : 12px ;
190- letter-spacing : -0.02em ;
191- }
192-
193- p {
194- font-size : 14px ;
195- line-height : 1.6 ;
196- color : var (--text-muted );
197- margin-bottom : 24px ;
198- }
199-
200- /* --- Техническая информация (Footer) --- */
201- .tech-info {
202- margin-top : 32px ;
203- padding-top : 20px ;
204- border-top : 1px solid var (--border-color );
205- font-family : var (--font-mono );
206- font-size : 11px ;
207- color : # 52525b ; /* Еще более приглушенный цвет */
208- display : flex;
209- flex-direction : column;
210- gap : 6px ;
211- }
212-
213- .info-row {
214- display : flex;
215- justify-content : space-between;
216- }
217-
218- .info-label {
219- opacity : 0.7 ;
220- }
221-
222- .info-value {
223- color : var (--text-muted );
224- }
225-
226- /* --- Кнопка (для капчи или ретрая) --- */
227- .action-btn {
228- background : transparent;
229- border : 1px solid var (--border-color );
230- color : var (--text-main );
231- padding : 10px 20px ;
232- border-radius : 6px ;
233- font-size : 13px ;
234- cursor : pointer;
235- transition : all 0.2s ;
236- margin : 8px ;
237- }
238-
239- .action-btn : hover {
240- border-color : var (--text-muted );
241- background : rgba (255 , 255 , 255 , 0.03 );
242- }
243-
244- .action-btn .primary {
245- background : var (--accent-blue );
246- border-color : var (--accent-blue );
247- color : white;
248- }
249-
250- .action-btn .primary : hover {
251- background : # 2563eb ;
252- border-color : # 2563eb ;
253- }
254-
255- /* --- Form Styles --- */
256- form {
257- margin : 0 ;
258- }
259-
260- /* --- Status Messages --- */
261- .status-message {
262- font-size : 12px ;
263- color : var (--text-muted );
264- margin : 8px 0 ;
265- font-family : var (--font-mono );
266- }
267-
268- /* --- Responsive --- */
269- @media (max-width : 480px ) {
270- .container {
271- padding : 16px ;
272- }
273-
274- .card {
275- padding : 24px 20px ;
276- }
277-
278- .captcha-input {
279- width : 100% ;
280- max-width : 200px ;
281- }
282- }
283- </ style >
284- </ head >
285- < body >
286- < div class ="container ">
287- < div class ="card{{if .IsError}} error-state{{end}} " id ="statusCard ">
288- {{if .IsError}}
289- <!-- Режим ошибки -->
290- < div class ="error-icon ">
291- < svg xmlns ="http://www.w3.org/2000/svg " fill ="none " viewBox ="0 0 24 24 " stroke-width ="1.5 " stroke ="currentColor ">
292- < path stroke-linecap ="round " stroke-linejoin ="round " d ="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z " />
293- </ svg >
294- </ div >
295- {{else if .ShowLoader}}
296- <!-- Режим проверки/загрузки -->
297- < div class ="loader-container ">
298- < div class ="radar-pulse "> </ div >
299- < div class ="radar-spinner "> </ div >
300- </ div >
301- {{end}}
302-
303- < h1 > {{.Title}}</ h1 >
304- < p > {{.Message}}</ p >
305-
306- {{if .ShowProgress}}
307- < div class ="progress-container ">
308- < div class ="progress-bar " id ="progressBar "> </ div >
309- </ div >
310- < div class ="status-message " id ="statusMessage "> {{.StatusMessage}}</ div >
311- {{end}}
312-
313- {{if .CaptchaData}}
314- <!-- CAPTCHA Challenge -->
315- < div class ="captcha-container ">
316- < img src ="data:image/png;base64,{{.CaptchaData.ImageData}} " alt ="CAPTCHA " class ="captcha-image ">
317- </ div >
318-
319- < form method ="POST " action ="{{.ActionURL}} ">
320- < input type ="hidden " name ="captcha_id " value ="{{.CaptchaData.ID}} ">
321- < input type ="text " name ="captcha_answer " placeholder ="Введите текст с картинки "
322- autocomplete ="off " required class ="captcha-input " maxlength ="6 ">
323- < br >
324- < button type ="submit " class ="action-btn primary "> Проверить</ button >
325- </ form >
326-
327- < p style ="font-size: 12px; margin-top: 16px; ">
328- < a href ="javascript:location.reload() " style ="color: var(--text-muted); text-decoration: none; ">
329- Не видите изображение? Обновить страницу
330- </ a >
331- </ p >
332- {{end}}
333-
334- {{if .ShowRetryButton}}
335- < button id ="retryBtn " class ="action-btn " onclick ="window.location.reload() ">
336- Повторить попытку
337- </ button >
338- {{end}}
339-
340- < div class ="tech-info ">
341- < div class ="info-row ">
342- < span class ="info-label "> Ray ID:</ span >
343- < span class ="info-value "> {{.RayID}}</ span >
344- </ div >
345- < div class ="info-row ">
346- < span class ="info-label "> Your IP:</ span >
347- < span class ="info-value "> {{.ClientIP}}</ span >
348- </ div >
349- < div class ="info-row ">
350- < span class ="info-label "> System:</ span >
351- < span class ="info-value "> Defenra Shield</ span >
352- </ div >
353- {{if .AgentID}}
354- < div class ="info-row ">
355- < span class ="info-label "> Agent:</ span >
356- < span class ="info-value "> {{.AgentID}}</ span >
357- </ div >
358- {{end}}
359- </ div >
360- </ div >
361- </ div >
362-
363- {{if .JSCode}}
364- < script >
365- { { . JSCode } }
366- </ script >
367- {{end}}
368- </ body >
369- </ html >
1+ <!DOCTYPE html><html lang="ru"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>{{.Title}}</title><style>:root{--bg-color:#050505;--card-bg:#0a0a0a;--border-color:#27272a;--border-active:#3f3f46;--text-main:#ededed;--text-muted:#a1a1aa;--text-dark:#52525b;--accent-primary:#3b82f6;--accent-glow:rgba(59,130,246,0.3);--accent-red:#ef4444;--font-main:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI",Roboto,sans-serif;--font-mono:"JetBrains Mono","SF Mono","Menlo",monospace}*{box-sizing:border-box;margin:0;padding:0;-webkit-font-smoothing:antialiased}body{background-color:var(--bg-color);color:var(--text-main);font-family:var(--font-main);height:100vh;display:flex;align-items:center;justify-content:center;overflow:hidden;background-image:radial-gradient(circle at 50% 0%,#171717 0%,transparent 70%)}.container{width:100%;max-width:440px;padding:20px;position:relative;z-index:10}.card{background:var(--card-bg);border:1px solid var(--border-color);border-radius:16px;padding:48px 32px 32px 32px;text-align:center;box-shadow:0 0 0 1px rgba(0,0,0,0.2),0 20px 40px -12px rgba(0,0,0,0.8);position:relative;overflow:hidden;transition:border-color .3s ease}.card::after{content:'';position:absolute;top:-50px;left:50%;transform:translateX(-50%);width:200px;height:100px;background:var(--accent-primary);filter:blur(80px);opacity:.15;pointer-events:none;transition:background .5s ease}.card.error-state{border-color:rgba(239,68,68,.3)}.card.error-state::after{background:var(--accent-red)}.loader-container{position:relative;width:60px;height:60px;margin:0 auto 32px auto;display:flex;align-items:center;justify-content:center}.radar-spinner{position:absolute;width:100%;height:100%;border-radius:50%;border:2px solid transparent;border-top-color:var(--accent-primary);border-left-color:var(--accent-primary);box-shadow:0 0 15px var(--accent-glow);animation:spin 1.2s cubic-bezier(.5,.1,.4,.9) infinite}.radar-spinner::after{content:'';position:absolute;top:6px;left:6px;right:6px;bottom:6px;border-radius:50%;border:1px solid rgba(255,255,255,.05)}.radar-pulse{position:absolute;width:60%;height:60%;border-radius:50%;background:var(--accent-primary);filter:blur(8px);opacity:.4;animation:breathe 3s ease-in-out infinite}.error-icon{width:56px;height:56px;margin:0 auto 32px auto;color:var(--accent-red);background:rgba(239,68,68,.1);border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 0 20px rgba(239,68,68,.15)}.error-icon svg{width:28px;height:28px}h1{font-size:22px;font-weight:600;margin-bottom:12px;letter-spacing:-.03em;color:var(--text-main)}p{font-size:14px;line-height:1.6;color:var(--text-muted);margin-bottom:32px}.progress-container{width:100%;background-color:#27272a;border-radius:100px;margin:24px 0 12px 0;height:4px;overflow:hidden}.progress-bar{height:100%;background:var(--accent-primary);border-radius:100px;width:0%;transition:width .3s ease;box-shadow:0 0 10px rgba(59,130,246,.5)}.captcha-container{position:relative;margin:24px 0;border:1px solid var(--border-color);border-radius:8px;overflow:hidden;background:#000}.captcha-image{display:block;max-width:100%;height:auto;mix-blend-mode:screen}.form-row{display:flex;gap:12px;margin-top:16px}.captcha-input{flex:1;background:var(--bg-color);border:1px solid var(--border-color);color:var(--text-main);padding:12px;border-radius:8px;font-size:14px;text-align:center;font-family:var(--font-mono);letter-spacing:1px;transition:all .2s}.captcha-input:focus{outline:0;border-color:var(--accent-primary);background:#0f0f0f;box-shadow:0 0 0 2px rgba(59,130,246,.1)}.action-btn{background:var(--text-main);color:#000;border:0;padding:0 20px;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s}.action-btn:hover{opacity:.9;transform:translateY(-1px)}.action-btn:active{transform:translateY(0)}.action-btn.secondary{background:0 0;color:var(--text-muted);border:1px solid var(--border-color);width:100%;padding:12px;margin-top:10px}.action-btn.secondary:hover{color:var(--text-main);border-color:var(--text-muted);transform:none}.tech-info{margin-top:40px;padding-top:24px;border-top:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;display:grid;grid-template-columns:1fr 1fr;gap:12px;opacity:.6;transition:opacity .2s}.tech-info:hover{opacity:1}.info-col{display:flex;flex-direction:column;gap:4px;text-align:left}.info-col:nth-child(even){text-align:right}.info-label{color:var(--text-dark);font-size:10px;text-transform:uppercase;letter-spacing:.05em}.info-value{color:var(--text-muted)}@keyframes spin{to{transform:rotate(360deg)}}@keyframes breathe{0%,100%{opacity:.3;transform:scale(.8)}50%{opacity:.6;transform:scale(1.1)}}.status-message{font-family:var(--font-mono);font-size:11px;color:var(--text-dark);margin-top:8px;text-align:right}</style></head><body><div class="container"><div class="card{{if .IsError}} error-state{{end}}" id="statusCard">{{if .IsError}}<div class="error-icon"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z"/></svg></div>{{else if .ShowLoader}}<div class="loader-container"><div class="radar-pulse"></div><div class="radar-spinner"></div></div>{{end}}<h1>{{.Title}}</h1><p>{{.Message}}</p>{{if .ShowProgress}}<div class="progress-container"><div class="progress-bar" id="progressBar"></div></div>{{if .StatusMessage}}<div class="status-message" id="statusMessage">{{.StatusMessage}}</div>{{end}}{{end}}{{if .CaptchaData}}<form method="POST" action="{{.ActionURL}}"><div class="captcha-container"><img src="data:image/png;base64,{{.CaptchaData.ImageData}}" alt="Verification" class="captcha-image"></div><input type="hidden" name="captcha_id" value="{{.CaptchaData.ID}}"><div class="form-row"><input type="text" name="captcha_answer" placeholder="XXXXXX" autocomplete="off" required class="captcha-input" maxlength="6"><button type="submit" class="action-btn">Verify</button></div></form>{{end}}{{if .ShowRetryButton}}<button id="retryBtn" class="action-btn secondary" onclick="window.location.reload()">Try Again</button>{{end}}<div class="tech-info"><div class="info-col"><span class="info-label">Ray ID</span><span class="info-value">{{.RayID}}</span></div><div class="info-col"><span class="info-label">Your IP</span><span class="info-value">{{.ClientIP}}</span></div>{{if .AgentID}}<div class="info-col"><span class="info-label">Node</span><span class="info-value">{{.AgentID}}</span></div><div class="info-col"><span class="info-label">System</span><span class="info-value">Defenra</span></div>{{end}}</div></div></div><script>(function(){document.addEventListener('click',function(e){const t=e.target.closest('button, input[type="submit"]');if(t&&!e.isTrusted){e.preventDefault();e.stopPropagation();e.stopImmediatePropagation();return!1}},!0);document.addEventListener('submit',function(e){if(!e.isTrusted){e.preventDefault();e.stopPropagation();return!1}},!0)})();{{.JSCode}}</script></body></html>
0 commit comments