Мета роботи

Опанувати принципи семантичної та адаптивної верстки сучасних елементів вебформ за допомогою Tailwind CSS. Вивчити механізми клієнтської валідації введення даних за допомогою регулярних виразів (RegEx) та JavaScript. Навчитися проектувати логіку обробки помилок та інтерактивних UX/UI станів (включаючи кастомні модальні вікна) в синергії з ШІ-інструментами генерації коду й компонентів.

Перші вебформи були примітивними сірими полями з браузера Netscape Navigator, а будь-яка валідація відбувалася виключно на стороні сервера. Користувач заповнював гігантську анкету, натискав «Надіслати», сторінка повністю перезавантажувалася через повільний Dial-up модем, і якщо в електронній пошті бракувало символу @, сервер повертав порожню сторінку з помилкою. Весь контент доводилося заповнювати заново. Це був жахливий користувацький досвід.

На сьогодні вебформи — це критично важливий інтерактивний вузол будь-якого продукту. Це міст між відвідувачем і бізнесом, головний інструмент збору потенційних клієнтів (лідів) та конверсії. Сучасна форма має бути:

  1. Семантичною. Використовувати правильні теги <form>, <input>, <label>, <button>, <select>.
  2. Адаптивною. Зручною для натискання пальцем на екрані смартфона і для введення з клавіатури комп’ютера.
  3. Інтерактивною в реальному часі. Попереджати про помилки в момент введення, а не після надсилання.

Стек інструментів для роботи

  • Редактор коду Visual Studio Code з плагінами Tailwind CSS IntelliSense та Inline Fold.
  • ШІ-асистенти генерації коду ChatGPT, Claude або локальні плагіни Codeium/GitHub Copilot.
  • Контроль версій та хостинг коду: Git, GitHub.
  • Хмарна платформа деплою: Vercel (vercel.com).

Вебформи

Сучасна вебформа — це не просто набір візуальних рамок для введення тексту, а складний інтерактивний вузол, який безпосередньо впливає на конверсію веб-ресурсу та його індексацію пошуковими роботами. З погляду сучасних стандартів консорціуму W3C, правильна верстка форми базується на двох фундаментальних стовпах: семантичній чіткості та загальній доступності.

Зв'язок елементів <label> та <input>

Кожен інтерактивний елемент форми (<input>, <select>, <textarea>) обов’язково повинен мати свій текстовий супровід, реалізований за допомогою тегу <label>. Використання звичайних тегів <div>, <span> або атрибуту placeholder замість повноцінного label є грубою технологічною помилкою.

Зв'язок між підписом та полем введення реалізується двома способами:

  1. Явний зв'язок (через атрибут for). Атрибут for в тезі <label> повинен повністю збігатися з атрибутом id відповідного інпуту.
  2. <label for="user-email" class="block text-sm font-medium text-gray-700">Електронна пошта</label>
    <input type="email" id="user-email" name="email" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm">
  3. Неявний зв'язок (вкладеність). Інпут розміщується безпосередньо всередині тегу <label>. В такому разі атрибути id та for не є обов'язковими, проте перший спосіб вважається більш гнучким для стилізації за допомогою Tailwind CSS.

Цей зв’язок є критично важливим через наступні фактори

  • Доступність (Accessibility/a11y). Спеціальне програмне забезпечення — скрінрідери, якими користуються люди з порушеннями зору, — повністю орієнтується на семантичні зв'язки. Коли фокус припадає на поле введення, диктор зачитує текст з прив'язаного </label>. Якщо зв'язку немає, користувач почує лише фразу "поле введення, порожньо", що робить заповнення форми неможливим.
  • Користувацький досвід (User Experience, UX). При правильному зв'язку клік мишкою або тач пальцем по тексту </label> автоматично переносить фокус (курсор) у відповідне поле введення. Це значно збільшує площу клікабельної зони, що особливо важливо для дрібних елементів — чекбоксів (checkbox) та радіокнопок (radio).
Мобільна оптимізація та семантичні типи даних

