app.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // Header Mobile Menu Toggle
  2. document.addEventListener("DOMContentLoaded", function() {
  3. const burger = document.querySelector(".header__burger");
  4. const nav = document.querySelector(".header__nav");
  5. const body = document.body;
  6. if (burger && nav) {
  7. burger.addEventListener("click", function() {
  8. // Toggle active classes
  9. burger.classList.toggle("active");
  10. nav.classList.toggle("active");
  11. body.classList.toggle("menu-open");
  12. });
  13. // Close menu when clicking on menu links
  14. const menuLinks = nav.querySelectorAll(".header__menu-link");
  15. menuLinks.forEach(link => {
  16. link.addEventListener("click", function() {
  17. burger.classList.remove("active");
  18. nav.classList.remove("active");
  19. body.classList.remove("menu-open");
  20. });
  21. });
  22. // Close menu on window resize if opened
  23. window.addEventListener("resize", function() {
  24. if (window.innerWidth > 768) {
  25. burger.classList.remove("active");
  26. nav.classList.remove("active");
  27. body.classList.remove("menu-open");
  28. }
  29. });
  30. }
  31. // Находим все таблицы внутри блока с классом text
  32. const tables = document.querySelectorAll('.text table');
  33. if(tables){
  34. tables.forEach(table => {
  35. // Проверяем, есть ли у таблицы класс no-table-wrapper
  36. if (!table.classList.contains('no-table-wrapper')) {
  37. // Создаем внешний wrapper для скролла
  38. const scrollWrapper = document.createElement('div');
  39. scrollWrapper.classList.add('table-wrapper-scroll');
  40. // Создаем внутренний wrapper для стилизации
  41. const wrapper = document.createElement('div');
  42. wrapper.classList.add('table-wrapper');
  43. // Оборачиваем таблицу
  44. table.parentNode.insertBefore(scrollWrapper, table);
  45. scrollWrapper.appendChild(wrapper);
  46. wrapper.appendChild(table);
  47. // Проверяем, есть ли у таблицы элемент caption
  48. if (table.querySelector('caption')) {
  49. // Если caption есть, добавляем к scrollWrapper класс 'has-caption'
  50. scrollWrapper.classList.add('has-caption');
  51. }
  52. // Получаем первую строку таблицы
  53. const firstRow = table.querySelector('tr');
  54. // Подсчитываем количество столбцов в первой строке
  55. const columnCount = firstRow ? firstRow.children.length : 0;
  56. // Если столбцов больше трех, добавляем класс 'large-table'
  57. if (columnCount > 3) {
  58. wrapper.classList.add('large-table');
  59. }
  60. }
  61. });
  62. }
  63. // FAQ Accordion
  64. const faqItems = document.querySelectorAll('.faq__item');
  65. if (faqItems) {
  66. faqItems.forEach(item => {
  67. const question = item.querySelector('.faq__question');
  68. const answer = item.querySelector('.faq__answer');
  69. if (question && answer) {
  70. question.addEventListener('click', function() {
  71. // Закрываем все остальные FAQ
  72. faqItems.forEach(otherItem => {
  73. if (otherItem !== item) {
  74. otherItem.classList.remove('active');
  75. const otherAnswer = otherItem.querySelector('.faq__answer');
  76. if (otherAnswer) {
  77. otherAnswer.style.maxHeight = null;
  78. }
  79. }
  80. });
  81. // Переключаем текущий FAQ
  82. item.classList.toggle('active');
  83. if (item.classList.contains('active')) {
  84. answer.style.maxHeight = answer.scrollHeight + 'px';
  85. } else {
  86. answer.style.maxHeight = null;
  87. }
  88. });
  89. }
  90. });
  91. }
  92. // Table of Contents toggle
  93. const toc = document.querySelector('.toc');
  94. const tocHeader = document.querySelector('.toc__header');
  95. const tocContent = document.querySelector('.toc__content');
  96. if (toc && tocHeader && tocContent) {
  97. tocHeader.addEventListener('click', function() {
  98. toc.classList.toggle('active');
  99. if (toc.classList.contains('active')) {
  100. tocContent.style.maxHeight = tocContent.scrollHeight + 'px';
  101. } else {
  102. tocContent.style.maxHeight = null;
  103. }
  104. });
  105. }
  106. // Table of Contents smooth scroll
  107. const tocLinks = document.querySelectorAll('.toc__link');
  108. if (tocLinks) {
  109. tocLinks.forEach(link => {
  110. link.addEventListener('click', function(e) {
  111. e.preventDefault();
  112. const targetId = this.getAttribute('href');
  113. const targetElement = document.querySelector(targetId);
  114. if (targetElement) {
  115. targetElement.scrollIntoView({
  116. behavior: 'smooth',
  117. block: 'start'
  118. });
  119. }
  120. });
  121. });
  122. }
  123. });