feat: update config general

This commit is contained in:
Abdel LAMRANI 2026-09-16 18:22:12 +02:00
parent ac7342da82
commit 453da276ef
18 changed files with 3310 additions and 513 deletions

View file

@ -2,7 +2,10 @@
namespace App\Http\Requests\Bo\GeneralConfigs;
use App\Enums\GeneralConfigType;
use App\Http\Requests\Bo\UpdateMiniCrudRequest;
use App\Rules\WysiwygLength;
class UpdateGeneralConfigRequest extends UpdateMiniCrudRequest
{
@ -12,4 +15,21 @@ class UpdateGeneralConfigRequest extends UpdateMiniCrudRequest
* @var string
*/
protected $modelName = 'general_config';
public function rules(): array
{
$rules = parent::rules();
if ($this->route('general_config')?->type === GeneralConfigType::engagement) {
foreach ([1, 2, 3, 4] as $i) {
$rules['data.engagement_' . $i . '_text.value'] = [
'required',
'string',
new WysiwygLength(10, 1300),
];
}
}
return $rules;
}
}

View file

@ -0,0 +1,39 @@
<?php
use App\Enums\GeneralConfigType;
use App\Models\GeneralConfig;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$bandeau = GeneralConfig::query()->where('type', GeneralConfigType::bandeau)->firstOrFail();
$data = json_decode(json_encode($bandeau->data), true);
$data['bandeau_image_subtitle']['validate'] = 'nullable|min:4|max:180';
$bandeau->data = $data;
$bandeau->saveQuietly();
}
/**
* Reverse the migrations.
*/
public function down(): void
{
$bandeau = GeneralConfig::query()->where('type', GeneralConfigType::bandeau)->firstOrFail();
$data = json_decode(json_encode($bandeau->data), true);
$data['bandeau_image_subtitle']['validate'] = 'required|min:4|max:255';
$bandeau->data = $data;
$bandeau->saveQuietly();
}
};

View file

@ -0,0 +1,38 @@
<?php
use App\Enums\GeneralConfigType;
use App\Models\GeneralConfig;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$demarche = GeneralConfig::query()->where('type', GeneralConfigType::demarche)->firstOrFail();
$data = json_decode(json_encode($demarche->data), true);
$data['demarche_pictures_subtitle']['validate'] = 'nullable|min:4|max:150';
$demarche->data = $data;
$demarche->saveQuietly();
}
/**
* Reverse the migrations.
*/
public function down(): void
{
$demarche = GeneralConfig::query()->where('type', GeneralConfigType::demarche)->firstOrFail();
$data = json_decode(json_encode($demarche->data), true);
$data['demarche_pictures_subtitle']['validate'] = 'required|min:4|max:150';
$demarche->data = $data;
$demarche->saveQuietly();
}
};

View file

