/** * iOS-style Search Component * * Поле поиска в стиле iOS с иконкой лупы и кнопкой очистки * Переиспользуемый компонент для различных страниц списков * * Использование: * * * HTML структура: * */ /* ===== CSS ПЕРЕМЕННЫЕ ДЛЯ ОТСТУПОВ ===== */ :root { --ios-search-padding-left: 36px; --ios-search-padding-right: 36px; --ios-search-icon-left: 10px; --ios-search-clear-right: 4px; } /* ===== Контейнер поиска ===== */ .ios-search { position: relative; width: 100%; max-width: 420px; } /* ===== Поле ввода ===== */ .ios-search-input { width: 100%; height: 40px; padding-left: var(--ios-search-padding-left); padding-right: var(--ios-search-padding-right); padding-top: var(--space-1); padding-bottom: var(--space-1); border-radius: 14px; border: 1px solid var(--bs-border-color); background: color-mix(in srgb, var(--bs-body-bg), #000 4%); font-size: 15px; outline: none; transition: box-shadow 0.2s ease, border-color 0.2s ease, background 0.2s ease; } /* Скрываем нативный крестик браузера у type="search" */ .ios-search-input::-webkit-search-cancel-button { display: none; -webkit-appearance: none; } .ios-search-input::-webkit-search-decoration { display: none; -webkit-appearance: none; } .ios-search-input::-ms-clear { display: none; } /* Тёмная тема */ [data-bs-theme="dark"] .ios-search-input { background: color-mix(in srgb, var(--bs-body-bg), #fff 6%); } /* Фокус */ .ios-search-input:focus { border-color: var(--bs-primary); box-shadow: 0 0 0 3px rgba(var(--bs-primary-rgb), 0.15); background: var(--bs-body-bg); } /* Placeholder */ .ios-search-input::placeholder { color: var(--bs-secondary-color); opacity: 0.6; } /* ===== Иконка поиска (лупа) ===== */ .ios-search > .bi-search { position: absolute; left: var(--ios-search-icon-left); top: 50%; transform: translateY(-50%); opacity: 0.55; pointer-events: none; font-size: 0.95rem; color: var(--bs-body-color); } /* ===== Кнопка очистки ===== */ .ios-search-clear { position: absolute; right: var(--ios-search-clear-right); top: 50%; transform: translateY(-50%); border: 0; background: transparent; padding: var(--space-1); display: none; cursor: pointer; border-radius: 50%; transition: background 0.2s ease; } .ios-search-clear:hover { background: color-mix(in srgb, var(--bs-body-color), transparent 90%); } .ios-search-clear:active { background: color-mix(in srgb, var(--bs-body-color), transparent 85%); } .ios-search-clear .bi-x-lg { opacity: 0.6; font-size: 0.9rem; color: var(--bs-body-color); } /* Показываем кнопку очистки когда есть текст */ .ios-search-input:not(:placeholder-shown) ~ .ios-search-clear { display: block; } /* ===== Вариации размеров ===== */ /* Маленький размер */ .ios-search.sm .ios-search-input { height: 34px; font-size: 14px; padding-left: 32px; padding-right: 32px; padding-top: var(--space-1); padding-bottom: var(--space-1); border-radius: 12px; } .ios-search.sm > .bi-search { left: 8px; font-size: 0.85rem; } .ios-search.sm .ios-search-clear { right: 3px; padding: var(--space-1); } /* Большой размер */ .ios-search.lg .ios-search-input { height: 48px; font-size: 16px; padding-left: 42px; padding-right: 42px; padding-top: calc(var(--space-1) + var(--space-1)); padding-bottom: calc(var(--space-1) + var(--space-1)); border-radius: 16px; } .ios-search.lg > .bi-search { left: 12px; font-size: 1.1rem; } .ios-search.lg .ios-search-clear { right: 6px; padding: var(--space-1); } /* ===== Вариация: только иконка без кнопки очистки ===== */ .ios-search.icon-only .ios-search-input { padding-right: 12px; } .ios-search.icon-only .ios-search-clear { display: none !important; } /* ===== Адаптивность ===== */ @media (max-width: 576px) { .ios-search { max-width: 100%; } .ios-search-input { height: 38px; font-size: 14px; } }