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