@ -0,0 +1,195 @@
<?php
use App\Enums\GeneralConfigType;
use App\Enums\InputType;
use App\Models\GeneralConfig;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration
{
private array $backup = [
"engagement_5_text" => [
"label" => "Contenu 5",
"inputType" => ["label" => "text", "value" => 3],
"validate" => "string|min:10",
"value" =>
"<p>Nature d’Éleveurs, <strong>la santé des volailles</strong> préservée :<br>- L’hygiène et la sécurité sanitaire renforcées à toutes les étapes de la filière : protocoles de protection des élevages, tenues dédiées aux poulaillers, etc.<br>- L’encadrement de la santé par les vétérinaires,<br>- Des solutions naturelles sont développées comme alternatives aux antibiotiques, utilisés en dernier recours pour soigner les animaux.</p>",
],
"engagement_5_banner" => [
"label" => "Banniere 5",
"inputType" => ["label" => "Image", "value" => 1],
"dimensions" => ["width" => 1312, "height" => 639],
"alt" => "voluptatem sint et ea",
"value" =>
"storage/images/general_configs/f02fa939-26e0-4514-8179-ec29edbe25d5-eng-eleveur.jpg",
"validate" => "required",
],
"engagement_6_text" => [
"label" => "Contenu 6",
"inputType" => ["label" => "text", "value" => 3],
"validate" => "string|min:10",
"value" =>
"<p>Nature d’Éleveurs, le <strong>respect de la nature</strong> par une démarche de progrès :<br>- L’intégration paysagère des élevages (plantations d’arbres et de haies, etc.),<br>- La préservation des ressources (énergie, eau, carbone, etc.),<br>- Le recyclage des déchets.<br>Nature d’Éleveurs <strong>valorise les territoires</strong> et <strong>repose sur des filières locales</strong>.</p>",
],
"engagement_6_banner" => [
"label" => "Banniere 6",
"inputType" => ["label" => "Image", "value" => 1],
"dimensions" => ["width" => 1312, "height" => 414],
"alt" => "vel odio veritatis eligendi",
"value" =>
"storage/images/general_configs/26529e76-ec2d-4949-ad76-496944ce366b-eng-batiment.jpg",
"validate" => "required",
],
"engagement_7_text" => [
"label" => "Contenu 7",
"inputType" => ["label" => "text", "value" => 3],
"validate" => "string|min:10",
"value" =>
"<p>Nature d’Éleveurs, des <strong>filières de qualité, transparentes</strong> et <strong>contrôlées chaque année</strong>.<br>Des <strong>organismes indépendants</strong> garantissent, via 70 points de contrôle, le respect des engagements du cahier des charges auprès de <strong>chaque élevage</strong>.</p>",
],
"engagement_7_banner" => [
"label" => "Banniere 7",
"inputType" => ["label" => "Image", "value" => 1],
"dimensions" => ["width" => 1775, "height" => 560],
"alt" => "et ut illo ex",
"value" =>
"storage/images/general_configs/40f0301c-b18e-40d0-aff0-5fbc76d88023-eng-stylo.jpg",
"validate" => "required",
],
"engagement_8_text" => [
"label" => "Contenu 8",
"inputType" => ["label" => "text", "value" => 3],
"validate" => "string|min:10",
"value" =>
"<p>Nature d’Éleveurs, une démarche qui <strong>fédère les filières</strong> et <strong>accompagne les éleveurs</strong> :<br>- Au niveau technique : comme c’est le cas dans tous les élevages, et conformément à la réglementation, des formations au bien-être animal, à la sécurité sanitaire, à la conduite d’élevage, …<br>- Au niveau économique : des prix sécurisés par des contrats, des primes qualité, des aides aux investissements…</p>",
],
"engagement_8_banner" => [
"label" => "Banniere 8",
"inputType" => ["label" => "Image", "value" => 1],
"dimensions" => ["width" => 1775, "height" => 865],
"alt" => "est sed est quis",
"value" =>
"storage/images/general_configs/fc5fb1b7-63a1-46ef-a6d4-ad1f141d17aa-eng-groupe-volaille.jpg",
"validate" => "required",
],
];
private array $reordered = [
'engagement_title' => [
'label' => 'Titre bandeau',
'inputType' => ['label' => 'string', 'value' => 2],
'value' => 'NOS ENGAGEMENTS VOLAILLE',
'validate' => 'required|min:4|max:100',
],
'engagement_subtitle' => [
'label' => 'Sous-titre bandeau',
'inputType' => ['label' => 'string', 'value' => 2],
'value' => 'EN 8 POINTS CLÉS',
'validate' => 'required|min:4|max:100',
],
];
/**
* Run the migrations.
*/
public function up(): void
{
$engagement = GeneralConfig::query()->where('type', GeneralConfigType::engagement)->firstOrFail();
$data = json_decode(json_encode($engagement->data), true);
for ($i = 5; $i <= 8; $i++) {
unset($data['engagement_' . $i . '_text']);
unset($data['engagement_' . $i . '_banner']);
}
foreach ([1, 2, 3, 4] as $i) {
unset($data['engagement_' . $i . '_2_banner']);
$logo = [
'label' => "Logo engagement n°$i",
'inputType' => [
"label" => InputType::image->label(),
"value" => InputType::image->value(),
],
'dimensions' => [
'width' => 150,
'height' => 140
],
'alt' => "",
'title' => "",
'value' => null,
'required' => true,
'validate' => 'required',
];
$title = [
'label' => 'Titre engagement n°' . $i,
'inputType' => [
'label' => InputType::string->label(),
'value' => InputType::string->value(),
],
'value' => '',
'validate' => 'required|min:4|max:80',
];
$subtitle = [
'label' => 'Sous titre engagement n°' . $i,
'inputType' => [
'label' => InputType::string->label(),
'value' => InputType::string->value(),
],
'value' => '',
'validate' => 'nullable|min:4|max:120',
];
// change dimension for banner
$data['engagement_' . $i . '_banner']['dimensions'] = [
'width' => 885,
'height' => 300,
];
if (isset($data['engagement_' . $i . '_2_banner'])) {
$data['engagement_' . $i . '_2_banner']['dimensions'] = [
'width' => 885,
'height' => 300,
];
}
$this->reordered['engagement_' . $i . '_banner'] = $data['engagement_' . $i . '_banner'];
if (isset($data['engagement_' . $i . '_2_banner'])) {
$this->reordered['engagement_' . $i . '_2_banner'] = $data['engagement_' . $i . '_2_banner'];
}
$this->reordered['engagement_' . $i . '_logo'] = $logo;
$this->reordered['engagement_' . $i . '_banner'] = $data['engagement_' . $i . '_banner'];
$this->reordered['engagement_' . $i . '_title'] = $title;
$this->reordered['engagement_' . $i . '_subtitle'] = $subtitle;
$this->reordered['engagement_' . $i . '_text'] = $data['engagement_' . $i . '_text'];
}
$engagement->data = $this->reordered;
$engagement->saveQuietly();
}
/**
* Reverse the migrations.
*/
public function down(): void
{
$engagement = GeneralConfig::query()->where('type', GeneralConfigType::engagement)->firstOrFail();
$data = json_decode(json_encode($engagement->data), true);
for ($i = 1; $i <= 4; $i++) {
unset($data['engagement_' . $i . '_logo']);
unset($data['engagement_' . $i . '_title']);
unset($data['engagement_' . $i . '_subtitle']);
}
$data = array_merge($data, $this->backup);
$engagement->data = $data;
$engagement->saveQuietly();
}
};

