Ошибка рендеринга шаблонизатора

Обнаружена проблема при обработке шаблона.

Сообщение об ошибке

An exception has been thrown during the compilation of a template ("Function csrf_meta not found") in "sign-up.html".
Файл:
/home/arcana_web/web/arcana-mace.pro/public_html/vendor/twig/twig/src/Environment.php
Строка:
557
Тип:
Twig\Error\SyntaxError
Шаблон:
sign-up.html
  1. return $this->compile($this->parse($this->tokenize($source)));
  2. } catch (Error $e) {
  3. $e->setSourceContext($source);
  4. throw $e;
  5. } catch (\Exception $e) {
  6. throw new SyntaxError(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e);
  7. }
  8. }
  9. public function setLoader(LoaderInterface $loader)
  10. {
  1. <!DOCTYPE html>
  2. <html lang="en" dir="ltr" data-nav-layout="vertical" data-theme-mode="light" data-header-styles="light"
  3. data-menu-styles="light" data-toggled="close">
  4. <head>
  5. {%set referral_name = get_0%}
  6. <meta charset="UTF-8">
  7. <meta name='viewport' content='width=device-width, initial-scale=1.0'>
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <title> {{ phrase(200) }} </title>
  10. <meta name="Description" content="User Registration">
  11. <meta name="Author" content="Logan22 SphereWeb">
  12. {{ csrf_meta() }}
  13. {{ config().logo().favicon() }}
  14. <script src="{{template}}/assets/js/authentication-main.js"></script>
  15. <link id="style" href="{{template}}/assets/libs/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  16. <link href="{{template}}/assets/css/{{ config().palette().styleFile() }}?v=0.0.0.3" rel="stylesheet">
  17. <link href="{{template}}/assets/css/icons.min.css" rel="stylesheet">
  18. <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  19. <!-- CSS для магического кристалла -->
  20. <style>
  21. /* Основные стили для контейнера */
  22. .magical-showcase-wrapper {
  23. position: relative;
  24. width: 340px;
  25. height: 380px;
  26. margin: 0 auto;
  27. perspective: 1000px;
  28. }
  29. /* Стили для основания кристалла */
  30. .crystal-container {
  31. position: relative;
  32. width: 260px;
  33. /* Увеличено с 200px */
  34. height: 360px;
  35. /* Увеличено с 300px */
  36. margin: 0 auto;
  37. transform-style: preserve-3d;
  38. }
  39. .crystal-base {
  40. position: absolute;
  41. bottom: 20px;
  42. left: 50%;
  43. transform: translateX(-50%);
  44. width: 160px;
  45. /* Увеличено с 120px */
  46. height: 40px;
  47. /* Увеличено с 30px */
  48. background: linear-gradient(45deg, #291b5a, #432e7e, #574194);
  49. border-radius: 50%;
  50. box-shadow: 0 0 20px rgba(74, 47, 189, 0.6);
  51. z-index: 1;
  52. }
  53. .crystal-glow {
  54. position: absolute;
  55. top: -15px;
  56. left: -15px;
  57. right: -15px;
  58. bottom: -10px;
  59. background: radial-gradient(ellipse at center, rgba(104, 79, 243, 0.6) 0%, rgba(104, 79, 243, 0) 70%);
  60. filter: blur(15px);
  61. /* Увеличено с 10px */
  62. opacity: 0.8;
  63. border-radius: 50%;
  64. z-index: 0;
  65. animation: baseGlow 3s ease-in-out infinite alternate;
  66. }
  67. @keyframes baseGlow {
  68. 0% {
  69. opacity: 0.5;
  70. transform: scale(0.9);
  71. }
  72. 100% {
  73. opacity: 0.8;
  74. transform: scale(1.1);
  75. }
  76. }
  77. /* Стили для кристалла */
  78. .crystal {
  79. position: absolute;
  80. top: 40px;
  81. left: 50%;
  82. transform: translateX(-50%) rotateY(0deg);
  83. width: 140px;
  84. /* Увеличено с 100px */
  85. height: 220px;
  86. /* Увеличено с 160px */
  87. transform-style: preserve-3d;
  88. animation: crystalRotate 20s linear infinite;
  89. z-index: 2;
  90. }
  91. @keyframes crystalRotate {
  92. 0% {
  93. transform: translateX(-50%) rotateY(0deg) rotateX(5deg);
  94. }
  95. 100% {
  96. transform: translateX(-50%) rotateY(360deg) rotateX(5deg);
  97. }
  98. }
  99. .crystal-face {
  100. position: absolute;
  101. width: 100%;
  102. height: 100%;
  103. background: linear-gradient(135deg, rgba(144, 120, 255, 0.2) 0%, rgba(104, 79, 243, 0.4) 50%, rgba(65, 40, 204, 0.6) 100%);
  104. backdrop-filter: blur(2px);
  105. -webkit-backdrop-filter: blur(2px);
  106. border: 1px solid rgba(255, 255, 255, 0.2);
  107. transform-origin: center;
  108. box-shadow: 0 0 15px rgba(104, 79, 243, 0.3);
  109. /* Увеличено с 10px */
  110. }
  111. .crystal-face-1 {
  112. transform: rotateY(0deg) translateZ(70px);
  113. /* Увеличено с 50px */
  114. clip-path: polygon(50% 0%, 100% 30%, 100% 70%, 50% 100%, 0% 70%, 0% 30%);
  115. }
  116. .crystal-face-2 {
  117. transform: rotateY(72deg) translateZ(70px);
  118. /* Увеличено с 50px */
  119. clip-path: polygon(50% 0%, 100% 30%, 100% 70%, 50% 100%, 0% 70%, 0% 30%);
  120. }
  121. .crystal-face-3 {
  122. transform: rotateY(144deg) translateZ(70px);
  123. /* Увеличено с 50px */
  124. clip-path: polygon(50% 0%, 100% 30%, 100% 70%, 50% 100%, 0% 70%, 0% 30%);
  125. }
  126. .crystal-face-4 {
  127. transform: rotateY(216deg) translateZ(70px);
  128. /* Увеличено с 50px */
  129. clip-path: polygon(50% 0%, 100% 30%, 100% 70%, 50% 100%, 0% 70%, 0% 30%);
  130. }
  131. .crystal-face-5 {
  132. transform: rotateY(288deg) translateZ(70px);
  133. /* Увеличено с 50px */
  134. clip-path: polygon(50% 0%, 100% 30%, 100% 70%, 50% 100%, 0% 70%, 0% 30%);
  135. }
  136. .crystal-inner-glow {
  137. position: absolute;
  138. top: 0;
  139. left: 0;
  140. width: 100%;
  141. height: 100%;
  142. background: radial-gradient(ellipse at center, rgba(255, 255, 255, 0.8) 0%, rgba(255, 255, 255, 0) 60%);
  143. opacity: 0.3;
  144. filter: blur(5px);
  145. animation: innerGlow 4s ease-in-out infinite alternate;
  146. }
  147. @keyframes innerGlow {
  148. 0% {
  149. opacity: 0.2;
  150. transform: scale(0.8);
  151. }
  152. 100% {
  153. opacity: 0.4;
  154. transform: scale(1.1);
  155. }
  156. }
  157. /* Контейнер для магических частиц */
  158. .magic-particles-container {
  159. position: absolute;
  160. top: 0;
  161. left: 0;
  162. width: 100%;
  163. height: 100%;
  164. pointer-events: none;
  165. z-index: 3;
  166. }
  167. .magic-particle {
  168. position: absolute;
  169. width: 4px;
  170. height: 4px;
  171. background-color: rgba(255, 255, 255, 0.8);
  172. border-radius: 50%;
  173. filter: blur(1px);
  174. z-index: 3;
  175. }
  176. /* Контейнер для левитирующих предметов */
  177. .levitating-items-container {
  178. position: absolute;
  179. top: 0;
  180. left: 0;
  181. width: 100%;
  182. height: 100%;
  183. /* Убрали transform-style: preserve-3d для исправления проблемы с иконками */
  184. z-index: 10;
  185. /* Увеличили z-index */
  186. }
  187. /* Стиль для элементов призов */
  188. .levitating-item {
  189. position: absolute;
  190. width: 40px;
  191. height: 40px;
  192. /* Убрано transform-style: preserve-3d */
  193. transform-origin: center;
  194. z-index: 15;
  195. /* Увеличен z-index для лучшей видимости */
  196. }
  197. .item-wrapper {
  198. position: relative;
  199. width: 100%;
  200. height: 100%;
  201. /* Убрано transform-style: preserve-3d */
  202. animation: itemRotate 10s linear infinite;
  203. }
  204. @keyframes itemRotate {
  205. 0% {
  206. transform: rotateY(0deg);
  207. }
  208. 100% {
  209. transform: rotateY(360deg);
  210. }
  211. }
  212. .item-content {
  213. position: absolute;
  214. width: 100%;
  215. height: 100%;
  216. /* Убрано transform-style: preserve-3d */
  217. display: flex;
  218. align-items: center;
  219. justify-content: center;
  220. z-index: 20;
  221. /* Повышен z-index */
  222. }
  223. .item-content img {
  224. width: 36px;
  225. height: 36px;
  226. object-fit: contain;
  227. border-radius: 5px;
  228. box-shadow: 0 0 10px rgba(104, 79, 243, 0.6);
  229. filter: drop-shadow(0 0 3px rgba(255, 255, 255, 0.8));
  230. background: rgba(10, 5, 30, 0.3);
  231. padding: 3px;
  232. /* Убрано transform-style: preserve-3d */
  233. transition: transform 0.3s ease;
  234. z-index: 25;
  235. /* Максимальный z-index */
  236. }
  237. .item-glow {
  238. position: absolute;
  239. top: 50%;
  240. left: 50%;
  241. transform: translate(-50%, -50%);
  242. width: 60px;
  243. height: 60px;
  244. background: radial-gradient(circle, rgba(144, 120, 255, 0.6) 0%, rgba(144, 120, 255, 0) 70%);
  245. border-radius: 50%;
  246. filter: blur(5px);
  247. opacity: 0.7;
  248. z-index: 4;
  249. animation: itemGlowPulse 3s ease-in-out infinite alternate;
  250. }
  251. @keyframes itemGlowPulse {
  252. 0% {
  253. opacity: 0.4;
  254. transform: translate(-50%, -50%) scale(0.8);
  255. }
  256. 100% {
  257. opacity: 0.7;
  258. transform: translate(-50%, -50%) scale(1.2);
  259. }
  260. }
  261. .item-orbit {
  262. position: absolute;
  263. top: 50%;
  264. left: 50%;
  265. transform: translate(-50%, -50%);
  266. width: 0;
  267. height: 0;
  268. border: 1px dashed rgba(144, 120, 255, 0.3);
  269. border-radius: 50%;
  270. z-index: 3;
  271. }
  272. /* Контейнер для энергетических линий (скрыт) */
  273. .energy-lines-container {
  274. position: absolute;
  275. top: 0;
  276. left: 0;
  277. width: 100%;
  278. height: 100%;
  279. z-index: 2;
  280. /* Скрываем энергетические линии */
  281. opacity: 0;
  282. }
  283. .energy-line {
  284. display: none;
  285. /* Полностью убираем линии */
  286. }
  287. /* Центр колеса */
  288. .wheel-center {
  289. position: absolute;
  290. top: 50%;
  291. left: 50%;
  292. transform: translate(-50%, -50%);
  293. width: 70px;
  294. /* Увеличено с 50px */
  295. height: 70px;
  296. /* Увеличено с 50px */
  297. z-index: 10;
  298. }
  299. .center-inner {
  300. position: absolute;
  301. width: 100%;
  302. height: 100%;
  303. border-radius: 50%;
  304. background: linear-gradient(45deg, #ffd700, #f0c419, #ffaa00);
  305. box-shadow: 0 0 15px rgba(255, 215, 0, 0.8),
  306. /* Увеличена тень */
  307. inset 0 0 8px rgba(0, 0, 0, 0.5);
  308. }
  309. .center-logo {
  310. position: absolute;
  311. top: 50%;
  312. left: 50%;
  313. transform: translate(-50%, -50%);
  314. width: 45px;
  315. /* Увеличено с 30px */
  316. height: 45px;
  317. /* Увеличено с 30px */
  318. background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23341f6d'%3E%3Cpath d='M12 2L4 7v10l8 5 8-5V7l-8-5zm6 14.5l-6 3.75-6-3.75V7.5l6-3.75 6 3.75v9z'/%3E%3C/svg%3E");
  319. background-repeat: no-repeat;
  320. background-size: contain;
  321. }
  322. /* Информационный текст */
  323. .prize-info {
  324. position: relative;
  325. margin-top: 20px;
  326. text-align: center;
  327. z-index: 10;
  328. }
  329. .prize-glow {
  330. position: absolute;
  331. top: 0;
  332. left: 0;
  333. width: 100%;
  334. height: 100%;
  335. background: radial-gradient(ellipse at center, rgba(104, 79, 243, 0.4) 0%, rgba(104, 79, 243, 0) 70%);
  336. filter: blur(10px);
  337. opacity: 0.7;
  338. z-index: -1;
  339. animation: prizeGlow 3s ease-in-out infinite alternate;
  340. }
  341. @keyframes prizeGlow {
  342. 0% {
  343. opacity: 0.5;
  344. transform: scale(0.9);
  345. }
  346. 100% {
  347. opacity: 0.8;
  348. transform: scale(1.1);
  349. }
  350. }
  351. .prize-text {
  352. display: inline-block;
  353. padding: 10px 20px;
  354. background: linear-gradient(135deg, #291b5a, #432e7e);
  355. color: #ffffff;
  356. font-size: 18px;
  357. font-weight: bold;
  358. border-radius: 25px;
  359. box-shadow: 0 0 15px rgba(104, 79, 243, 0.6),
  360. inset 0 0 10px rgba(255, 255, 255, 0.1);
  361. text-shadow: 0 0 5px rgba(255, 255, 255, 0.5);
  362. animation: prizeTextPulse 2s ease-in-out infinite alternate;
  363. }
  364. @keyframes prizeTextPulse {
  365. 0% {
  366. transform: scale(1);
  367. }
  368. 100% {
  369. transform: scale(1.05);
  370. }
  371. }
  372. /* Анимации левитации для предметов */
  373. @keyframes levitateUpDown {
  374. 0%,
  375. 100% {
  376. transform: translateY(0);
  377. }
  378. 50% {
  379. transform: translateY(-10px);
  380. }
  381. }
  382. @keyframes fadeInOut {
  383. 0%,
  384. 100% {
  385. opacity: 0.7;
  386. }
  387. 50% {
  388. opacity: 1;
  389. }
  390. }
  391. /* Анимации для орбитального движения */
  392. @keyframes orbitRotate1 {
  393. 0% {
  394. transform: rotate(0deg) translateX(80px) rotate(0deg);
  395. }
  396. 100% {
  397. transform: rotate(360deg) translateX(80px) rotate(-360deg);
  398. }
  399. }
  400. @keyframes orbitRotate2 {
  401. 0% {
  402. transform: rotate(60deg) translateX(80px) rotate(-60deg);
  403. }
  404. 100% {
  405. transform: rotate(420deg) translateX(80px) rotate(-420deg);
  406. }
  407. }
  408. @keyframes orbitRotate3 {
  409. 0% {
  410. transform: rotate(120deg) translateX(80px) rotate(-120deg);
  411. }
  412. 100% {
  413. transform: rotate(480deg) translateX(80px) rotate(-480deg);
  414. }
  415. }
  416. @keyframes orbitRotate4 {
  417. 0% {
  418. transform: rotate(180deg) translateX(80px) rotate(-180deg);
  419. }
  420. 100% {
  421. transform: rotate(540deg) translateX(80px) rotate(-540deg);
  422. }
  423. }
  424. @keyframes orbitRotate5 {
  425. 0% {
  426. transform: rotate(240deg) translateX(80px) rotate(-240deg);
  427. }
  428. 100% {
  429. transform: rotate(600deg) translateX(80px) rotate(-600deg);
  430. }
  431. }
  432. @keyframes orbitRotate6 {
  433. 0% {
  434. transform: rotate(300deg) translateX(80px) rotate(-300deg);
  435. }
  436. 100% {
  437. transform: rotate(660deg) translateX(80px) rotate(-660deg);
  438. }
  439. }
  440. /* Дополнительные анимации для элементов */
  441. @keyframes pulse {
  442. 0%,
  443. 100% {
  444. transform: scale(1);
  445. }
  446. 50% {
  447. transform: scale(1.1);
  448. }
  449. }
  450. @keyframes sparkle {
  451. 0%,
  452. 100% {
  453. opacity: 0;
  454. transform: scale(0);
  455. }
  456. 50% {
  457. opacity: 1;
  458. transform: scale(1);
  459. }
  460. }
  461. /* Стили для выделения активного приза */
  462. .item-highlight {
  463. animation: itemHighlight 1.5s ease-in-out;
  464. }
  465. @keyframes itemHighlight {
  466. 0%,
  467. 100% {
  468. transform: scale(1);
  469. filter: brightness(1);
  470. }
  471. 50% {
  472. transform: scale(1.3);
  473. filter: brightness(1.5);
  474. }
  475. }
  476. .form-check-label {
  477. font-size: 14px !important;
  478. line-height: 1.4 !important;
  479. margin-left: 0.5rem !important;
  480. cursor: pointer !important;
  481. user-select: none !important;
  482. }
  483. .form-check-label a {
  484. text-decoration: none !important;
  485. font-weight: 500 !important;
  486. transition: color 0.3s ease !important;
  487. }
  488. .form-check-label a:hover {
  489. color: #0d6efd !important;
  490. text-decoration: underline !important;
  491. }
  492. input[type="checkbox"].agreement-checkbox {
  493. width: 22px !important;
  494. height: 22px !important;
  495. margin: 0 !important;
  496. margin-right: 0.5rem !important;
  497. border: 3px solid #6c757d !important;
  498. border-radius: 6px !important;
  499. cursor: pointer !important;
  500. transition: all 0.3s ease !important;
  501. position: relative !important;
  502. background-color: #ffffff !important;
  503. appearance: none !important;
  504. -webkit-appearance: none !important;
  505. -moz-appearance: none !important;
  506. margin-top: 2px !important;
  507. }
  508. input[type="checkbox"].agreement-checkbox:checked {
  509. background-color: #198754 !important;
  510. border-color: #198754 !important;
  511. box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.3) !important;
  512. transform: scale(1.05) !important;
  513. }
  514. input[type="checkbox"].agreement-checkbox:checked::before {
  515. content: '✓' !important;
  516. position: absolute !important;
  517. top: 50% !important;
  518. left: 50% !important;
  519. transform: translate(-50%, -50%) !important;
  520. color: white !important;
  521. font-size: 16px !important;
  522. font-weight: bold !important;
  523. line-height: 1 !important;
  524. text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) !important;
  525. }
  526. input[type="checkbox"].agreement-checkbox:hover {
  527. border-color: #198754 !important;
  528. box-shadow: 0 0 0 3px rgba(25, 135, 84, 0.2) !important;
  529. transform: scale(1.02) !important;
  530. }
  531. input[type="checkbox"].agreement-checkbox:focus {
  532. outline: none !important;
  533. border-color: #198754 !important;
  534. box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.3) !important;
  535. }
  536. /* Стили для лейблов */
  537. .form-check .form-check-label {
  538. font-size: 14px !important;
  539. line-height: 1.4 !important;
  540. cursor: pointer !important;
  541. user-select: none !important;
  542. padding-left: 0.5rem !important;
  543. font-weight: 400 !important;
  544. margin: 0 !important;
  545. padding: 0 !important;
  546. display: block !important;
  547. }
  548. .form-check .form-check-label a {
  549. text-decoration: none !important;
  550. font-weight: 600 !important;
  551. transition: color 0.3s ease !important;
  552. color: #0d6efd !important;
  553. display: inline !important;
  554. margin: 0 !important;
  555. padding: 0 !important;
  556. line-height: inherit !important;
  557. }
  558. .form-check .form-check-label a:hover {
  559. color: #0a58ca !important;
  560. text-decoration: underline !important;
  561. }
  562. /* Анимация при клике */
  563. input[type="checkbox"].agreement-checkbox:active {
  564. transform: scale(0.95) !important;
  565. }
  566. </style>
  567. {{ config().other().getAnalyticsHead()|raw }}
  568. </head>
  569. <body>
  570. {{ config().other().getAnalyticsBody()|raw }}
  571. {%include 'notice_toast.html'%}
  572. <!-- Loader -->
  573. <div id="loader">
  574. <img src="{{template}}/assets/images/media/loader.svg" alt="">
  575. </div>
  576. <!-- Loader -->
  577. <div {%if config().background().registration()%}
  578. style="background-image: url('{{config().background().registration()}}'); background-size: cover; background-repeat: no-repeat; background-position: center center;"
  579. {%else%}class="autentication-bg" {%endif%}>
  580. <div class="container-lg">
  581. <!-- Новый макет с кристаллом и формой -->
  582. <div class="row justify-content-center authentication authentication-basic align-items-center h-100">
  583. <!-- Форма регистрации по центру -->
  584. <div class="col-xxl-4 col-xl-5 col-lg-5 col-md-6 col-sm-8 col-12 position-relative">
  585. <!-- Логотип -->
  586. <div class="my-4 d-flex justify-content-center">
  587. <a href="/main">
  588. <img src="{{config().logo().getLogo()}}" alt="logo">
  589. </a>
  590. </div>
  591. <!-- Форма -->
  592. <div class="card custom-card">
  593. <form id="authForm" action="/registration/user" method="POST" class="card-body">
  594. <p class="h5 fw-semibold mb-2 text-center">{{ phrase('registration') }}</p>
  595. <p class="mb-4 text-muted op-7 fw-normal text-center">{{ phrase('reg_enable_all_features') }}</p>
  596. <div class="row gy-3">
  597. <div class="col-xl-12">
  598. <label for="email" class="form-label text-default">Email<i class="text-danger">*</i></label>
  599. <input required name="email" type="text" class="form-control form-control-lg" id="email"
  600. placeholder="example@example.com">
  601. </div>
  602. <div class="col-xl-12">
  603. <label for="account"
  604. class="form-label text-default d-flex justify-content-between align-items-center">
  605. <span>{{ phrase(480) }}</span>
  606. <span class="label-details">
  607. {%set maxChars = config().registration().getMaximumNumberOfCharactersRegistrationAccount()%}
  608. <small class="form-text text-muted">
  609. {{ phrase('minMaxCharacters',
  610. config().registration().getMinimumNumberOfCharactersRegistrationAccount(),
  611. config().registration().getMaximumNumberOfCharactersRegistrationAccount()
  612. )}}
  613. </small>
  614. <small id="accountCharCounter" class="form-text text-muted">
  615. {{ phrase(312) }}: {{ maxChars }}
  616. </small>
  617. </span>
  618. </label>
  619. <div class="input-group mb-3">
  620. {%if config().registration().getEnablePrefix() and config().registration().getPrefixType() ==
  621. 'prefix'%}
  622. <button class="btn btn-light account_prefix"
  623. type="button">{{config().registration().genPrefix()}}</button>
  624. {%endif%}
  625. <input name="account" type="text" class="form-control form-control-lg" id="account" placeholder=""
  626. minlength="{{ config().registration().getMinimumNumberOfCharactersRegistrationAccount() }}"
  627. maxlength="{{ maxChars }}">
  628. {%if config().registration().getEnablePrefix() and config().registration().getPrefixType() ==
  629. 'suffix'%}
  630. <button class="btn btn-light account_prefix"
  631. type="button">{{config().registration().genPrefix()}}</button>
  632. {%endif%}
  633. </div>
  634. </div>
  635. <div class="col-xl-12 mb-2">
  636. <label for="signin-password" class="form-label text-default d-block">{{ phrase('password') }}<i
  637. class="text-danger">*</i>
  638. <a href="#" tabindex="0" class="float-end text-info password-popover" role="button"
  639. data-bs-toggle="popover" data-bs-placement="right" data-bs-html="true" data-bs-content="{%for i, word in generation_words_password(10)%}
  640. {{i + 1}}. <a href='#' class='thisPassword'>{{word}}</a><br>
  641. {%endfor%}">{{ phrase('help_create_password') }}</a>
  642. </label>
  643. <div class="input-group">
  644. <input name="password" type="password" class="form-control form-control-lg" id="signin-password"
  645. placeholder="password" required>
  646. <button class="btn btn-light" type="button" onclick="createpassword('signin-password',this)"
  647. id="button-addon2"><i class="ri-eye-off-line align-middle"></i></button>
  648. </div>
  649. </div>
  650. {%if config().captcha().isGoogleCaptcha()%}
  651. <div id="g-recaptcha"></div>
  652. {%elseif config().captcha().isCloudflareCaptcha()%}
  653. <div id="cf-turnstile" class="cf-turnstile"></div>
  654. <input type="hidden" id="cf-turnstile-response" name="cf-turnstile-response">
  655. {%elseif config().captcha().isDefaultCaptcha()%}
  656. <script async defer src="https://js.hcaptcha.com/1/api.js?hl={{getUser().getLang()}}"></script>
  657. <div class="h-captcha text-center" data-sitekey="0c545d06-4fe6-45d4-b704-7b809af8db9c"></div>
  658. {%endif%}
  659. {{ csrf_field() }}
  660. <input type="hidden" name="finger" id="finger">
  661. <div id="referralinput" class="col-xl-12 mb-2 {%if referral_name is empty%}d-none{%endif%}">
  662. <label for="referral" class="form-label text-default">{{ phrase('username') }}</label>
  663. <input name="referral" value="{{referral_name}}" type="text" class="form-control form-control-lg"
  664. id="referral" placeholder="">
  665. </div>
  666. <div class="col-xl-12 mb-2">
  667. {%if config().other().getLinkPrivacyPolicy() and config().other().getLinkPrivacyPolicy() != 'https://' and config().other().getLinkPrivacyPolicy() is not empty%}
  668. <div class="d-flex align-items-start mb-1">
  669. <input class="agreement-checkbox me-2 flex-shrink-0" type="checkbox" id="privacy-policy" name="privacy_policy" required>
  670. <label for="privacy-policy">
  671. {{ phrase('i_agree_private_police', config().other().getLinkPrivacyPolicy())|raw }}
  672. </label>
  673. </div>
  674. {%endif%}
  675. {%if config().other().getLinkUserAgreement() and config().other().getLinkUserAgreement() != 'https://' and config().other().getLinkUserAgreement() is not empty%}
  676. <div class="d-flex align-items-start mb-1">
  677. <input class="agreement-checkbox me-2 flex-shrink-0" type="checkbox" id="terms-of-service" name="terms_of_service" required>
  678. <label for="terms-of-service">
  679. {{ phrase('i_agree_terms_of_service', config().other().getLinkUserAgreement() )|raw }}
  680. </label>
  681. </div>
  682. {%endif%}
  683. {%if config().other().getLinkServerRules() and config().other().getLinkServerRules() != 'https://' and config().other().getLinkServerRules() is not empty%}
  684. <div class="d-flex align-items-start">
  685. <input class="agreement-checkbox me-2 flex-shrink-0" type="checkbox" id="server-rules" name="server_rules" required>
  686. <label for="server-rules">
  687. {{ phrase('i_agree_server_rules', config().other().getLinkServerRules())|raw }}
  688. </label>
  689. </div>
  690. {%endif%}
  691. </div>
  692. <div class="col-xl-12 d-grid mt-2">
  693. <button type="submit" aria-label="button" class="btn btn-lg btn-success enter" >
  694. {{ phrase('register_master_account') }}
  695. </button>
  696. </div>
  697. </div>
  698. {%if config().enabled().isEnableReferral()%}
  699. <div class="text-center">
  700. <p id="add_referral" class="text-muted mt-3 text-info" role="button">{{ phrase('user_referral') }}</p>
  701. </div>
  702. {%endif%}
  703. <div class="text-center my-1 authentication-barrier">
  704. <span><i class="ti ti-lock"></i></span>
  705. </div>
  706. <div class="btn-list text-center">
  707. <a href="/auth" aria-label="button" class="btn btn-primary-transparent">
  708. {{ phrase('authorization') }}
  709. </a>
  710. <a href="/forget" class="btn btn-primary-transparent">
  711. {{ phrase(67) }}
  712. </a>
  713. </div>
  714. </form>
  715. <div class="text-center">
  716. {%for lang in getAllowLang(false)%}
  717. <a class="align-items-center" href="{{action('user_lang', [lang.lang])}}">
  718. <span class="avatar avatar-xs lh-1 me-0">
  719. <img src="/uploads/images/flags/{{lang.lang}}.png" alt="img">
  720. </span>
  721. </a>
  722. {%endfor%}
  723. </div>
  724. </div>
  725. {%if getServer().bonus().isRegistrationBonus()%}
  726. <div class="d-none d-lg-block magic-crystal-absolute">
  727. <div class="magical-showcase-wrapper">
  728. <div class="crystal-container">
  729. <div class="crystal-base">
  730. <div class="crystal-glow"></div>
  731. </div>
  732. <div class="crystal">
  733. <div class="crystal-face crystal-face-1"></div>
  734. <div class="crystal-face crystal-face-2"></div>
  735. <div class="crystal-face crystal-face-3"></div>
  736. <div class="crystal-face crystal-face-4"></div>
  737. <div class="crystal-face crystal-face-5"></div>
  738. <div class="crystal-inner-glow"></div>
  739. </div>
  740. <div class="magic-particles-container">
  741. </div>
  742. <div class="levitating-items-container">
  743. </div>
  744. <div class="energy-lines-container">
  745. </div>
  746. </div>
  747. <div class="prize-info">
  748. <div class="prize-glow"></div>
  749. <div class="prize-text">
  750. {%if getServer().bonus().isIssueAllItems()%}
  751. {{ phrase('registration_reward_all') }}
  752. {%else%}
  753. {{ phrase('registration_reward_one_random') }}
  754. {%endif%}
  755. </div>
  756. </div>
  757. </div>
  758. </div>
  759. {%endif%}
  760. </div>
  761. </div>
  762. </div>
  763. </div>
  764. <style>
  765. .magic-crystal-absolute {
  766. position: absolute;
  767. top: 50%;
  768. left: 105%;
  769. /* Размещаем справа от формы */
  770. transform: translateY(-50%);
  771. width: 340px;
  772. z-index: 10;
  773. }
  774. /* Медиа-запрос для корректировки позиции на более узких экранах */
  775. @media (max-width: 1400px) {
  776. .magic-crystal-absolute {
  777. left: 100%;
  778. }
  779. }
  780. /* Медиа-запрос для очень узких экранов */
  781. @media (max-width: 1200px) {
  782. .magic-crystal-absolute {
  783. left: 95%;
  784. }
  785. }
  786. </style>
  787. <!-- Bootstrap JS -->
  788. <script src="{{template}}/assets/libs/bootstrap/js/bootstrap.bundle.min.js"></script>
  789. <!-- Show Password JS -->
  790. <script src="{{template}}/assets/js/show-password.js"></script>
  791. <script src="{{template}}/assets/libs/@popperjs/core/umd/popper.min.js"></script>
  792. <script src="{{template}}/assets/js/Toasts.js"></script>
  793. <script src="{{template}}/assets/js/general.js?v=1.0.5"></script>
  794. {%if config().captcha().isEnabled()%}
  795. <script>
  796. var captcha = "{{config().captcha().getCaptcha()}}";
  797. </script>
  798. {%if config().captcha().isGoogleCaptcha()%}
  799. <script src="https://www.google.com/recaptcha/api.js"></script>
  800. <script>
  801. window.onload = function () {
  802. if (typeof grecaptcha !== 'undefined') {
  803. grecaptcha.render('g-recaptcha', {
  804. 'sitekey': '{{ google_secret_key() }}'
  805. });
  806. } else {
  807. console.error('grecaptcha is not defined');
  808. }
  809. };
  810. </script>
  811. {%elseif config().captcha().isDefaultCaptcha()%}
  812. {%elseif config().captcha().isCloudflareCaptcha()%}
  813. <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
  814. <script>
  815. // Инициализация Cloudflare Turnstile
  816. window.onload = function () {
  817. turnstile.render('#cf-turnstile', {
  818. sitekey: '{{config().captcha().getCloudflareSiteKey()}}',
  819. callback: function (token) {
  820. document.getElementById('cf-turnstile-response').value = token;
  821. }
  822. });
  823. };
  824. </script>
  825. {%endif%}
  826. {%endif%}
  827. <script>
  828. document.addEventListener('DOMContentLoaded', function () {
  829. function get_captcha() {
  830. // Проверяем, какая капча используется
  831. if (captcha === "google") {
  832. grecaptcha.reset();
  833. } else if (captcha === "default") {
  834. // Сброс hCaptcha
  835. if (typeof hcaptcha !== 'undefined') {
  836. hcaptcha.reset();
  837. }
  838. } else if (captcha === "cloudflare") {
  839. // Сброс Cloudflare Turnstile
  840. if (typeof turnstile !== 'undefined') {
  841. turnstile.reset();
  842. }
  843. }
  844. }
  845. // Делаем функцию доступной глобально
  846. window.get_captcha = get_captcha;
  847. });
  848. $(document).ready(function () {
  849. // --- Логика для чекбоксов соглашений ---
  850. const $submitButton = $('button.enter');
  851. const $agreementCheckboxes = $('.agreement-checkbox');
  852. const totalCheckboxes = $agreementCheckboxes.length;
  853. function updateButtonState() {
  854. // Если чекбоксы есть на странице
  855. if (totalCheckboxes > 0) {
  856. // Считаем количество отмеченных
  857. const checkedCount = $('.agreement-checkbox:checked').length;
  858. // Если количество отмеченных равно общему количеству, включаем кнопку
  859. const allChecked = checkedCount === totalCheckboxes;
  860. $submitButton.prop('disabled', !allChecked);
  861. }
  862. // Если чекбоксов нет, кнопка будет активна по умолчанию (атрибут disabled не будет установлен)
  863. }
  864. // Добавляем обработчик на изменение состояния любого чекбокса
  865. $agreementCheckboxes.on('change', function() {
  866. updateButtonState();
  867. });
  868. // Устанавливаем начальное состояние кнопки при загрузке страницы
  869. updateButtonState();
  870. // --- Конец логики для чекбоксов ---
  871. // Инициализация всех popover'ов на странице
  872. var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
  873. var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
  874. return new bootstrap.Popover(popoverTriggerEl, {
  875. html: true,
  876. sanitize: false
  877. });
  878. });
  879. function transliterate(text) {
  880. const layoutMap = {
  881. 'й': 'q', 'ц': 'w', 'у': 'e', 'к': 'r', 'е': 't', 'н': 'y', 'г': 'u', 'ш': 'i', 'щ': 'o', 'з': 'p', 'х': '[', 'ъ': ']',
  882. 'ф': 'a', 'ы': 's', 'в': 'd', 'а': 'f', 'п': 'g', 'р': 'h', 'о': 'j', 'л': 'k', 'д': 'l', 'ж': ';', 'э': "'",
  883. 'я': 'z', 'ч': 'x', 'с': 'c', 'м': 'v', 'и': 'b', 'т': 'n', 'ь': 'm', 'б': ',', 'ю': '.',
  884. 'і': 's', 'ї': ']', 'є': "'",
  885. 'Й': 'Q', 'Ц': 'W', 'У': 'E', 'К': 'R', 'Е': 'T', 'Н': 'Y', 'Г': 'U', 'Ш': 'I', 'Щ': 'O', 'З': 'P', 'Х': '[', 'Ъ': ']',
  886. 'Ф': 'A', 'Ы': 'S', 'В': 'D', 'А': 'F', 'П': 'G', 'Р': 'H', 'О': 'J', 'Л': 'K', 'Д': 'L', 'Ж': ';', 'Э': "'",
  887. 'Я': 'Z', 'Ч': 'X', 'С': 'C', 'М': 'V', 'И': 'B', 'Т': 'N', 'Ь': 'M', 'Б': ',', 'Ю': '.',
  888. 'І': 'S', 'Ї': ']', 'Є': "'",
  889. 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', 'θ': 'u', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm',
  890. 'ν': 'n', 'ξ': 'j', 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'ς': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', 'χ': 'x', 'ψ': 'c', 'ω': 'v',
  891. 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', 'Η': 'H', 'Θ': 'U', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M',
  892. 'Ν': 'N', 'Ξ': 'J', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', 'Φ': 'F', 'Χ': 'X', 'Ψ': 'C', 'Ω': 'V',
  893. 'á': 'a', 'é': 'e', 'í': 'i', 'ó': 'o', 'ú': 'u', 'ý': 'y',
  894. 'à': 'a', 'è': 'e', 'ì': 'i', 'ò': 'o', 'ù': 'u',
  895. 'â': 'a', 'ê': 'e', 'î': 'i', 'ô': 'o', 'û': 'u',
  896. 'ã': 'a', 'õ': 'o', 'ñ': 'n', 'ç': 'c', 'ë': 'e', 'ï': 'i', 'ü': 'u',
  897. 'Á': 'A', 'É': 'E', 'Í': 'I', 'Ó': 'O', 'Ú': 'U', 'Ý': 'Y',
  898. 'À': 'A', 'È': 'E', 'Ì': 'I', 'Ò': 'O', 'Ù': 'U',
  899. 'Â': 'A', 'Ê': 'E', 'Î': 'I', 'Ô': 'O', 'Û': 'U',
  900. 'Ã': 'A', 'Õ': 'O', 'Ñ': 'N', 'Ç': 'C', 'Ë': 'E', 'Ï': 'I', 'Ü': 'U',
  901. 'ß': 'ss'
  902. };
  903. let result = '';
  904. for (let i = 0; i < text.length; i++) {
  905. const char = text[i];
  906. result += layoutMap[char] || char;
  907. }
  908. return result;
  909. }
  910. function updateCounterUI() {
  911. const $input = $('#account');
  912. const $counter = $('#accountCharCounter');
  913. const $prefixButton = $('.account_prefix');
  914. if ($input.length === 0 || $counter.length === 0) {
  915. return;
  916. }
  917. const maxChars = parseInt($input.attr('maxlength'), 10);
  918. const prefixLen = $prefixButton.length > 0 ? $prefixButton.text().trim().length : 0;
  919. const currentLen = $input.val().length;
  920. const remaining = maxChars - prefixLen - currentLen;
  921. $counter.text('{{ phrase(312) }}: ' + remaining);
  922. if (remaining < 0) {
  923. $counter.removeClass('text-muted').addClass('text-danger');
  924. } else {
  925. $counter.removeClass('text-danger').addClass('text-muted');
  926. }
  927. }
  928. function enforceCharacterLimit() {
  929. const $input = $('#account');
  930. if ($input.length === 0) return;
  931. const maxChars = parseInt($input.attr('maxlength'), 10);
  932. const prefixLen = $('.account_prefix').text().trim().length;
  933. const allowedInputLength = maxChars - prefixLen;
  934. if ($input.val().length > allowedInputLength) {
  935. const truncatedValue = $input.val().substring(0, allowedInputLength);
  936. $input.val(truncatedValue);
  937. }
  938. }
  939. $(document).on('input', '#account', function () {
  940. const originalValue = $(this).val();
  941. let newValue = transliterate(originalValue);
  942. newValue = newValue.replace(/[^a-zA-Z0-9_]/g, '');
  943. if (originalValue !== newValue) {
  944. const start = this.selectionStart;
  945. const end = this.selectionEnd;
  946. $(this).val(newValue);
  947. this.setSelectionRange(start, end);
  948. }
  949. enforceCharacterLimit();
  950. updateCounterUI();
  951. });
  952. updateCounterUI();
  953. // Обработчик для генерации паролей
  954. $(document).on('click', '.thisPassword', function () {
  955. $('#signin-password').val($(this).text());
  956. $('#signin-password').attr('type', 'text');
  957. $('.align-middle').removeClass('ri-eye-off-line');
  958. $('.align-middle').addClass('ri-eye-line');
  959. });
  960. $(document).on('click', '.account_prefix', function () {
  961. AjaxSend('/registration/account/prefix', 'POST', {}, true).then(function (prefix) {
  962. $('.account_prefix').text(prefix);
  963. enforceCharacterLimit();
  964. updateCounterUI();
  965. });
  966. });
  967. {%if getServer().bonus().isRegistrationBonus()%}
  968. // JavaScript для магического кристалла
  969. // Пути к изображениям предметов
  970. const itemImages = [
  971. {%for item in getServer().bonus().getRegistrationBonusItems()%}
  972. {%set itemInfo = get_item_info(item.id)%}
  973. '{{ itemInfo.getIcon() }}',
  974. {%endfor%}
  975. ];
  976. // Создаем левитирующие предметы
  977. const itemsContainer = $('.levitating-items-container');
  978. // Функция для создания орбит предметов
  979. function createItemOrbits() {
  980. const orbitsContainer = $('.energy-lines-container');
  981. // Определяем нужное количество орбит на основе количества предметов
  982. // Распределим предметы на 3 орбиты
  983. const orbitsCount = 3;
  984. // Создаем орбиты
  985. for (let i = 0; i < orbitsCount; i++) {
  986. const orbitSize = 140 + i * 30;
  987. const orbit = $('<div>')
  988. .addClass('item-orbit')
  989. .css({
  990. 'width': `${orbitSize}px`,
  991. 'height': `${orbitSize}px`,
  992. 'opacity': 0.3 - i * 0.1
  993. });
  994. orbitsContainer.append(orbit);
  995. }
  996. }
  997. // Создаем орбиты
  998. createItemOrbits();
  999. // Функция для получения случайных скоростей вращения
  1000. function getRandomSpeed(min, max) {
  1001. return min + Math.random() * (max - min);
  1002. }
  1003. // Создаем предметы и размещаем их по орбитам с уникальными скоростями и траекториями
  1004. function createItems() {
  1005. const itemCount = itemImages.length;
  1006. const animationKeyframes = [];
  1007. // Создаем массив для хранения всех keyframes анимаций
  1008. const keyframesArray = [];
  1009. // Распределяем элементы равномерно вокруг орбит
  1010. for (let i = 0; i < itemCount; i++) {
  1011. // Определяем, на какой орбите будет элемент (распределяем по 3 орбитам)
  1012. const orbitIndex = i % 3;
  1013. // Расстояние от центра зависит от орбиты
  1014. const radius = 100 + orbitIndex * 30; // 100, 130, 160
  1015. // Генерируем случайный начальный угол для каждого элемента
  1016. const randomStartAngle = Math.random() * 360;
  1017. // Выбираем случайную скорость вращения для каждого элемента
  1018. // Чем меньше число, тем быстрее движение
  1019. const orbitDuration = getRandomSpeed(20, 40);
  1020. // Создаем элемент предмета с индивидуальными CSS свойствами
  1021. const item = $('<div>')
  1022. .addClass('levitating-item')
  1023. .attr('data-item-index', i)
  1024. .css({
  1025. 'top': '50%',
  1026. 'left': '50%',
  1027. 'z-index': 15,
  1028. 'transform-origin': 'center'
  1029. });
  1030. // Применяем случайную начальную позицию
  1031. item.css({
  1032. 'transform': `rotate(${randomStartAngle}deg) translateX(${radius}px) rotate(-${randomStartAngle}deg)`
  1033. });
  1034. // Создаем уникальные ключевые кадры анимации для каждого элемента
  1035. const keyframesName = `orbit${i}`;
  1036. const keyframes = `
  1037. @keyframes ${keyframesName} {
  1038. 0% { transform: rotate(${randomStartAngle}deg) translateX(${radius}px) rotate(-${randomStartAngle}deg); }
  1039. 100% { transform: rotate(${randomStartAngle + 360}deg) translateX(${radius}px) rotate(-${randomStartAngle + 360}deg); }
  1040. }
  1041. `;
  1042. keyframesArray.push(keyframes);
  1043. // Создаем обертку для вращения элемента вокруг своей оси
  1044. const itemWrapper = $('<div>')
  1045. .addClass('item-wrapper')
  1046. .css({
  1047. 'animation-duration': `${getRandomSpeed(8, 15)}s`,
  1048. 'animation-direction': i % 2 === 0 ? 'normal' : 'reverse'
  1049. });
  1050. // Создаем контент предмета
  1051. const itemContent = $('<div>')
  1052. .addClass('item-content')
  1053. .css('z-index', 20);
  1054. // Добавляем изображение
  1055. const img = $('<img>')
  1056. .attr('src', itemImages[i]);
  1057. // Добавляем свечение вокруг предмета
  1058. const itemGlow = $('<div>')
  1059. .addClass('item-glow')
  1060. .css({
  1061. 'animation-delay': `${Math.random() * 2}s`
  1062. });
  1063. // Собираем структуру
  1064. itemContent.append(img);
  1065. itemContent.append(itemGlow);
  1066. itemWrapper.append(itemContent);
  1067. item.append(itemWrapper);
  1068. itemsContainer.append(item);
  1069. // Сохраняем информацию об анимации для последующего применения
  1070. animationKeyframes.push({
  1071. element: item,
  1072. keyframesName: keyframesName,
  1073. duration: orbitDuration
  1074. });
  1075. }
  1076. // Объединяем все keyframes и добавляем в head
  1077. const allKeyframes = keyframesArray.join('\n');
  1078. $('<style>').text(allKeyframes).appendTo('head');
  1079. // Ждем немного, чтобы DOM был полностью готов,
  1080. // затем применяем все анимации одновременно
  1081. setTimeout(() => {
  1082. // Применяем анимации ко всем элементам сразу
  1083. animationKeyframes.forEach(item => {
  1084. item.element.css({
  1085. 'animation': `${item.keyframesName} ${item.duration}s linear infinite`,
  1086. 'transition': 'none'
  1087. });
  1088. });
  1089. }, 500);
  1090. }
  1091. // Создаем предметы
  1092. createItems();
  1093. // Функция для создания магических частиц
  1094. function createMagicParticles() {
  1095. const particlesContainer = $('.magic-particles-container');
  1096. for (let i = 0; i < 30; i++) {
  1097. const particle = $('<div>')
  1098. .addClass('magic-particle')
  1099. .css({
  1100. 'left': `${Math.random() * 100}%`,
  1101. 'top': `${Math.random() * 100}%`,
  1102. 'width': `${2 + Math.random() * 3}px`,
  1103. 'height': `${2 + Math.random() * 3}px`,
  1104. 'background-color': `rgba(${144 + Math.random() * 111}, ${120 + Math.random() * 135}, 255, ${0.6 + Math.random() * 0.4})`,
  1105. 'animation': `sparkle ${1 + Math.random() * 3}s ease-in-out infinite`,
  1106. 'animation-delay': `${Math.random() * 3}s`
  1107. });
  1108. particlesContainer.append(particle);
  1109. }
  1110. }
  1111. // Создаем магические частицы
  1112. createMagicParticles();
  1113. // Функция для выделения случайного предмета и отображения его названия
  1114. function highlightRandomItem() {
  1115. // Сначала удаляем предыдущее выделение
  1116. $('.item-content img').removeClass('item-highlight');
  1117. // Выбираем случайный предмет
  1118. const items = $('.levitating-item');
  1119. if (items.length > 0) {
  1120. const randomIndex = Math.floor(Math.random() * items.length);
  1121. const selectedItem = $(items[randomIndex]);
  1122. // Выделяем предмет
  1123. selectedItem.find('.item-content img').addClass('item-highlight');
  1124. }
  1125. // Планируем следующее выделение
  1126. setTimeout(highlightRandomItem, 3000 + Math.random() * 2000);
  1127. }
  1128. // Начинаем процесс выделения предметов
  1129. setTimeout(highlightRandomItem, 2000);
  1130. // Функция для изменения интенсивности свечения кристалла
  1131. function pulsecrystalGlow() {
  1132. const innerGlow = $('.crystal-inner-glow');
  1133. const baseGlow = $('.crystal-glow');
  1134. // Случайные значения для интенсивности
  1135. const innerIntensity = 0.3 + Math.random() * 0.3;
  1136. const baseIntensity = 0.6 + Math.random() * 0.4;
  1137. // Применяем новые значения
  1138. innerGlow.css('opacity', innerIntensity);
  1139. baseGlow.css('opacity', baseIntensity);
  1140. // Планируем следующее изменение
  1141. setTimeout(pulsecrystalGlow, 2000 + Math.random() * 1000);
  1142. }
  1143. // Запускаем пульсацию свечения
  1144. pulsecrystalGlow();
  1145. // Улучшенная функция для создания эффектных вспышек энергии
  1146. function createEnergyBurst() {
  1147. // Создаем эффектную вспышку с градиентом
  1148. const burst = $('<div>')
  1149. .css({
  1150. 'position': 'absolute',
  1151. 'top': '50%',
  1152. 'left': '50%',
  1153. 'width': '0',
  1154. 'height': '0',
  1155. 'background': 'radial-gradient(circle, rgba(255, 255, 255, 0.9) 0%, rgba(144, 120, 255, 0.6) 40%, rgba(104, 79, 243, 0.2) 70%, transparent 100%)',
  1156. 'border-radius': '50%',
  1157. 'transform': 'translate(-50%, -50%)',
  1158. 'z-index': '6',
  1159. 'pointer-events': 'none',
  1160. 'transition': 'all 0.7s cubic-bezier(0.2, 0.8, 0.3, 1)',
  1161. 'filter': 'blur(3px)'
  1162. });
  1163. // Добавляем в контейнер
  1164. $('.crystal-container').append(burst);
  1165. // Анимируем вспышку
  1166. setTimeout(() => {
  1167. burst.css({
  1168. 'width': '300px',
  1169. 'height': '300px',
  1170. 'opacity': '0'
  1171. });
  1172. // Создаем дополнительный эффект мерцающих частиц при вспышке
  1173. createBurstParticles();
  1174. // Удаляем элемент после завершения анимации
  1175. setTimeout(() => {
  1176. burst.remove();
  1177. }, 700);
  1178. }, 10);
  1179. // Планируем следующую вспышку
  1180. setTimeout(createEnergyBurst, 4000 + Math.random() * 3000);
  1181. }
  1182. // Функция для создания мерцающих частиц при вспышке
  1183. function createBurstParticles() {
  1184. for (let i = 0; i < 20; i++) {
  1185. const angle = Math.random() * 360;
  1186. const distance = 40 + Math.random() * 120;
  1187. const radian = (angle * Math.PI) / 180;
  1188. const x = Math.cos(radian) * distance;
  1189. const y = Math.sin(radian) * distance;
  1190. const particle = $('<div>')
  1191. .css({
  1192. 'position': 'absolute',
  1193. 'top': '50%',
  1194. 'left': '50%',
  1195. 'width': `${3 + Math.random() * 5}px`,
  1196. 'height': `${3 + Math.random() * 5}px`,
  1197. 'background-color': `rgba(${144 + Math.random() * 111}, ${120 + Math.random() * 135}, 255, ${0.7 + Math.random() * 0.3})`,
  1198. 'border-radius': '50%',
  1199. 'transform': `translate(-50%, -50%)`,
  1200. 'z-index': '7',
  1201. 'opacity': '0',
  1202. 'transition': `all ${0.5 + Math.random() * 0.5}s cubic-bezier(0.1, 0.9, 0.2, 1)`
  1203. });
  1204. $('.crystal-container').append(particle);
  1205. // Анимируем частицу
  1206. setTimeout(() => {
  1207. particle.css({
  1208. 'transform': `translate(calc(-50% + ${x}px), calc(-50% + ${y}px))`,
  1209. 'opacity': '1'
  1210. });
  1211. setTimeout(() => {
  1212. particle.css({
  1213. 'opacity': '0'
  1214. });
  1215. setTimeout(() => {
  1216. particle.remove();
  1217. }, 500);
  1218. }, 300 + Math.random() * 200);
  1219. }, Math.random() * 100);
  1220. }
  1221. }
  1222. // Запускаем создание вспышек энергии
  1223. setTimeout(createEnergyBurst, 2000);
  1224. {%endif%}
  1225. });
  1226. </script>
  1227. <!-- CSRF Protection Script -->
  1228. <script src="{{template}}/assets/js/csrf.js"></script>
  1229. </body>
  1230. </html>
