Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

start dev #1

Open
wants to merge 60 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
0809050
start dev
restby Jul 3, 2024
f4c7f17
start dev header
restby Jul 3, 2024
8ba8249
header,add img,fonts,some settings files
restby Jul 3, 2024
5adbfa6
about,section-title,video,add some img
restby Jul 3, 2024
d83a922
start dev price
restby Jul 3, 2024
6322ee7
some edits,price-card,some fix
restby Jul 3, 2024
34ef29a
end dev price
restby Jul 4, 2024
ed7401c
some fix price
restby Jul 4, 2024
bf6b7b3
start PP edits
restby Jul 4, 2024
6aba389
many fixes
restby Jul 4, 2024
39b71cc
fix hero,games
restby Jul 4, 2024
a21c40a
fix PP, end games
restby Jul 4, 2024
615b192
start dev juri
restby Jul 4, 2024
827da94
end juri,some fixes
restby Jul 5, 2024
2589ec1
start dev features
restby Jul 5, 2024
899f3f2
dev features
restby Jul 5, 2024
b503a8f
end features
restby Jul 6, 2024
025dd5f
start dev offers
restby Jul 6, 2024
f1d6887
end offers, some fix btn,feature-card,feature,price-card-hero-juri
restby Jul 8, 2024
1878665
start dev faq
restby Jul 8, 2024
0b5aadc
faq,many PP fixes,colors edits
restby Jul 9, 2024
bceeabc
some fixes
restby Jul 10, 2024
1b0297d
end faq, PP fixes
restby Jul 10, 2024
5369d53
start reviews
restby Jul 10, 2024
0e1f680
end reviews,some fixes
restby Jul 10, 2024
7f3d481
start form
restby Jul 10, 2024
a884cb4
sove fixes
restby Jul 10, 2024
6de6e5f
test fixes
restby Jul 10, 2024
d2bbb2d
many fixes
restby Jul 11, 2024
b6d9416
fa-ing PP
restby Jul 13, 2024
e3489d3
near end
restby Jul 13, 2024
7cbf83b
page-footer, many fixes
restby Jul 15, 2024
9bd8ecc
some fix
restby Jul 15, 2024
c27638f
many fixes js
restby Jul 15, 2024
8390fb6
end fixes
restby Jul 16, 2024
f84f01a
test-fixes
restby Jul 16, 2024
28ce6e0
end form-validate
restby Jul 16, 2024
7f070e7
end
restby Jul 16, 2024
7133bb2
editorconfig fix
restby Jul 16, 2024
7a27d04
fix images,favicons
restby Jul 16, 2024
906b710
fonts preload
restby Jul 16, 2024
b8cce3d
snow
restby Jul 17, 2024
541bba7
editorconfig
restby Jul 17, 2024
18e27d9
good after all tests
restby Jul 17, 2024
e7c4e00
many fixes
restby Jul 17, 2024
e9d8520
all test fix
restby Jul 17, 2024
b34d981
fix bg-sizes
restby Jul 17, 2024
f6d06a6
fix images
restby Jul 17, 2024
30e9daa
fix image bg
restby Jul 17, 2024
ff6debd
interactive
restby Jul 17, 2024
eb48731
fix some criteria
restby Jul 17, 2024
217df11
end criterias
restby Jul 17, 2024
b490eac
lazy
restby Jul 17, 2024
0011aa9
all test, some fixes
restby Jul 18, 2024
914b17a
part 1
restby Jul 19, 2024
94ecee6
feature fix
restby Jul 19, 2024
4ac0e34
end all of test, end criteria
restby Jul 19, 2024
e8044ef
end all
restby Jul 20, 2024
4e5296a
fix favicon
restby Jul 24, 2024
be7129c
last
restby Aug 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
end all
  • Loading branch information