2743
package-lock.json generated

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 54 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 861 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -1,142 +0,0 @@
$bea-blue: #2e267b;
$bea-red: #e60f1d;
$bea-red-hover: #c80510;
.bea-banner {
background-color: $bea-blue;
font-family: Poppins, sans-serif;
&__intro {
font-size: 0.75rem;
letter-spacing: 0.025em;
@media (width >= 576px) {
font-size: 0.875rem;
}
}
&__title {
font-size: 1.25rem;
@media (width >= 576px) {
font-size: 1.5rem;
}
@media (width >= 992px) {
font-size: 1.85rem;
}
}
&__desc {
max-width: 38rem;
font-size: 0.875rem;
@media (width >= 576px) {
font-size: 1rem;
}
@media (width >= 992px) {
font-size: 1.1rem;
}
}
&__logo {
width: 9rem;
filter: drop-shadow(0 4px 3px rgb(0 0 0 / 7%));
@media (width >= 576px) {
width: 11rem;
}
@media (width >= 992px) {
width: 12.5rem;
}
}
&__heart {
position: absolute;
top: -1.2rem;
right: -3rem;
width: 2.25rem;
height: 2.25rem;
transform: rotate(15deg);
@media (width >= 992px) {
top: -1.5rem;
right: -3.5rem;
width: 2.75rem;
height: 2.75rem;
}
}
&__heart-mobile {
width: 3rem;
height: 3rem;
transform: rotate(15deg);
}
&__ldc-mobile {
width: 9rem;
}
&__ldc-desktop {
position: relative;
top: 1rem;
width: 9.5rem;
@media (width >= 992px) {
width: 10.5rem;
}
}
&__cta {
padding: 0.75rem 1.75rem;
border-color: $bea-red;
background-color: $bea-red;
font-size: 0.875rem;
transition: all 0.2s ease-in-out;
&:hover {
border-color: $bea-red-hover;
background-color: $bea-red-hover;
}
&:active {
transform: scale(0.95);
}
@media (width >= 576px) {
font-size: 1rem;
}
}
&__cta-icon {
width: 1rem;
height: 1rem;
@media (width >= 576px) {
width: 1.25rem;
height: 1.25rem;
}
}
&__sun {
z-index: 1;
right: 1rem;
bottom: -2rem;
width: 6rem;
transform: rotate(26deg);
@media (width >= 576px) {
right: 2rem;
bottom: -3rem;
width: 9rem;
}
@media (width >= 992px) {
right: 2rem;
bottom: -4.5rem;
width: 13rem;
}
}
}