В сучасній веброзробці понад 50-70% трафіку припадає на мобільні пристрої. Атрибут type в тезі <input> виконує роль інструкції для операційних систем (iOS, Android), яка вказує, який саме тип екранної клавіатури потрібно викликати для максимальної зручності користувача.

  • type="email" При фокусі на такому полі операційна система активує оптимізовану розкладку клавіатури. На головну панель мобільного екрана відразу виносяться символи «@» (собачка) та «.» (крапка). Користувачеві не потрібно перемикатися в режим символів чи цифр, щоб ввести адресу своєї пошти, що зменшує кількість рутинних дій і прискорює заповнення форми. На додачу, браузер автоматично застосовує базову перевірку на наявність знака @ в рядку перед надсиланням.
  • type="tel" Замість стандартної клавіатури з літерами цей атрибут змушує смартфон відкрити виключно цифрову панель (Numpad), таку як в додатку для здійснення телефонних дзвінків. Великі цифрові клавіші мінімізують ризик помилкового натискання на маленькому екрані. Оскільки структура телефонних номерів в різних країнах відрізняється, цей тип не має жорсткої вбудованої валідації в браузері, тому його завжди комбінують з клієнтськими JS-скриптами (наприклад, масками введення) та регулярними виразами.
  • Інші важливі типи для оптимізації UX
    • type="number" — викликає цифрову клавіатуру з можливістю крок-зміни (стрілочки вгору/вниз), ідеально для кількості товарів чи віку.
    • type="url" — додає на мобільну клавіатуру швидкі клавіші формати доменів типу .com, .ua чи /.

В процесі проектування взаємодії користувача з веб-ресурсом етап введення даних є найбільш критичним. Користувачі можуть припускатися одруків, вводити дані в невірному форматі або навмисно намагатися надіслати шкідливий код. Процес перевірки цих даних на відповідність встановленим бізнес-правилам та технічним вимогам називається валідацією.

Для забезпечення максимальної стабільності та безпеки веб-додатків архітектура перевірки даних завжди будується на основі концепції «двох ліній оборони».

  1. Клієнтська валідація (Client-side Validation). Ця лінія реалізується безпосередньо в браузері користувача на стороні фронтенду. Вона базується на декларативних методах HTML5 (атрибути required, type, minlength, pattern) та імперативній логіці мови JavaScript.
    • Головною метою є забезпечення бездоганного UX (User Experience). Клієнтська валідація надає користувачеві миттєвий відгук. Інтерфейс реагує на помилку в момент її виникнення (наприклад, підсвічує поле червоним кольором або блокує кнопку надсилання), не змушуючи чекати відповіді від сервера. Це економить час клієнта та зменшує навантаження на мережу.
  2. Серверна валідація (Server-side Validation). Ця лінія спрацьовує на бекенді (Node.js, PHP, Python тощо) після того, як форма була офіційно надіслана.
    • Головною метою є забезпечення абсолютної безпеки. Клієнтську валідацію ніколи не можна вважати надійною захисною мірою, оскільки будь-який користувач з базовими технічними навичками може відкрити панель розробника (DevTools), видалити атрибути required з HTML-тегів або повністю заблокувати виконання JavaScript-файлів в браузері. Серверна валідація є обов'язковою, оскільки вона гарантує, що в базу даних потраплять лише очищені та валідні матеріали.
Регулярні вирази як інструмент гнучкого аналізу даних

Для перевірки простих параметрів (наприклад, чи не є поле порожнім) достатньо базових умов. Проте, для перевірки складних текстових структур — таких як адреси електронної пошти, номери телефонів з врахуванням міжнародних кодів, або складність паролів — використовуються Регулярні вирази (Regular Expressions/RegEx).

RegEx — це спеціалізована мова опису текстових шаблонів за допомогою метасимволів. Вона надає фронтенд-інженеру можливість виконати посимвольний аналіз рядка та визначити, чи відповідає він строгій масці.

Глибокий розбір шаблону валідації Email

Розглянемо класичний регулярний вираз для перевірки електронної пошти:

/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/

Кожен елемент цього виразу виконує строгу логічну функцію:

  • / ... / (Слеші). Обмежувачі, які вказують інтерпретатору JavaScript, що всередині них записано саме регулярний вираз, а не звичайний текстовий рядок.
  • ^ (Карет). Метасимвол, який фіксує початок рядка. Він гарантує, що перевірка шаблону почнеться з найпершого введеного символу, і перед адресою пошти не буде стороннього тексту чи пробілів.
  • [a-zA-Z0-9._%+-] (Символьний клас). Визначає діапазон дозволених символів для локальної частини email (до знака @). В цьому випадку дозволено: малі літери (a-z), великі літери (A-Z), цифри (0-9), а також крапку, підкреслення, відсоток, плюс та дефіс.
  • + (Квантифікатор). Означає «один або більше разів». Він вимагає, щоб перед знаком «собачки» стояв принаймні один дозволений символ з попереднього класу.
  • @ (Літерал). Пряме співпадіння. Рядок обов'язково повинен містити рівно один символ знака ат («собачку») саме в цій позиції.
  • [a-zA-Z0-9.-]+. Другий символьний клас з квантифікатором. Визначає правила для імені домену (наприклад, gmail, ukr, lnu). Дозволяє літери, цифри, дефіси та крапки.
  • \. (Екранована крапка). Оскільки символьна крапка . в мові RegEx є метасимволом, що означає «будь-який одиночний символ», для пошуку звичайної граматичної крапки її необхідно екранувати за допомогою зворотного слешу \. Вона відокремлює назву домену від доменної зони (наприклад, крапка перед com чи ua).
  • [a-zA-Z]{2,}. Визначає правила для TLD (Top-Level Domain — доменної зони). Тут дозволені виключно літери (від 2 до більше символів, наприклад: .ua, .com, .tech).
  • $ (Знак долара). Метасимвол, який фіксує кінець рядка. Він блокує можливість дописування будь-яких зайвих символів після завершення правильної доменної зони.

