@php $container = $zone->get('container', 'fixed'); // Зона внутри ряда своего «стакана» не имеет: ширину ей задаёт колонка, // а собственный контейнер сузил бы её второй раз и оторвал от соседей. // Зона карточки — тот же случай: она стоит внутри зоны содержимого, // «стакан» вокруг неё уже есть. Но зазоры между блоками ей нужны: // галерея и колонка покупки не должны слипаться. $container = ($inRow ?? false) ? 'in-row' : (($inCard ?? false) ? 'card' : $container); /* * Фон зоны: цвет и картинка со своими настройками. * * Собирается отдельно от остальных стилей, потому что уезжает либо * на саму зону (во всю ширину), либо на её «стакан» — по настройке * «фон только по ширине содержимого». */ $background = collect([ $zone->get('bg_color') ? 'background-color: '.$zone->get('bg_color') : null, $bgImage ?? null ? 'background-image: url('.($bgImage ?? '').')' : null, ($bgImage ?? null) ? 'background-position: '.($zone->get('bg_position') ?: 'center') : null, ($bgImage ?? null) ? 'background-size: '.($zone->get('bg_size') ?: 'cover') : null, ($bgImage ?? null) ? 'background-repeat: '.($zone->get('bg_repeat') ?: 'no-repeat') : null, // «Не прокручивать вместе со страницей» — это background-attachment, // и параллакс из легаси делается им же: отдельного скрипта не нужно. ($bgImage ?? null) && ($zone->get('bg_fixed') || $zone->get('bg_parallax')) ? 'background-attachment: fixed' : null, ])->filter()->implode('; '); $boxed = (bool) $zone->get('bg_boxed'); /* * ⚠️ Внутренние отступы уезжают туда же, куда и фон. * * Оставь их на зоне при фоне «по стакану» — и над содержимым останется * непрокрашенная полоса высотой ровно в отступ: фон лежит на стакане, * а отступ снаружи него. Со стороны это выглядит как пустота над шапкой, * которую владелец не задавал. */ $padding = collect([ $zone->get('padding_top') !== null ? 'padding-top: '.(int) $zone->get('padding_top').'px' : null, $zone->get('padding_bottom') !== null ? 'padding-bottom: '.(int) $zone->get('padding_bottom').'px' : null, ])->filter()->implode('; '); $zoneStyles = collect([ '--kz-cols: '.$zone->columns, '--kz-gx: '.$zone->gutterX().'px', '--kz-gy: '.$zone->gutterY().'px', $zone->get('container_width') ? '--kz-container: '.(int) $zone->get('container_width').'px' : null, // Цвета текста, ссылок, кнопок и значков. Одним списком на зону и блок, // чтобы правила у них не разошлись. ...\Korzilla\Core\Layout\ColorStyles::of($zone), $zone->get('min_height') ? 'min-height: '.(int) $zone->get('min_height').'px' : null, $zone->get('fixed_height') ? 'height: '.(int) $zone->get('fixed_height').'px' : null, $boxed ? null : $padding, $zone->get('margin_top') !== null ? 'margin-top: '.(int) $zone->get('margin_top').'px' : null, $zone->get('margin_bottom') !== null ? 'margin-bottom: '.(int) $zone->get('margin_bottom').'px' : null, $boxed ? null : $background, ])->filter()->implode('; '); $innerStyles = $boxed ? collect([$background, $padding])->filter()->implode('; ') : ''; $tag = $zone->get('is_header') ? 'header' : ($zone->get('is_footer') ? 'footer' : 'section'); @endphp {{-- Как и у блока: `id` есть, но он идентификатор строки. Для стилей — ключ зоны в классе (`kz-zone--header`) или своё поле «CSS-классы». --}} <{{ $tag }} id="kz-zone-{{ $zone->id }}" class="kz-zone kz-zone--{{ $container }} kz-zone--{{ $zone->key }} {{ $zone->get('fix_on_scroll') ? 'kz-zone--fixed-top' : '' }} {{ $zone->get('css_classes') }}" style="{{ $zoneStyles }}" data-kz-zone="{{ $zone->id }}">