View file

@ -12,7 +12,6 @@
// * BASE
@import "./base/common";
@import './base/fonts';
@import './base/bea_banner';
// * PARTIALS
@import './partials/global';

View file

@ -11,7 +11,6 @@
}
#demarche ul li {
max-width: 10rem;
flex-direction: column;
align-items: center;
justify-content: flex-end;

View file

@ -1,104 +1,53 @@
#engagements .general {
align-items: center;
justify-content: space-between;
}
#engagements {
.engagement-icon {
width: 10rem;
height: 10rem;
flex-shrink: 0;
object-fit: cover;
}
#engagements .number {
flex-direction: row;
align-items: flex-start;
justify-content: flex-end;
}
.engagement-image-col {
width: 100%;
}
/* stylelint-disable-next-line selector-no-qualifying-type */
#engagements div.supertitle {
display: flex;
width: 4rem;
height: 4rem;
flex-direction: row;
align-items: center;
justify-content: center;
border-radius: 100%;
background-color: var(--yellow);
}
.engagement-image {
width: 100%;
height: 100%;
object-fit: cover;
}
#engagements .desc {
flex-direction: column;
align-items: flex-start;
justify-content: center;
}
.flag {
position: relative;
width: 100%;
}
#engagements .icon {
width: 20rem;
max-width: 20rem;
height: auto;
max-height: 15rem;
justify-content: flex-end;
}
.flag::after {
position: absolute;
top: 0;
right: 0;
width: 14rem;
height: 1rem;
background-image: url("@/images/eng_drapeau.svg");
background-position: center;
background-repeat: no-repeat;
background-size: contain;
content: "";
}
#engagements .flag {
position: relative;
width: 100%;
}
#engagements .flag::after {
position: absolute;
top: 0;
right: 0;
width: 14rem;
height: 1rem;
background-image: url("@/images/eng_drapeau.svg");
background-position: center;
background-repeat: no-repeat;
background-size: contain;
content: "";
}
#engagements .imgs img {
width: 100%;
}
@media (width <= 767px) {
#engagements ul {
margin: 0;
}
#engagements {
.flag {
padding-bottom: 2rem;
}
#navigation ul li {
margin-bottom: 3rem;
.flag::after {
top: auto;
right: 0;
bottom: 0;
width: 100%;
height: 0.5rem;
}
}
#engagements .general {
margin: 1rem;
}
#engagements .general,
#engagements .general div:first-child {
flex-direction: column;
}
#engagements .number {
align-items: center;
justify-content: center;
}
#engagements .number span {
margin: 0 0 1rem;
font-size: 50px;
}
#engagements .icon {
width: 100%;
justify-content: center;
}
#engagements .flag {
padding-bottom: 2rem;
}
#engagements .flag::after {
top: auto;
right: 0;
bottom: 0;
width: 100%;
height: 0.5rem;
}
}
}

View file

@ -7,16 +7,42 @@
background-size: cover;
}
#home h1 {
#home .hero-content {
position: absolute;
bottom: 4rem;
left: 6rem;
bottom: 2rem;
left: 0;
width: 100%;
}
#home .hero-title {
max-width: 35rem;
margin: 0 0 3rem 6rem;
}
#home .hero-subtitle {
width: 100%;
box-sizing: border-box;
padding: 1.2rem 12rem;
margin: 0;
background-color: rgb(52 38 23 / 80%);
color: $color-white;
font-size: 28px;
}
@media (width <= 1080px) {
#home {
background-position: right;
}
#home .hero-title {
margin: 0 0 1rem;
text-align: center;
}
#home .hero-subtitle {
padding: 1rem;
font-size: 20px;
}
}
@media (width <= 767px) {
@ -26,9 +52,20 @@
background-position: right;
}
#home h1 {
#home .hero-content {
position: absolute;
bottom: -15%;
left: 0;
width: 100%;
}
#home .hero-title {
margin: 0;
text-align: center;
}
#home .hero-subtitle {
display: none;
padding: 1rem;
}
}