Класичний приклад регулярного виразу (RegEx) для валідації адреси електронної пошти, який найчастіше використовується у фронтенд-розробці:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

Цей скрипт перевіряє введений текст і повертає true, якщо пошта валідна, або false, якщо користувач припустився помилки:

JavaScript

function validateEmail(email) {
    const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    return emailRegex.test(email);
}

// Тестування різних варіантів:
console.log(validateEmail("developer.2026@domain.com")); // true (Валідно)
console.log(validateEmail("user@ukr.net"));              // true (Валідно)
console.log(validateEmail("wrong-email@com"));           // false (Немає крапки та доменної зони)
console.log(validateEmail("plainaddress"));              // false (Відсутній символ @)

Покроковий розбір шаблону

  • ^ (Початок рядка). Гарантує, що перевірка починається з першого символу і перед поштою немає зайвих пробілів чи тексту.
  • [a-zA-Z0-9._%+-]+ (Локальна частина). Дозволяє використовувати в імені пошти (до знака @) великі й малі латинські літери, цифри, а також спецсимволи: крапку, підкреслення, відсоток, плюс і дефіс. Знак + означає, що має бути принаймні один такий символ.
  • @ (Символ ат). Обов'язкова наявність рівно однієї «собачки» на своєму місці.
  • [a-zA-Z0-9.-]+ (Доменне ім'я). Дозволяє літери, цифри, дефіси та крапки для назви поштового сервера (наприклад, gmail, ukr).
  • \. (Екранована крапка). Оскільки крапка в RegEx означає «будь-який символ», екрануємо її зворотним слешем \, щоб знайти звичайну крапку перед доменною зоною.
  • [a-zA-Z]{2,} (Доменна зона). Вимагає, щоб наприкінці йшли лише літери (мінімум дві), наприклад: .ua, .com, .org, .tech.
  • $ (Кінець рядка). Фіксує кінець перевірки, щоб після доменної зони ніхто не міг дописати сторонні символи.

В сучасній інженерії інтерфейсів парадигма написання коду зазнала докорінних змін. Епоха ручного написання складних регулярних виразів та монолітних JS-валідаторів офіційно завершилася.

Сьогодні розробники використовують робочі процеси, що керовані штучним інтелектом (AI-driven workflows). ШІ-асистенти не просто заміняють пошук в переповненні стека — вони виступають в ролі інтелектуальних помічників для програмування.

Ручний аналіз та написання RegEx відходять в минуле. Синтаксис регулярних виразів є абстрактним, низькорівневим і «нечитабельним» з першого погляду. Достатньо пропустити один зворотний слеш (\), переплутати круглі дужки з квадратними або забути про квантифікатор, як вся логіка валідації зламається. Це призводить до двох критичних проблем:

  1. Висока ймовірність помилок. Складні вирази часто пропускають обробку винятків (edge cases) — наприклад, адреси з рідкісними доменними зонами (.technology) або специфічні внутрішні коди операторів зв'язку.
  2. Складність підтримки. Код, написаний іншим розробником вручну, важко читати. Через пів року розібратися в чужому RegEx-виразі без детальних коментарів стає справжнім випробуванням для команди.

Сучасний підхід полягає в тому, що розробник делегує генерацію рутинного коду до ШІ, фокусуючи свою увагу на архітектурі, тестуванні та користувацькому досвіді.

Методологія взаємодії з ШІ. Рольове моделювання та заземлення контексту

Щоб ШІ-асистент (ChatGPT, Claude, Codeium) видав не просто робочий, а оптимізований, безпечний і чистий код, який відповідає стандартам індустрії, необхідно застосовувати дві фундаментальні техніки промпт-інжинірингу:

  1. Рольове моделювання (Role-based Prompting). Замість банального запиту «напиши код перевірки форми», потрібно явно задати ШІ професійну роль — наприклад, Senior Frontend Engineer або UI/UX Tech Lead. Це змушує модель активувати найкращі світові практики: чистий код, дотримання принципів SOLID/DRY, оптимізацію швидкодії та детальне коментування.
  2. Заземлення контексту (Context Grounding). ШІ має чітко розуміти межі бізнес-логіки та локальні обмеження проєкту. Потрібно передати моделі точні вхідні параметри, технологічний стек (наприклад, Tailwind CSS + Vanilla JS) та регіональні особливості.
Практичний приклад проектування логіки з обробкою винятків

При роботі з українським цифровим простором ключовим завданням є сувора валідація номера телефону. Замість абстрактного шаблону, ШІ отримує чітке технічне завдання:

  • Локальний контекст. Номер має строго відповідати українському стандарту +380XXXXXXXXX.
  • Обробка винятків (Edge cases). Скрипт повинен не просто перевіряти форму в кінці, а динамічно покращувати UX. Наприклад, миттєво блокувати введення будь-яких літер або спецсимволів безпосередньо в процесі набору (подія input), автоматично підставляти префікс +380, якщо користувач починає писати з «0», та обмежувати максимальну довжину поля, щоб запобігти копіюванню зайвих цифр.

В результаті такої синергії розробник отримує надійний, адаптований під реальний ринок скрипт за лічені секунди, залишаючи за собою роль головного архітектора та контролера якості.

Покроковий хід виконання роботи

Етап 1. Підготовка середовища та структури проєкту
  1. В робочому просторі VS Code створити окрему директорію для лабораторної роботи.
  2. Наповнити базову структуру файлів:
    • index.html — головна сторінка форми.
    • assets/css/styles.css — для підключення Tailwind CSS (або використовуйте офіційний CDN/Vite для швидкого старту).
    • assets/js/validation.js — файл, де буде зосереджено всю інтерактивну логіку.
  3. Ініціалізувати локальний Git-репозиторій: git init.
Етап 2. Семантична верстка форми (HTML5 + Tailwind CSS)

Форма має бути повністю адаптивною та містити семантичні теги.

  1. Використовувати тег <form id="feedbackForm" novalidate> (атрибут novalidate вимикає стандартну браузерну валідацію, щоб повністю контролювати UX через JavaScript).
  2. Додати поля введення:
    • Ім'я (<input type="text" id="username">)
    • Email (<input type="email" id="email">)
    • Телефон (<input type="tel" id="phone" placeholder="+380...">)
    • Повідомлення (<textarea id="message">)
  3. Під кожним полем додати тег для виведення помилки, наприклад: <span id="phoneError" class="text-xs text-red-500 hidden"></span>.
  4. Для стилізації використовувати класи Tailwind CSS: гнучкі контейнери (flex, grid), адаптивні брейкпоінти (md:grid-cols-2), закруглені кути (rounded-lg) та плавні переходи для інтерактивних елементів (transition duration-300).
Етап 3. Створення модального вікна успішного надсилання листа
  1. Всередині index.html (поза тегом <form>) створити контейнер для модального вікна (<div id="successModal" class="fixed inset-0 bg-black/50 hidden items-center justify-center">...</div>).
  2. Додати всередину текст «Дякуємо! Ваше повідомлення успішно надіслано» та кнопку «Закрити».
Етап 4. ШІ-генерація регулярних виразів та логіки валідації
  1. Активувати розширення Codeium у VS Code або відкрити ChatGPT.
  2. Поставити задачу ШІ згенерувати скрипт клієнтської валідації. Скрипт має відстежувати подію submit форми, блокувати стандартне перезавантаження сторінки (e.preventDefault()), очищати попередні помилки та запускати перевірку.
  3. Шаблон системного промпту для ШІ
  4. *"Дій як Senior Frontend Developer. Мені потрібно написати скрипт валідації на ванільному JavaScript для форми зворотного зв'язку. Вимоги до валідації:
    1.	Поле ПІБ: обов'язкове, не менше 3 символів.
    2.	Поле Email: суворий регулярний вираз (RegEx) для перевірки електронної пошти.
    3.	Поле Телефон: регулярний вираз для маски українського номера телефону, що починається обов'язково з +380 і містить разом 13 символів (+380XXXXXXXXX).
    4.	Чекбокс згоди має бути відмічений. Якщо дані невалідні, скрипт повинен прибирати клас hidden у відповідного блоку помилки під цим полем та додавати червону рамку border-red-500 на сам input. Якщо все валідно — покажи красиве модальне вікно успіху, очисти поля форми. Напиши чистий та прокоментований код JavaScript."*
    
  5. 3. Перенести згенерований код в файл assets/js/validation.js (або в тег <script> перед закриваючим </body>) та підключити його. Протестувати введення некоректних даних локально.
Етапи реалізації інтерактивної логіки в JavaScript ( validation.js )

Для того, щоб форма працювала бездоганно, JavaScript має виконати 4 фундаментальні завдання: відстежувати події введення, перевіряти дані за допомогою регулярних виразів (RegEx), візуалізувати помилки через класи Tailwind CSS та показувати модальне вікно успішного надсилання.

Детальний розбір реалізації логіки з прикладами коду.

Потрібно чітко визначити правила валідації відповідно до критеріїв оцінювання:

  • Ім'я: не пусте, мінімум 2 символи.
  • Email: стандартна структура електронної пошти.
  • Телефон: обов'язковий український формат, що починається з +380 і містить рівно 9 цифр після коду країни (разом 12 цифр після знака +).
JavaScript
// Константи з регулярними виразами
const REGEX_EMAIL = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// Перевірка формату +380 та наступних 9 цифр (наприклад, +380501234567)
const REGEX_PHONE = /^\+380\d{9}$/;

Замість написання громіздкого коду, логіка розділяється на мікро-функції. Кожне поле перевіряється окремо. Якщо є помилка — додається червона рамка (border-red-500), показується текст помилки. Якщо все добре — рамка стає зеленою (border-green-500).

JavaScript
// Допоміжна функція для відображення помилки
function showErr(inputElement, errorElement, message) {
    inputElement.classList.remove('border-green-500', 'border-gray-300');
    inputElement.classList.add('border-red-500'); // Червона рамка
    errorElement.textContent = message;
    errorElement.classList.remove('hidden'); // Показуємо текст під полем
}
// Допоміжна функція для успішного стану поля
function showSuccess(inputElement, errorElement) {
    inputElement.classList.remove('border-red-500', 'border-gray-300');
    inputElement.classList.add('border-green-500'); // Зелена рамка
    errorElement.classList.add('hidden'); // Ховаємо помилку
    errorElement.textContent = '';
}
// Функція валідації імені
function validateName() {
    const nameInput = document.getElementById('username');
    const nameError = document.getElementById('nameError');
    if (nameInput.value.trim().length < 2) {
        showErr(nameInput, nameError, "Ім'я повинно містити не менше 2 символів.");
        return false;
    }
    showSuccess(nameInput, nameError);
    return true;
}

// Функція валідації Email
function validateEmail() {
    const emailInput = document.getElementById('email');
    const emailError = document.getElementById('emailError');
    if (!REGEX_EMAIL.test(emailInput.value.trim())) {
        showErr(emailInput, emailError, "Введіть коректну електронну адресу (наприклад: user@mail.com).");
        return false;
    }
    showSuccess(emailInput, emailError);
    return true;
}

// Функція валідації телефону
function validatePhone() {
    const phoneInput = document.getElementById('phone');
    const phoneError = document.getElementById('phoneError');
    // Очищаємо пробіли для точної перевірки
    const phoneValue = phoneInput.value.trim();
    
    if (!REGEX_PHONE.test(phoneValue)) {
        showErr(phoneInput, phoneError, "Формат має бути строго українським: +380XXXXXXXXX.");
        return false;
    }
    showSuccess(phoneInput, phoneError);
    return true;
}

Користувачі дратуються, якщо бачать помилки ще до того, як закінчили писати. Тому найкраща практика — запускати перевірку під час події input (коли користувач надсилає текст) або blur (коли фокус залишає поле).

JavaScript
document.addEventListener('DOMContentLoaded', () => {
    const nameInput = document.getElementById('username');
    const emailInput = document.getElementById('email');
    const phoneInput = document.getElementById('phone');

    // Навішуємо слухачі подій для динамічного очищення помилок
    nameInput.addEventListener('input', validateName);
    emailInput.addEventListener('input', validateEmail);
    phoneInput.addEventListener('input', validatePhone);
});

Коли користувач натискає кнопку «Надіслати», подію перехоплюється через e.preventDefault(), проводиться фінальна тотальна перевірка всіх полів, і якщо хоча б одне поле є невірним — блокується надсилання. Якщо все правильно — імітується успішне надсилання і відкривається модальне вікно.

JavaScript
const form = document.getElementById('feedbackForm');
const successModal = document.getElementById('successModal');
const closeModalBtn = document.getElementById('closeModalBtn');

form.addEventListener('submit', (e) => {
    e.preventDefault(); // Запобігаємо перезавантаженню сторінки

    // Запускаємо перевірку всіх полів одночасно
    const isNameValid = validateName();
    const isEmailValid = validateEmail();
    const isPhoneValid = validatePhone();

    // Якщо хоча б одне поле заповнене невірно — перериваємо виконання
    if (!isNameValid || !isEmailValid || !isPhoneValid) {
        return;
    }

    // Імітація успішного відправлення даних на сервер
    // Показуємо модальне вікно успіху
    successModal.classList.remove('hidden');
    successModal.classList.add('flex'); // Стан відображення у Tailwind

    // Очищуємо форму
    form.reset();
    
    // Скидаємо стилі зелених рамок до початкових
    document.querySelectorAll('input').forEach(input => {
        input.classList.remove('border-green-500');
        input.classList.add('border-gray-300');
    });
});

// Закриття модального вікна
closeModalBtn.addEventListener('click', () => {
    successModal.classList.remove('flex');
    successModal.classList.add('hidden');
});

Приклад сторінки з формою (відкрити в новому вікні)

Прикладом є готова адаптивна сторінка, яка повністю відповідає вимогам Лабораторної роботи №9

В коді реалізовано:

  • Сучасний адаптивний інтерфейс за допомогою семантичних тегів HTML5 та фреймворку Tailwind CSS (ідеально масштабується від мобільних екранів до великих моніторів).
  • Надійна клієнтська валідацію на чистому JavaScript з використанням регулярних виразів (RegEx):
    • Перевірка ПІБ (тільки літери та пробіли, від 2 символів).
    • Сувора перевірка українського формату номера телефону (+380... та рівно 9 цифр після коду країни).
    • Валідація структури email-адреси.
    • Перевірка довжини текстового повідомлення (мінімум 10 символів).
    • Обов'язкова згода з політикою конфіденційності.
  • Естетичний UI/UX при обробці помилок:
    • Інтерактивна підсвітка полів в реальному часі (зелена рамка — успішно, червона — помилка).
    • Динамічне відображення текстових підказок з помилками під кожним полем.
    • Блокування надсилання форми, якщо хоча б одне поле заповнене невірно.
  • Інтерактивне модальне вікно успіху (Modal Success Window), яке плавно з'являється після успішного надсилання, блокує інтерфейс та надає можливість очистити й закрити форму одним кліком.

Згідно з алгоритмом реалізовано:

  1. Адаптивний HTML5 каркас. Сторінка використовує сучасні семантичні теги (<header>, <main>, <form>, <textarea>, <footer>, <select>), що є критичним для SEO та оцінки верстки.
  2. Tailwind CSS верстка. Забезпечено преміальний вигляд з використанням тіней (shadow-xl), закруглень (rounded-2xl) та градієнтів, що динамічно адаптується під мобільні екрани (за допомогою класів grid-cols-1 md:grid-cols-12 та sm:, lg: префіксів).
  3. Надійний RegEx-двигун:
    • fullName. Перевіряє наявність щонайменше двох слів (ПІБ) та відсутність сторонніх знаків чи цифр.
    • phone. Жорстко фіксує обов'язковий початок з українського коду країни +380 та вимагає введення рівно 9 цифр після нього. Впроваджено захист від видалення префіксу та блокування вводу некоректних символів (літер) в полі телефону в реальному часі.
    • email. Перевіряє класичну структуру за стандартом RFC.
  4. UX/UI помилок та успіху:
    • Поля миттєво підсвічуються зеленим при правильному введенні та червоним з виведенням тексту помилки при некоректному введенні.
    • Успішна валідація викликає модальне вікно з красивим розмиттям фону (backdrop-blur-sm), де виводяться валідовані дані клієнта. При закриванні модального вікна форма повністю та безпечно очищується.
Етап 5. Фіксація змін в Git та синхронізація з GitHub
  1. Переконатися, що форма працює без помилок в консолі розробника (F12).
  2. Відкрити вбудований термінал VS Code та перевірити статус репозиторію:
    • git status
  3. Додати створені та оновлені файли до індексу:
    • git add .
  4. Створити комміт з фіксацією нового функціоналу за правилами інженерної культури розробки:
    • git commit -m "feat: додано форму зворотного зв'язку з ШІ-валідацією та модальним вікном"
  5. Надіслати оновлений код у віддалений репозиторій на GitHub:
    • git push origin main
Етап 6. Автоматичний деплой (публікація) сайту у Vercel через GitHub
  1. Перейти на сайт Vercel. Зареєструватися або авторизуватися через свій профіль GitHub (натиснути Continue with GitHub). Це автоматично пов'яже ваші хмарні кабінети.
  2. На головній панелі Vercel (Dashboard) натиснути кнопку Add New... -> Project.
  3. В списку Import Git Repository буде перелік ваших репозиторіїв з GitHub. Знайти репозиторій вашого лендингу (який оновилено на Етапі 3) та натиснути кнопку Import.
  4. У вікні налаштувань проєкту (Configure Project):
    • Поле Project Name можна залишити без змін або дати зрозумілу назву.
    • Framework Preset залишити Other (оскільки це є статичний HTML/CSS/JS сайт).
    • Root Directory залишити за замовченням (./).
  5. Натиснути кнопку Deploy.
  6. Зачекати 20–40 секунд, поки хмарні сервери Vercel збирають ваш проєкт. Після завершення з’явиться святкова анімація конфетті та мініатюра вашого сайту.
  7. Натиснути на прев'ю сайту або кнопку Continue to Dashboard, щоб отримати постійне живе посилання в інтернеті (воно матиме вигляд https://назва-проєкту.vercel.app).
  8. Перевірка CI/CD пайплайну. Зробити будь-яку дрібну текстову зміну в коді сайту через VS Code, виконати git add ., git commit -m "fix: дрібні виправлення контенту" та git push origin main.
  9. Перейти на вкладку Deployments у Vercel — переконатися, що платформа автоматично помітила пуш і сама оновила сайт в інтернеті без жодних додаткових дій.

Зміст звіту та технічні фінальні артефакти

В результаті виконання роботи студент формує та завантажує на диск (у власну папку) звіт в форматі PDF.

  1. Титульний лист з назвою лабораторної роботи, даними студента та обраною бізнес-тематикою.
  2. Посилання на публічний репозиторій проєкту на GitHub.
  3. Посилання на живий та адаптивний лендинг, розгорнутий у Vercel.
  4. Скріншот панелі керування проєкту з особистого кабінету Vercel.
  5. Повний лістинг JavaScript-коду валідації форми, згенерованого за допомогою ШІ.
  6. Згенерований та доопрацьований JavaScript-код валідації (validation.js), обов'язково з коментарями, як працюють регулярні вирази.
  7. Скриншоти форми в двох станах
    • З активованими помилками валідації (на мобільному та десктопному екранах).
    • З відкритим модальним вікном після успішного заповнення.
  8. Промпт-паспорт (Prompt Log). Точні скріншоти або тексти промптів, які надсилано ШІ на етапі створення форми, модального вікна та JS-файлу.

Критерії оцінювання лабораторної роботи

  • Якість верстки та адаптивність форми. Коректне використання семантичних тегів форми, ідеальне відображення інтерфейсу як на десктопних моніторах, так і на екранах смартфонів.
  • Складність та надійність ШІ-валідації. Коректна робота регулярних виразів. Обов'язкова перевірка українського формату номера телефона (+380...) та структури email. Форма не повинна надсилатися, якщо хоча б одне поле заповнене невірно.
  • Естетика UI/UX при обробці помилок. Візуалізація помилок (червоні рамки, підписи під полями). Наявність модального вікна, що повідомляє про успіх, та автоматичне очищення полів після валідації.
  • Робота з контролем версій Git. Наявність чітко структурованого коміту фіксації форми зворотного зв'язку в історії репозиторію на GitHub.
  • Розгортання на Vercel та налаштування CI/CD. Працююче посилання на домені .vercel.app. Успішна демонстрація автоматичного оновлення сайту при пуші коду в репозиторій.

Контрольні запитання

  1. Навіщо використовувати тег <label> з атрибутом for, якщо можна просто написати назву поля в звичайному <div> або скористатися плейсхолдером?
  2. Чому для поля введення номера телефону варто вказувати саме type="tel", а не type="text" або type="number"?
  3. Яка головна різниця між клієнтською (Client-side) та серверною (Server-side) валідацією? Чи можна обійтися тільки клієнтською?
  4. Що в регулярному виразі означають метасимволи ^ (карет) та $ (долар)? Що станеться, якщо їх забрати з виразу для валідації телефону?
  5. Як в регулярному виразі знайти звичайну граматичну крапку . і чому перед нею ставлять зворотний слеш \?
  6. Яку роль в регулярному виразі має квантифікатор +?
  7. Чому для обробки надсилання форми в JavaScript використовують метод event.preventDefault()?
  8. Як за допомогою Tailwind CSS реалізувати ефект, коли модальне вікно перекриває весь контент сайту і користувач не може клікнути на елементи під ним?
  9. В JS-скрипті модальне вікно закривається при кліку на затемнений оверлей (фон). Як ви запобігли тому, щоб вікно закривалося при кліку всередині самої білої картки з текстом?
  10. Навіщо при успішній валідації викликати метод form.reset() перед показом модального вікна?
  11. Які потенційні проблеми та винятки (edge cases) можуть виникнути, якщо згенерувати регулярний вираз для валідації імені за допомогою ШІ без чітких інструкцій?
  12. В чому небезпека сліпого копіювання коду валідації форми, згенерованого ШІ-інструментами v0.dev або ChatGPT?

Глосарій термінів. Адаптивні форми зворотного зв'язку та клієнтська валідація

Рекомендовано для вивчення перед захистом Лабораторної роботи №9

  • Вебформа (<form>) — це спеціальний розділ HTML-документа, що містить інтерактивні елементи (поля введення, кнопки, списки) і призначений для збору та передачі даних від користувача на сервер.
  • Тег <label> — семантичний елемент HTML, який використовується для створення текстового підпису (мітки) до конкретного поля введення.
  • Атрибут for — спеціальний атрибут тегу <label>, значення якого має строго збігатися з атрибутом id пов'язаного поля введення (<input>). Забезпечує доступність та розширює клікабельну зону.
  • Атрибут type — ключовий параметр тегу <input>, який визначає характер даних, що очікуються (наприклад, text, email, tel, number), та безпосередньо впливає на тип викликаної мобільної клавіатури на смартфонах.
  • Плейсхолдер (placeholder) — атрибут поля введення, що задає короткий текст-підказку, який відображається всередині поля, доки користувач не почне вводити дані. Не заміняє собою тег <label>.
  • Доступність (Accessibility/a11y) — практика проєктування веб-ресурсів, яка робить їх придатними та зручними для використання всіма людьми, включаючи осіб з порушеннями здоров'я та особливими потребами.
  • Екранний диктор (Screen Reader/скрінрідер) — спеціальне допоміжне програмне забезпечення, яке зчитує вміст екрана (текст, структуру сайту, семантичні теги) і озвучує його для користувачів з порушеннями зору.

  • Валідація (Validation) — процес перевірки введених користувачем даних на відповідність встановленим технічним правилам, бізнес-вимогам та маскам безпеки.
  • Клієнтська валідація (Client-side) — перша лінія перевірки даних, яка відбувається безпосередньо в браузері користувача за допомогою мови JavaScript та атрибутів HTML5. Служить для покращення UX (миттєвий відгук інтерфейсу).
  • Серверна валідація (Server-side) — обов'язкова та критично важлива лінія перевірки даних, що виконується на стороні бекенду (сервера) після надсилання форми. Відповідає за безпеку системи, оскільки клієнтську валідацію зловмисник може вимкнути.
  • Регулярні вирази (Regular Expressions, RegEx) — формальна мова пошуку та маніпуляцій з підрядками в тексті, що заснована на використанні метасимволів (шаблонів/масок).
  • Метасимвол (Metacharacter) — символ в мові RegEx, який має спеціальне керуюче значення замість свого звичайного граматичного змісту (наприклад, ^ — початок рядка, $ — кінець рядка, . — будь-який символ).
  • Екранування (Escaping) — використання зворотного слешу (\) перед метасимволом в RegEx, щоб нейтралізувати спеціальну функцію і шукати його як звичайний символ (наприклад, \. шукає звичайну крапку).
  • Квантифікатор (Quantifier) — спеціальний символ в регулярному виразі, який вказує, скільки разів має повторюватися попередній символ або група символів (наприклад, + — один або більше разів, {2,} — мінімум два рази).

  • Обробник події (Event Listener) — функція в JavaScript, яка перебуває в режимі очікування певної дії користувача (наприклад, click, submit, input) і виконує заданий блок коду в момент її виникнення.
  • Метод event.preventDefault() — команда JavaScript, яка скасовує стандартну поведінку браузера для поточної події. У вебформах використовується для зупинки негайного перезавантаження сторінки під час події submit.
  • Модальне вікно (Modal Pop-up) — елемент інтерфейсу (діалогове або інформаційне вікно), який з'являється поверх основного контенту сайту, блокуючи взаємодію з іншою частиною сторінки, доки користувач його не закриє.
  • Метод form.reset() — вбудована функція JavaScript, яка миттєво очищає всі поля форми, повертаючи їх до початкового (дефолтного) стану.
  • Властивість event.target — об'єкт JavaScript, який вказує на конкретний елемент DOM-дерева, на якому безпосередньо відбулася подія (наприклад, елемент, по якому користувач клікнув мишкою).

  • ШІ-робочий процес (AI-driven workflow) — сучасна методологія розробки програмного забезпечення, де написання, рефакторинг та оптимізація коду виконуються в синергії з інструментами штучного інтелекту.
  • Рольове моделювання (Role-based Prompting) — техніка промпт-інжинірингу, за якої ШІ-моделі на початку діалогу явно привласнюється певна професійна роль (наприклад, Senior Frontend Engineer), що змушує ШІ генерувати якісніший, структурованіший код відповідно до стандартів індустрії.
  • Заземлення контексту (Context Grounding) — процес передачі ШІ-моделі точних вхідних даних, специфічних технічних лімітів (наприклад, маска українського телефону +380) та технологічного стеку для запобігання абстрактним або недоречним відповідям (галюцинаціям).
  • Виняток (Edge Case) — специфічна або гранична ситуація у використанні програми (наприклад, введення літер в поле телефону чи використання рідкісного домену другого рівня в email), яка виходить за рамки стандартного сценарію і потребує окремої обробки в коді валідації.
  • Промпт-паспорт (Prompt Log) — структурована частина технічного звіту розробника, в якій фіксується історія діалогу з ШІ (промпти, відповіді, процес виправлення помилок) для аналізу та демонстрації свідомого керування нейромережею.

Застосовані інструменти