feat(pos): улучшить адаптивность POS-терминала для мобильных устройств

- col-md-8/4 → col-12 col-md-8/4 для корректного отображения на мобильных
- Кнопки действий: height: 60px → min-height: 44px (минимальный размер для тапа)
- Модальные окна: добавлен modal-fullscreen-sm-down/md-down
- Колонки внутри модалок: добавлен col-12 для мобильной адаптивности
- Увеличена мелкая кнопка отмены скидки: 32px → 40px
- CSS: добавлены медиа-запросы для мобильных устройств
  * min-height: 44px для полей ввода и кнопок
  * font-size: 16px предотвращает зум на iOS
  * Оптимизация отступов в модалках
  * UX улучшения для тач-устройств
  * Плавная прокрутка на iOS
- Исправлено перекрытие товаров корзиной на мобильных (position: absolute → relative)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-16 19:21:05 +03:00
parent c8284a6ac5
commit 18cca326af
2 changed files with 122 additions and 21 deletions

View File

@@ -85,8 +85,8 @@ body {
.cart-item .btn-link {
font-size: 1.5rem;
line-height: 1;
width: 28px;
height: 28px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
@@ -257,8 +257,36 @@ body {
@media (max-width: 767.98px) {
.right-panel-fixed {
position: relative;
width: 100%;
left: 0;
top: auto;
right: auto;
bottom: auto;
left: auto;
padding: 0.75rem;
padding-right: 0.75rem;
z-index: auto;
}
/* На мобильных меняем layout контейнера */
.pos-container {
overflow-y: auto;
height: auto;
padding: 0.75rem;
}
/* Убираем fixed высоту из основного контейнера на мобильных */
.pos-main-container {
position: relative;
top: auto;
bottom: auto;
overflow-y: auto;
}
/* Левая колонка (товары) не должна быть flex */
.col-12.col-md-8[style*="flex-direction: column"] {
display: block !important;
height: auto !important;
}
}
@@ -423,3 +451,76 @@ body {
background-color: #f8d7da;
color: #721c24;
}
/* ============================================================
АДАПТИВНОСТЬ ДЛЯ МОБИЛЬНЫХ УСТРОЙСТВ
============================================================ */
/* Увеличение размера элементов управления на мобильных */
@media (max-width: 767.98px) {
/* Поля ввода - минимальный размер для тапа */
.form-control,
.form-select {
min-height: 44px;
font-size: 16px; /* Предотвращает зум на iOS при фокусе */
}
/* Кнопки - минимальный размер для тапа */
.btn {
min-height: 44px;
}
}
/* На десктопе возвращаем фиксированную высоту для кнопок действий */
@media (min-width: 768px) {
.action-buttons-panel .btn {
height: 60px;
}
}
/* Оптимизация модалок на мобильных */
@media (max-width: 767.98px) {
/* Уменьшаем отступы в модалках */
.modal-body {
padding: 1rem 0.75rem;
}
.modal-footer {
padding: 0.75rem;
}
/* Прокручиваемые списки */
#tempKitItemsList,
#unitSelectionList {
max-height: 150px !important;
}
}
/* Улучшение UX для тач-устройств */
@media (hover: none) and (pointer: coarse) {
/* Убираем hover-эффекты */
.product-card:hover,
.category-card:hover,
.unit-selection-card:hover {
transform: none;
}
/* Добавляем эффект нажатия */
.product-card:active,
.category-card:active,
.unit-selection-card:active {
transform: scale(0.98);
transition: transform 0.1s;
}
/* Подсветка при тапе */
.btn,
.cart-item .btn-link {
-webkit-tap-highlight-color: rgba(13, 110, 253, 0.2);
}
}
/* Плавная прокрутка на iOS */
.products-scrollable {
-webkit-overflow-scrolling: touch;
}

View File

@@ -16,7 +16,7 @@
<div class="pos-container">
<div class="row g-3" style="height: 100%;">
<!-- Products Grid (Left side - 8/12) -->
<div class="col-md-8" style="display: flex; flex-direction: column; height: 100%;">
<div class="col-12 col-md-8" style="display: flex; flex-direction: column; height: 100%;">
<!-- Search Box -->
<div class="mb-3">
<div class="input-group">
@@ -39,7 +39,7 @@
</div>
<!-- Right Panel (4/12) - Fixed -->
<div class="col-md-4">
<div class="col-12 col-md-4">
<div class="right-panel-fixed d-flex flex-column">
<!-- Информация о складе (всегда показываем блок для фиксированной позиции) -->
<div class="card mb-2">
@@ -98,22 +98,22 @@
<div class="card-body p-2">
<div class="row g-2">
<div class="col-4">
<button class="btn btn-outline-warning rounded-3 w-100" id="addToShowcaseBtn" style="height: 60px;">
<button class="btn btn-outline-warning rounded-3 w-100" id="addToShowcaseBtn" style="min-height: 44px;">
<i class="bi bi-flower1"></i><br>На витрину
</button>
</div>
<div class="col-4">
<button class="btn btn-outline-primary rounded-3 w-100" id="scheduleLater" style="height: 60px;">
<button class="btn btn-outline-primary rounded-3 w-100" id="scheduleLater" style="min-height: 44px;">
<i class="bi bi-calendar2"></i><br>Отложенный заказ
</button>
</div>
<div class="col-4">
<button class="btn btn-outline-secondary rounded-3 w-100" id="clearCart" style="height: 60px;">
<button class="btn btn-outline-secondary rounded-3 w-100" id="clearCart" style="min-height: 44px;">
<i class="bi bi-trash"></i><br>Очистить
</button>
</div>
<div class="col-4 offset-4">
<button class="btn btn-success rounded-3 w-100" id="checkoutNow" style="height: 60px;">
<button class="btn btn-success rounded-3 w-100" id="checkoutNow" style="min-height: 44px;">
<i class="bi bi-check2-circle"></i><br>Продать
</button>
</div>
@@ -128,7 +128,7 @@
<!-- Modal: Создание временного комплекта на витрину -->
<div class="modal fade" id="createTempKitModal" tabindex="-1" aria-labelledby="createTempKitModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-dialog modal-xl modal-fullscreen-sm-down">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="createTempKitModalLabel">
@@ -139,7 +139,7 @@
<div class="modal-body">
<div class="row">
<!-- Левая колонка: основные поля -->
<div class="col-md-6">
<div class="col-12 col-md-6">
<!-- Название комплекта -->
<div class="mb-3">
<label for="tempKitName" class="form-label">Название комплекта *</label>
@@ -181,7 +181,7 @@
</div>
<!-- Правая колонка: цены и состав -->
<div class="col-md-6">
<div class="col-12 col-md-6">
<!-- Список товаров в корзине -->
<div class="mb-3">
<label class="form-label">Товары в комплекте</label>
@@ -282,7 +282,7 @@
<!-- Модалка: Продажа -->
<div class="modal fade" id="checkoutModal" tabindex="-1" aria-labelledby="checkoutModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl" style="max-width: 85vw;">
<div class="modal-dialog modal-dialog-centered modal-xl modal-fullscreen-md-down" style="max-width: 85vw;">
<div class="modal-content">
<div class="modal-header py-2">
<h5 class="modal-title" id="checkoutModalLabel">
@@ -293,7 +293,7 @@
<div class="modal-body py-2">
<div class="row g-3">
<!-- Левая колонка: состав заказа -->
<div class="col-md-5">
<div class="col-12 col-md-5">
<!-- Информация о клиенте и баланс в одной строке -->
<div class="row g-2 mb-2">
<div class="col-auto">
@@ -333,7 +333,7 @@
</div>
<!-- Правая колонка: оплата -->
<div class="col-md-7">
<div class="col-12 col-md-7">
<div class="card mb-0">
<div class="card-header bg-light py-2">
<strong class="small">Оплата</strong>
@@ -357,7 +357,7 @@
<strong>Автоматически:</strong>
<div id="autoDiscountsList"></div>
</div>
<button type="button" class="btn btn-sm btn-link text-danger p-1 ms-2" id="skipAutoDiscountBtn" style="display: none; width: 32px; height: 32px;" title="Отменить скидку">
<button type="button" class="btn btn-sm btn-link text-danger p-1 ms-2" id="skipAutoDiscountBtn" style="display: none; min-width: 40px; min-height: 40px;" title="Отменить скидку">
<i class="bi bi-x-lg fs-5"></i>
</button>
</div>
@@ -475,7 +475,7 @@
<!-- Модалка: Выбор склада -->
<div class="modal fade" id="selectWarehouseModal" tabindex="-1" aria-labelledby="selectWarehouseModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-dialog modal-fullscreen-sm-down">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="selectWarehouseModalLabel">
@@ -511,7 +511,7 @@
<!-- Модалка: Выбор клиента -->
<div class="modal fade" id="selectCustomerModal" tabindex="-1" aria-labelledby="selectCustomerModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-dialog modal-fullscreen-sm-down">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="selectCustomerModalLabel">
@@ -544,7 +544,7 @@
<!-- Модалка: Создание нового клиента -->
<div class="modal fade" id="createCustomerModal" tabindex="-1" aria-labelledby="createCustomerModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-dialog modal-fullscreen-sm-down">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="createCustomerModalLabel">
@@ -593,7 +593,7 @@
<div class="modal-body">
<div class="row">
<!-- Левая колонка: список единиц продажи -->
<div class="col-md-6">
<div class="col-12 col-md-6">
<label class="form-label fw-semibold">Выберите единицу продажи</label>
<div id="unitSelectionList" class="d-flex flex-column gap-2" style="max-height: 400px; overflow-y: auto;">
<!-- Заполняется через JavaScript -->
@@ -601,7 +601,7 @@
</div>
<!-- Правая колонка: параметры -->
<div class="col-md-6">
<div class="col-12 col-md-6">
<div class="card">
<div class="card-header bg-light">
<strong>Параметры добавления</strong>