View file

@ -2,12 +2,14 @@
@foreach ($model->data as $k => $input)
@php
$input = json_decode(json_encode($input), true);
$isRequired = \Illuminate\Support\Str::contains($input['validate'] ?? '', 'required')
&& !\Illuminate\Support\Str::contains($input['validate'] ?? '', ['nullable', 'sometimes', 'required_']);
@endphp
@switch(intval($input['inputType']['value']))
@case(intval(\App\Enums\InputType::string->value))
<div class="minicrud-input col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ $input['label'] }} *</legend>
<legend>{{ $input['label'] }}{{ $isRequired ? ' *' : '' }}</legend>
<div class="row">
<div class="col-12 mb-3">
@include('bo.partials.inputs.varchar', [
@ -16,7 +18,7 @@
'hasWordCounter' => true,
'name' => 'data[' . $k . '][value]',
'value' => old("data.{$k}.value", $input['value'] ?? null),
'required' => isset($input['required']) ? !empty($input['required']) : true,
'required' => $isRequired,
'model' => $model ?? null,
'helper' => __('validation.between.string', [
'attribute' => $input['label'],
@ -50,9 +52,10 @@
</div>
<div class="row mb-3">
<div class="form-group">
<input class="form-control" id="number{{ $k }}" name="data[{{ $k }}][value]" type="number"
value="{{ old("data.{$k}.value") ?? ($input['value'] ?? '') }}" aria-describedby="NumberHelp{{ $k }}"
step="0.01" placeholder="{{ $input['label'] }}" @if (!isset($input['required']) or $input['required']) required @endif>
<input class="form-control" id="number{{ $k }}" name="data[{{ $k }}][value]"
type="number" value="{{ old("data.{$k}.value") ?? ($input['value'] ?? '') }}"
aria-describedby="NumberHelp{{ $k }}" step="0.01"
placeholder="{{ $input['label'] }}" @if (!isset($input['required']) or $input['required']) required @endif>
@include('modules.input-error', [
'inputName' => "data.{$k}.value",
'helperId' => "NumberHelp{$k}",
@ -101,8 +104,9 @@
<label class="col-form-label"
for="{{ Str::slug($input['label']) }}"><b>{{ __('crud.minicrud.visibility_label') }}</b></label>
<div class="form-check form-switch ms-2">
<input class="form-check-input ml-2" id="{{ Str::slug($input['label']) }}" name="data[{{ $k }}][value]"
type="checkbox" value="1" aria-describedby="{{ Str::slug($input['label']) }}Help"
<input class="form-check-input ml-2" id="{{ Str::slug($input['label']) }}"
name="data[{{ $k }}][value]" type="checkbox" value="1"
aria-describedby="{{ Str::slug($input['label']) }}Help"
@if (old("data.{$k}.value", old('_token') ? false : $input['value'] ?? (null ?? false))) checked @endif>
</div>
@include('modules.input-error', [
@ -185,9 +189,9 @@
</div>
<div class="row mb-3">
<div class="form-group">
<input class="form-control" id="title{{ $k }}" name="data[{{ $k }}][value]" type="email"
value="{{ old("data.{$k}.value") ?? ($input['value'] ?? '') }}" placeholder="{{ $input['label'] }}"
@if (!isset($input['required']) or $input['required']) required @endif>
<input class="form-control" id="title{{ $k }}" name="data[{{ $k }}][value]"
type="email" value="{{ old("data.{$k}.value") ?? ($input['value'] ?? '') }}"
placeholder="{{ $input['label'] }}" @if (!isset($input['required']) or $input['required']) required @endif>
@include('modules.input-error', [
'inputName' => "data.{$k}.value",
'helperId' => "{$k}StringHelp",

View file

@ -1,70 +0,0 @@
<section class="bea-banner mb-5" id="bea-encart" aria-label="{{ __('front.bea_banner.region_label') }}">
<div class="bea-banner__container position-relative overflow-hidden pt-5 text-white shadow-lg">
<div class="container py-4">
<div class="row align-items-center align-items-md-start position-relative gy-4 mb-5">
{{-- Colonne gauche (Logo + lien) --}}
<div class="col-12 col-lg-auto d-flex flex-column align-items-center text-center">
<img class="bea-banner__logo object-fit-contain" src="{{ Vite::asset('resources/assets/images/bea/logo_bea.svg') }}"
title="{{ __('front.bea_banner.logo_alt') }}" alt="{{ __('front.bea_banner.logo_alt') }}" />
<p class="bea-banner__intro fw-semibold lh-sm fs-4 mb-0 mt-2">
{!! __('front.bea_banner.commitments_intro', ['br' => '<br />']) !!}
<a class="text-decoration-underline text-white" href="https://www.bienetreanimal.fr"
title="{{ __('front.bea_banner.site_link_title') }}" aria-label="{{ __('front.bea_banner.site_link_aria') }}" target="_blank"
rel="noopener noreferrer">
{{ __('front.bea_banner.site_url_text') }}
<span class="visually-hidden">({{ __('front.bea_banner.new_window') }})</span>
</a>
</p>
</div>
{{-- Colonne centrale (Textes + CTA) --}}
<div class="col-12 col-lg text-md-start ps-md-4 ps-lg-5 text-center">
<h2 class="bea-banner__title text-uppercase fw-semibold lh-sm mb-0">
{{ __('front.bea_banner.company') }}<br />
<span class="position-relative d-inline-flex align-items-center text-uppercase">
<span class="fs-3">{{ __('front.bea_banner.title') }}</span>
<img class="bea-banner__heart d-none d-md-inline-block object-fit-contain"
src="{{ Vite::asset('resources/assets/images/bea/coeur.svg') }}" alt="" role="presentation" aria-hidden="true" />
</span><br />
<span class="fs-4">{{ __('front.bea_banner.subtitle') }}</span>
</h2>
{{-- Signature visible uniquement sur mobile --}}
<div class="d-flex flex-column align-items-end d-md-none mb-3 mt-3">
<img class="bea-banner__heart-mobile object-fit-contain pe-3" src="{{ Vite::asset('resources/assets/images/bea/coeur.svg') }}"
alt="" role="presentation" aria-hidden="true" />
<img class="bea-banner__ldc-mobile object-fit-contain" src="{{ Vite::asset('resources/assets/images/bea/nat-sign.png') }}"
title="{{ __('front.bea_banner.ldc_alt') }}" alt="{{ __('front.bea_banner.ldc_alt') }}" />
</div>
<div class="d-none d-md-flex float-md-end align-self-start pe-4 pt-0">
<img class="bea-banner__ldc-desktop object-fit-contain" src="{{ Vite::asset('resources/assets/images/bea/nat-sign.png') }}"
title="{{ __('front.bea_banner.ldc_alt') }}" alt="{{ __('front.bea_banner.ldc_alt') }}" />
</div>
<p class="bea-banner__desc fw-medium lh-sm mb-0 mt-3 text-white">
{!! __('front.bea_banner.description', ['br' => '<br />']) !!}
</p>
<div class="d-flex justify-content-center justify-content-md-start mt-4">
<a class="bea-banner__cta btn rounded-pill fw-bold d-inline-flex align-items-center gap-2 text-white shadow-sm"
href="https://www.bienetreanimal.fr" title="{{ __('front.bea_banner.cta_title') }}"
aria-label="{{ __('front.bea_banner.cta_aria') }}" target="_blank" rel="noopener noreferrer">
<span>{{ __('front.bea_banner.cta_text') }}</span>
<svg class="bea-banner__cta-icon flex-shrink-0" aria-hidden="true" focusable="false" fill="none" stroke="currentColor"
stroke-width="3" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7" />
</svg>
<span class="visually-hidden">({{ __('front.bea_banner.new_window') }})</span>
</a>
</div>
</div>
</div>
{{-- Décoration Soleil --}}
<img class="bea-banner__sun position-absolute object-fit-contain pe-none user-select-none"
src="{{ Vite::asset('resources/assets/images/bea/soleil.svg') }}" alt="" role="presentation" aria-hidden="true" />
</div>
</section>

View file

@ -36,11 +36,13 @@
@endif
@endfor
</ul>
<p class="text-italic text-center">
{{ $configDemarche->data['demarche_pictures_subtitle']['value'] }}
</p>
@if (!empty($configBandeau->data['demarche_pictures_subtitle']['value']))
<p class="text-italic text-center">
{{ $configDemarche->data['demarche_pictures_subtitle']['value'] }}
</p>
@endif
@endif
<h3 class="subtitle text-yellow mt2 text-center">
{{-- <h3 class="subtitle text-yellow mt2 text-center">
{{ $configDemarche->data['demarche_pictures_video_title']['value'] }}
</h3>
<div class="flex-center mt2 mr4 mb2 ml4 videos flex">
@ -60,5 +62,5 @@
</strong>
</a>
</div>
</div>
</div> --}}
</section>

View file

@ -1,23 +1,17 @@
<div class="general flex">
<div class="text mb1 flex flex-grow">
<div class="number flex">
<div class="supertitle mr1 ml4 flex-center flex text-center text-white">{{ $index }}</div>
<div class="row align-items-center gy-3 mb-4 engagement-block">
<div class="col-12 col-md-6 d-flex flex-column flex-md-row align-items-center gap-md-5 text-center text-md-start order-1 {{ isset($reverse) ? 'order-md-2 flex-md-row-reverse' : 'order-md-1' }}">
<div class="col-md-8 col-lg-4 col-sm-6 text-center {{ !isset($reverse) ? 'text-lg-start' : 'text-lg-end'}}">
<img src="{{ asset($icon['picture']) }}" alt="{{ $icon['alt'] }}" class="engagement-icon">
</div>
<div class="desc @if (isset($flag)) flag @endif ck-content flex">
{!! clean($textField['value']) !!}
<div class="col-md-5 col-lg-6 col-sm-9 text-center engagement-heading pt-3">
<p class="fw-bold mb-0">{{ $titleField['value'] }}</p>
<p class="fw-bold mb-0">{{ $subtitleField['value'] }}</p>
</div>
</div>
@if (isset($icon))
<div class="icon flex">
<img src="{{ Vite::asset('resources/assets/images/' . $icon['picture']) }}" alt="{{ $icon['alt'] }}">
</div>
@endif
</div>
<div class="imgs mb1">
<img class="illustration" src="{{ asset($bannerField['value']) }}" alt="{{ $bannerField['alt'] }}">
</div>
@if (isset($banner2Field))
<div class="imgs mb1">
<img class="illustration" src="{{ asset($banner2Field['value']) }}" alt="{{ $banner2Field['alt'] }}">
<div class="col-12 order-2 order-md-3 ck-content @if (isset($flag)) flag @endif">
{!! clean($textField['value']) !!}
</div>
@endif
<div class="col-12 col-md-6 order-3 {{ isset($reverse) ? 'order-md-1' : 'order-md-2' }}">
<img src="{{ asset($bannerField['value']) }}" alt="{{ $bannerField['alt'] }}" class="img-fluid w-100 engagement-image">
</div>
</div>

View file

@ -8,26 +8,31 @@
<em class="text-yellow">{{ $configDemarche->data['engagement_subtitle']['value'] }}</em>
</h2>
</div>
<div class="content mb-2">
@include('fo.partials.bea_content')
</div>
<ul class="ml4 mb4 mr4">
<ul class="ml4 mb4 mr4 mt2">
<li>
@include('fo.partials.engagement', [
'index' => 1,
'flag' => true,
'bannerField' => $configDemarche->data['engagement_1_banner'],
'titleField' => $configDemarche->data['engagement_1_title'],
'subtitleField' => $configDemarche->data['engagement_1_subtitle'],
'textField' => $configDemarche->data['engagement_1_text'],
'icon' => [
'picture' => $configDemarche->data['engagement_1_logo']['value'],
'alt' => $configDemarche->data['engagement_1_logo']['alt'],
],
])
</li>
<li>
@include('fo.partials.engagement', [
'index' => 2,
'reverse' => true,
'bannerField' => $configDemarche->data['engagement_2_banner'],
'titleField' => $configDemarche->data['engagement_2_title'],
'subtitleField' => $configDemarche->data['engagement_2_subtitle'],
'textField' => $configDemarche->data['engagement_2_text'],
'icon' => [
'picture' => 'eng_cereales.svg',
'alt' => 'Céréales',
'picture' => $configDemarche->data['engagement_2_logo']['value'],
'alt' => $configDemarche->data['engagement_2_logo']['alt'],
],
])
</li>
@ -35,58 +40,26 @@
@include('fo.partials.engagement', [
'index' => 3,
'bannerField' => $configDemarche->data['engagement_3_banner'],
'banner2Field' => $configDemarche->data['engagement_3_2_banner'],
'textField' => $configDemarche->data['engagement_3_text'],
'titleField' => $configDemarche->data['engagement_3_title'],
'subtitleField' => $configDemarche->data['engagement_3_subtitle'],
'icon' => [
'picture' => $configDemarche->data['engagement_3_logo']['value'],
'alt' => $configDemarche->data['engagement_3_logo']['alt'],
],
])
</li>
<li>
@include('fo.partials.engagement', [
'index' => 4,
'reverse' => true,
'bannerField' => $configDemarche->data['engagement_4_banner'],
'textField' => $configDemarche->data['engagement_4_text'],
])
</li>
<li>
@include('fo.partials.engagement', [
'index' => 5,
'bannerField' => $configDemarche->data['engagement_5_banner'],
'textField' => $configDemarche->data['engagement_5_text'],
'titleField' => $configDemarche->data['engagement_4_title'],
'subtitleField' => $configDemarche->data['engagement_4_subtitle'],
'icon' => [
'picture' => 'eng_plume.png',
'alt' => 'Plume',
],
])
</li>
<li>
@include('fo.partials.engagement', [
'index' => 6,
'bannerField' => $configDemarche->data['engagement_6_banner'],
'textField' => $configDemarche->data['engagement_6_text'],
'icon' => [
'picture' => 'eng_abeille.svg',
'alt' => 'Abeille',
],
])
</li>
<li>
@include('fo.partials.engagement', [
'index' => 7,
'bannerField' => $configDemarche->data['engagement_7_banner'],
'textField' => $configDemarche->data['engagement_7_text'],
'icon' => [
'picture' => 'eng_tampon.png',
'alt' => 'Tampon',
],
])
</li>
<li>
@include('fo.partials.engagement', [
'index' => 8,
'bannerField' => $configDemarche->data['engagement_8_banner'],
'textField' => $configDemarche->data['engagement_8_text'],
'icon' => [
'picture' => 'eng_content.svg',
'alt' => 'Éleveur content',
'picture' => $configDemarche->data['engagement_4_logo']['value'],
'alt' => $configDemarche->data['engagement_4_logo']['alt'],
],
])
</li>

View file

@ -2,10 +2,14 @@
$configBandeau = $configList->get(App\Enums\GeneralConfigType::bandeau->value());
@endphp
<section class="w100" id="home">
<h1 class="supertitle text-brown text-center">
<span>{{ $configBandeau->data['bandeau_image_title']['value'] }}</span><br>
<span>{{ $configBandeau->data['bandeau_image_subtitle']['value'] }}</span>
</h1>
<div class="hero-content">
<h1 class="hero-title supertitle text-brown">
{{ $configBandeau->data['bandeau_image_title']['value'] }}
</h1>
@if (!empty($configBandeau->data['bandeau_image_subtitle']['value']))
<p class="hero-subtitle subtitle">{{ $configBandeau->data['bandeau_image_subtitle']['value'] }}</p>
@endif
</div>
</section>
@push('styles')