templates/public/game_list.html.twig line 1

Open in your IDE?
  1. {% extends 'public/base.html.twig' %}
  2. {% block title %}openrpg.ru{% endblock %}
  3. {% block public_stylesheets %}
  4.     <link rel="stylesheet" href="{{ asset('data/game-list.css') }}">
  5. {% endblock %}
  6. {% block body %}
  7. <div id="tooltip" class="tooltip"></div>
  8. <!-- ⭐ Топ игр -->
  9. <section class="section">
  10.   <h2><i class="fa-solid fa-crown"></i> Топ приключений</h2>
  11.   <div class="cards">
  12.     <!-- Большая -->
  13.     {% if worlds|length > 0 %}
  14.     {% set world = worlds[0] %}
  15.     <div class="card-big" style="background-image:url('{{ world.background }}');" onclick="window.location.href='{{ path('public_world_view', {'id': world.id}) }}'">
  16.       <div class="card-gradient"></div>
  17.       <div class="card-info">
  18.         <h3>{{ world.name }}</h3>
  19.         <p>{{ world.description }}</p>
  20.         <div class="badges">
  21.           {% for badge in world.publicBadges %}
  22.             <div class="badge"><i class="fa-solid fa-tag"></i> {{ badge }}</div>
  23.           {% endfor %}
  24.         </div>
  25.       </div>
  26.     </div>
  27.     {% endif %}
  28.     <!-- Маленькие -->
  29.     {% if worlds|length > 1 %}
  30.     {% set world2 = worlds[1] %}
  31.     <div class="card-half" style="background-image:url('{{ world2.background }}');" onclick="window.location.href='{{ path('public_world_view', {'id': world2.id}) }}'">
  32.       <div class="card-gradient"></div>
  33.       <div class="card-info">
  34.         <h3>{{ world2.name }}</h3>
  35.         <p>{{ world2.description }}</p>
  36.         <div class="badges">
  37.           {% for badge in world2.publicBadges %}
  38.             <div class="badge"><i class="fa-solid fa-tag"></i> {{ badge }}</div>
  39.           {% endfor %}
  40.         </div>
  41.       </div>
  42.     </div>
  43.     {% endif %}
  44.     
  45.     {% if worlds|length > 2 %}
  46.     {% set world3 = worlds[2] %}
  47.     <div class="card-half" style="background-image:url('{{ world3.background }}');" onclick="window.location.href='{{ path('public_world_view', {'id': world3.id}) }}'">
  48.       <div class="card-gradient"></div>
  49.       <div class="card-info">
  50.         <h3>{{ world3.name }}</h3>
  51.         <p>{{ world3.description }}</p>
  52.         <div class="badges">
  53.           {% for badge in world3.publicBadges %}
  54.             <div class="badge"><i class="fa-solid fa-tag"></i> {{ badge }}</div>
  55.           {% endfor %}
  56.         </div>
  57.       </div>
  58.     </div>
  59.     {% endif %}
  60.   </div>
  61. </section>
  62. <!-- 👥 Сообщество -->
  63. <section class="section">
  64.   <h2><i class="fa-solid fa-users"></i> Игры сообщества</h2>
  65.   <div class="community-wrapper">
  66.     <div class="arrow arrow-left" onclick="scrollCommunity(-1)"><i class="fa-solid fa-chevron-left"></i></div>
  67.     <div class="community-list" id="communityList">
  68.       <script>
  69.       const commGames = [
  70.         ["Город шепотов", "Загадки улиц и опасные слухи."],
  71.         ["Пески отчаяния", "Путешествие через проклятую пустыню."],
  72.         ["Танец масок", "Бал, где каждый скрывает тайны."],
  73.         ["Дом у бездны", "Шёпоты в глубине старого дома."],
  74.         ["Охотники на звёзды", "Фэнтези с космическим оттенком."],
  75.         ["Кукольный театр", "Жуткие представления и живые куклы."],
  76.         ["Вкус грозы", "Город, где гроза меняет судьбы."],
  77.         ["Серп луны", "Культ, приносящий лунные жертвы."]
  78.       ];
  79.       document.write(commGames.map(g =>
  80.         `<div class="community-card">
  81.            <h4>${g[0]}</h4>
  82.            <p>${g[1]}</p>
  83.            <div class="badges">
  84.              <div class="badge"><i class="fa-solid fa-user-group"></i> Сообщество</div>
  85.              <div class="badge"><i class="fa-solid fa-star"></i> Популярное</div>
  86.            </div>
  87.          </div>`
  88.       ).join(""));
  89.       </script>
  90.     </div>
  91.     <div class="arrow arrow-right" onclick="scrollCommunity(1)"><i class="fa-solid fa-chevron-right"></i></div>
  92.   </div>
  93. </section>
  94. <!-- Остальные миры -->
  95. {% if worlds|length > 3 %}
  96. <section class="section">
  97.   <h2><i class="fa-solid fa-dice"></i> Ещё подборки</h2>
  98.   <div class="cards">
  99.     {% for world in worlds|slice(3) %}
  100.     <div class="card-half" style="background-image:url('{{ world.background }}');" onclick="window.location.href='{{ path('public_world_view', {'id': world.id}) }}'">
  101.       <div class="card-gradient"></div>
  102.       <div class="card-info">
  103.         <h3>{{ world.name }}</h3>
  104.         <p>{{ world.description }}</p>
  105.         <div class="badges">
  106.           {% for badge in world.publicBadges %}
  107.             <div class="badge"><i class="fa-solid fa-tag"></i> {{ badge }}</div>
  108.           {% endfor %}
  109.         </div>
  110.       </div>
  111.     </div>
  112.     {% endfor %}
  113.   </div>
  114. </section>
  115. {% endif %}
  116. <script>
  117. function scrollCommunity(dir) {
  118.   const list = document.getElementById("communityList");
  119.   list.scrollBy({ left: dir * (list.clientWidth * 0.7), behavior: 'smooth' });
  120. }
  121. </script>
  122. <script>
  123.   document.addEventListener('DOMContentLoaded', function() {
  124.     const logoElement = document.getElementById('logo');
  125.     const tooltipElement = document.getElementById('tooltip');
  126.     const tooltipMessage = "OpenRPG - это сервис для совместного прохождения ролевых игр, где истории написаны авторами, а ИИ служит их рассказчиком";
  127.     let tooltipTimeoutId;
  128.     
  129.     if (logoElement && tooltipElement) {
  130.       logoElement.addEventListener('mouseenter', () => {
  131.         tooltipTimeoutId = setTimeout(() => {
  132.           tooltipElement.textContent = tooltipMessage;
  133.           tooltipElement.style.display = 'block';
  134.           tooltipElement.style.opacity = '1';
  135.           
  136.           // Позиционирование подсказки строго под заголовком
  137.           const logoRect = logoElement.getBoundingClientRect();
  138.           tooltipElement.style.left = logoRect.left + 'px';
  139.           tooltipElement.style.top = (logoRect.bottom + 5) + 'px';
  140.         }, 500); // Задержка 500 мс
  141.       });
  142.       
  143.       logoElement.addEventListener('mouseleave', () => {
  144.         clearTimeout(tooltipTimeoutId);
  145.         tooltipElement.style.opacity = '0';
  146.         setTimeout(() => {
  147.           tooltipElement.style.display = 'none';
  148.         }, 300); // Длительность fade-out
  149.       });
  150.     }
  151.   });
  152. </script>
  153. {% endblock %}