/home/arcana_web/web/arcana-mace.pro/public_html/vendor/twig/twig/src/Environment.php (строка 382)
Twig\Environment->compileSource()
/home/arcana_web/web/arcana-mace.pro/public_html/vendor/twig/twig/src/Environment.php (строка 344)
Twig\Environment->loadTemplate()
/home/arcana_web/web/arcana-mace.pro/public_html/src/template/tpl.php (строка 2686)
Twig\Environment->load()
/home/arcana_web/web/arcana-mace.pro/public_html/src/route/route_registry.php (строка 47)
Ofey\Logan22\template\tpl::display()
[Внутренняя функция]
{closure}()
/home/arcana_web/web/arcana-mace.pro/public_html/vendor/bramus/router/src/Bramus/Router/Router.php (строка 430)
call_user_func_array()
/home/arcana_web/web/arcana-mace.pro/public_html/vendor/bramus/router/src/Bramus/Router/Router.php (строка 416)
Bramus\Router\Router->invoke()
/home/arcana_web/web/arcana-mace.pro/public_html/vendor/bramus/router/src/Bramus/Router/Router.php (строка 280)
Bramus\Router\Router->handle()
/home/arcana_web/web/arcana-mace.pro/public_html/src/route/route_registry.php (строка 123)
Bramus\Router\Router->run()
/home/arcana_web/web/arcana-mace.pro/public_html/index.php (строка 11)
require('/home/arcana_web/web/arcana-ma...')

Переменные доступные в шаблоне:

__route__ (string)
"/signup"
dir (string)
""
protocol (string)
"https"
path (string)
""
template (string)
"/src/template/sphere/"
pointTime (string)
"0.18"

Возможные решения

Проверьте синтаксис и логику шаблона.
Убедитесь, что все переменные и функции определены и доступны.
Проверьте, не используются ли устаревшие методы или функции.