restby committed Jul 20, 2024
commit e8044ef035901ea5c53400522e5264f868e26c88
4 changes: 2 additions & 2 deletions source/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1166,12 +1166,12 @@ <h2 class="form__title section-title section-title--light">
<div class="form__inputs">
<div class="form__input">
<label class="visually-hidden" for="name">Имя</label>
<input type="text" id="name" name="name" placeholder="Имя" required>
<input type="text" id="name" name="name" placeholder="Имя" autocomplete="on" required>
<span class="form__error-text">Проверьте корректность заполнения поля</span>
</div>
<div class="form__input">
<label class="visually-hidden" for="phone">Телефон</label>
<input type="tel" id="phone" name="phone" placeholder="Телефон" required>
<input type="tel" id="phone" name="phone" placeholder="Телефон" autocomplete="on" required>
<span class="form__error-text">Проверьте корректность заполнения поля</span>
</div>
</div>
Expand Down
29 changes: 15 additions & 14 deletions source/js/modules/accordions/faq-accordion.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
export const initFaqAccordions = () => {
const buttons = document.querySelectorAll('[data-faq="accordion-button"]');
if (document.querySelectorAll('[data-faq="accordion-button"]')) {
const buttons = document.querySelectorAll('[data-faq="accordion-button"]');
buttons.forEach((button) => {
button.addEventListener('click', () => {
const content = button.nextElementSibling;
const isActive = button.classList.contains('is-active');

buttons.forEach((button) => {
button.addEventListener('click', () => {
const content = button.nextElementSibling;
const isActive = button.classList.contains('is-active');
if (isActive) {
content.style.maxHeight = 0;
} else {
content.style.maxHeight = `${content.scrollHeight}px`;
}

if (isActive) {
content.style.maxHeight = 0;
} else {
content.style.maxHeight = `${content.scrollHeight}px`;
}

button.classList.toggle('is-active');
content.classList.toggle('is-active');
button.classList.toggle('is-active');
content.classList.toggle('is-active');
});
});
});
}
};
5 changes: 1 addition & 4 deletions source/js/modules/tabs/init-faq-tabs.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,20 @@ const initFaqTabs = () => {
) {
const tabsControls = document.querySelectorAll('[data-faq="tabs-control"]');
const tabsElements = document.querySelectorAll('[data-faq="tabs-content"]');
// Обработчик события клика для вкладок

tabsControls.forEach((tabsControl) => {
tabsControl.addEventListener('click', (e) => {
e.preventDefault();
const activeTabId = e.target.getAttribute('data-tab');

// Убираем активный класс у всех вкладок, кроме текущей
tabsControls.forEach((otherTabControl) => {
if (otherTabControl !== tabsControl) {
otherTabControl.classList.remove('is-active');
}
});

// Добавляем активный класс текущей вкладке
tabsControl.classList.add('is-active');

// Показываем соответствующее содержимое вкладки
tabsElements.forEach((tabsElement) => {
const contentId = tabsElement.getAttribute('data-tab-content');
if (contentId === activeTabId) {
Expand Down
19 changes: 5 additions & 14 deletions source/js/modules/tabs/init-price-tabs.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,20 @@ const initPriceTabs = () => {
const tabsElements = document.querySelectorAll(
'[data-price="tabs-content"]',
);
// Обработчик события клика для вкладок

tabsControls.forEach((tabsControl) => {
tabsControl.addEventListener('click', (e) => {
e.preventDefault();
const activeTabId = e.target.getAttribute('data-tab');

// Убираем активный класс у всех вкладок, кроме текущей
tabsControls.forEach((otherTabControl) => {
if (otherTabControl !== tabsControl) {
otherTabControl.classList.remove('is-active');
}
});

// Добавляем активный класс текущей вкладке
tabsControl.classList.add('is-active');

// Показываем соответствующее содержимое вкладки
tabsElements.forEach((tabsElement) => {
const contentId = tabsElement.getAttribute('data-tab-content');
if (contentId === activeTabId) {
Expand All @@ -44,41 +41,35 @@ const setActivePriceCard = () => {
document.querySelector('[data-price="card"]') &&
document.querySelector('[data-price="card-btn"]')
) {
// Получаем все элементы с классом .price-card
const tabs = document.querySelectorAll('[data-price="card"]');

// Добавляем обработчик события для каждого элемента
tabs.forEach((tab) => {
// Добавляем обработчик события focus для кнопки .price-card__btn
const btn = tab.querySelector('[data-price="card-btn"]');
btn.addEventListener('focus', () => {
tab.classList.add('active');
});

// Добавляем обработчик события blur для кнопки .price-card__btn
btn.addEventListener('blur', () => {
tab.classList.remove('active');
});

tab.addEventListener('mouseenter', () => {
// Проверяем наличием класса .active у элемента и .active у кнопки
if (
!tab.classList.contains('active') &&
!btn.classList.contains('active')
) {
tab.classList.add('active'); // Добавляем класс .active при наведении
btn.classList.add('active'); // Добавляем класс .active при наведении
tab.classList.add('active');
btn.classList.add('active');
}
});

tab.addEventListener('mouseleave', () => {
// Проверяем наличием класса .active у элемента и .active у кнопки
if (
tab.classList.contains('active') &&
btn.classList.contains('active')
) {
tab.classList.remove('active'); // Удаляем класс .active при уходе курсора
btn.classList.remove('active'); // Удаляем класс .active при уходе курсора
tab.classList.remove('active');
btn.classList.remove('active');
}
});
});
Expand Down
40 changes: 18 additions & 22 deletions source/js/modules/utils/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,16 @@ const setActiveJuriSlideInfo = () => {
document.querySelector('.juri__inner') &&
document.querySelector('.juri-slide')
) {
// Получаем все элементы с классом .juri-slide
const slides = document.querySelectorAll('.juri-slide');

// Добавляем обработчик события для каждого элемента
slides.forEach((slide) => {
// Добавляем обработчик события focus для элемента
slide.addEventListener('focus', () => {
slides.forEach((slideItem) => {
slideItem.classList.remove('is-active');
});
slide.classList.add('is-active');
});

// Добавляем обработчик события blur для элемента
slide.addEventListener('blur', () => {
slide.classList.remove('is-active');
});
Expand All @@ -25,38 +21,38 @@ const setActiveJuriSlideInfo = () => {
slides.forEach((slideItem) => {
slideItem.classList.remove('is-active');
});
// Проверяем наличием класса .is-active у элемента
if (!slide.classList.contains('is-active')) {
slide.classList.add('is-active'); // Добавляем класс .is-active при наведении
slide.classList.add('is-active');
}
});

slide.addEventListener('mouseleave', () => {
// Проверяем наличием класса .is-active у элемента
if (slide.classList.contains('is-active')) {
slide.classList.remove('is-active'); // Удаляем класс .is-active при уходе курсора
slide.classList.remove('is-active');
}
});
});
}
};

const lazyLoadImages = () => {
const images = document.querySelectorAll('img');
const screenWidth = window.innerWidth;
if (document.querySelectorAll('img')) {
const images = document.querySelectorAll('img');
const screenWidth = window.innerWidth;

if (screenWidth < 768) {
images.forEach((img, index) => {
if (index !== 0 && index !== 2) {
img.setAttribute('loading', 'lazy');
}
});
} else {
images.forEach((img, index) => {
if (index !== 0 && index !== 1) {
img.setAttribute('loading', 'lazy');
}
});
if (screenWidth < 768) {
images.forEach((img, index) => {
if (index !== 0 && index !== 2) {
img.setAttribute('loading', 'lazy');
}
});
} else {
images.forEach((img, index) => {
if (index !== 0 && index !== 1) {
img.setAttribute('loading', 'lazy');
}
});
}
}
};

Expand Down
50 changes: 4 additions & 46 deletions source/js/modules/validate-form.js
Original file line number Diff line number Diff line change
@@ -1,126 +1,85 @@
// formValidation.js

// Функция для валидации формы
const validateForm = () => {
if (document.querySelector('form') && document.querySelector('input[type="text"]') && document.querySelector('input[type="tel"]')) {
// Находим форму на странице
const form = document.querySelector('form');
// Находим все инпуты внутри формы
const inputs = form.querySelectorAll('input');
const lettersOnlyRegex = /^[a-zA-Zа-яА-ЯёЁ\s]+$/;
const digitsOnlyRegex = /^\d+$/;

// Регулярные выражения для валидации
const lettersOnlyRegex = /^[a-zA-Zа-яА-ЯёЁ\s]+$/; // Допускает только буквы и пробелы (кириллица и латиница)
const digitsOnlyRegex = /^\d+$/; // Допускает только цифры

// Функция для отображения ошибок
const showError = (input, errorMessage) => {
// Получаем родительский элемент инпута
const parent = input.parentElement;
// Находим элемент для отображения сообщения об ошибке
const errorText = parent.querySelector('.form__error-text');

// Добавляем классы ошибки родительскому элементу и инпуту
parent.classList.add('error');
input.classList.add('error');
// Устанавливаем текст ошибки и отображаем его

errorText.textContent = errorMessage;
errorText.style.display = 'block';
};

// Функция для скрытия ошибок
const hideError = (input) => {
// Получаем родительский элемент инпута
const parent = input.parentElement;
// Находим элемент для отображения сообщения об ошибке
const errorText = parent.querySelector('.form__error-text');

// Удаляем классы ошибки у родительского элемента и инпута
parent.classList.remove('error');
input.classList.remove('error');
// Очищаем текст ошибки и скрываем его

errorText.textContent = '';
errorText.style.display = 'none';
};

// Функция для проверки валидности поля Имя
const validateName = (input) => {
// Получаем значение инпута и убираем лишние пробелы
const value = input.value.trim();

// Проверяем, если значение пустое
if (value === '') {
// Показываем сообщение об ошибке, если поле пустое
showError(input, 'Поле Имя обязательно для заполнения');
} else if (!lettersOnlyRegex.test(value)) {
// Показываем сообщение об ошибке, если в поле есть недопустимые символы
showError(input, 'Поле Имя может содержать только буквы и пробелы');
} else {
// Скрываем сообщение об ошибке, если всё в порядке
hideError(input);
}
};

// Функция для проверки валидности поля Телефон
const validatePhone = (input) => {
// Получаем значение инпута и убираем лишние пробелы
const value = input.value.trim();

// Проверяем, если значение пустое
if (value === '') {
// Показываем сообщение об ошибке, если поле пустое
showError(input, 'Поле Телефон обязательно для заполнения');
} else if (!digitsOnlyRegex.test(value)) {
// Показываем сообщение об ошибке, если в поле есть недопустимые символы
showError(input, 'Поле Телефон должно содержать только цифры');
} else {
// Скрываем сообщение об ошибке, если всё в порядке
hideError(input);
}
};

// Обработчик события отправки формы
form.addEventListener('submit', (event) => {
// Предотвращаем отправку формы по умолчанию
event.preventDefault();

// Проверяем каждое поле при отправке формы
inputs.forEach((input) => {
// Проверяем поле Имя
if (input.name === 'name') {
validateName(input);
// Проверяем поле Телефон
} else if (input.name === 'phone') {
validatePhone(input);
}
});

// Проверяем, если все поля валидны (не содержат классы ошибки)
const isValid = Array.from(inputs).every(
(input) => !input.classList.contains('error'),
);
if (isValid) {
// Если все поля валидны, отправляем форму
form.submit();
}
});

// Обработчики событий для удаления класса error при потере фокуса и пустом значении
inputs.forEach((input) => {
// Обработчик события потери фокуса
input.addEventListener('blur', () => {
// Если значение инпута пустое
if (input.value.trim() === '') {
// Удаляем класс ошибки у родительского элемента и инпута
input.parentElement.classList.remove('error');
input.classList.remove('error');
}
});

// Обработчик события ввода
input.addEventListener('input', () => {
// Если значение инпута пустое
if (input.value.trim() === '') {
// Удаляем класс ошибки у родительского элемента и инпута
input.parentElement.classList.remove('error');
input.classList.remove('error');
}
Expand All @@ -129,5 +88,4 @@ const validateForm = () => {
}
};

// Экспорт функции валидации формы, чтобы её можно было использовать в других модулях
export { validateForm };
1 change: 0 additions & 1 deletion source/sass/global/mixins.scss
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
/* stylelint-disable */
// Desktop first

@mixin vp-1366 {
@media (min-width: ($vp-1366)) {
Expand Down
23 changes: 0 additions & 23 deletions source/sass/global/reboot.scss
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,3 @@ picture {
font-size: 0;
line-height: 0;
}

input {
border-radius: 0;

&::placeholder {
opacity: 1;
}

&:invalid {
box-shadow: none;
}
}

input:matches([type="tel"],
[type="text"]) {
appearance: none;
}

button,
[type="button"],
[type="submit"] {
appearance: none;
}