Compare commits

..

5 commits

Author SHA1 Message Date
Jérémy Munsch
8949c3b427
bump front stack + add favicon Fixes #40 2023-12-21 10:45:43 +01:00
Jérémy Munsch
1963b827d8
composer update 2023-12-21 09:28:30 +01:00
Vincent BRIDIER
256a8b5542 Add foreach for contactformé 2023-12-19 16:50:48 +01:00
Vincent BRIDIER
6c63d52996 Merge branch '2.0.0' into 'develop'
2.0.0

See merge request ldc-web/projets/agis!1
2023-12-19 15:09:12 +00:00
noah.lancien
b557533b72 2.0.0 with Laravel 2023-12-19 15:09:12 +00:00
74 changed files with 3451 additions and 5037 deletions

View file

@ -3,7 +3,6 @@ APP_ENV=local
APP_KEY= APP_KEY=
APP_DEBUG=true APP_DEBUG=true
APP_URL=http://localhost APP_URL=http://localhost
ASSET_URL=http://localhost
LOG_CHANNEL=stack LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null LOG_DEPRECATIONS_CHANNEL=null
@ -23,12 +22,6 @@ QUEUE_CONNECTION=sync
SESSION_DRIVER=file SESSION_DRIVER=file
SESSION_LIFETIME=120 SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp MAIL_MAILER=smtp
MAIL_HOST=mailpit MAIL_HOST=mailpit
MAIL_PORT=1025 MAIL_PORT=1025
@ -37,26 +30,7 @@ MAIL_PASSWORD=null
MAIL_ENCRYPTION=null MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}" MAIL_FROM_NAME="${APP_NAME}"
MAIL_CONTACTFORM_RECEIVER=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
# Sentry # Sentry
SENTRY_LARAVEL_DSN= SENTRY_LARAVEL_DSN=
@ -69,3 +43,6 @@ MATOMO_SITE_ID=
GOOGLE_RECAPTCHA_PUBLIC= GOOGLE_RECAPTCHA_PUBLIC=
GOOGLE_RECAPTCHA_PRIVATE= GOOGLE_RECAPTCHA_PRIVATE=
GOOGLE_RECAPTCHA_VERSION= GOOGLE_RECAPTCHA_VERSION=
# Admin secure
LDC_WEB_API_KEY=

13
.gitignore vendored
View file

@ -23,3 +23,16 @@ Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
.npmrc .npmrc
# Ignore public favicon
/public/android-chrome-192x192.png
/public/android-chrome-512x512.png
/public/apple-touch-icon.png
/public/browserconfig.xml
/public/browserconfig.xml
/public/favicon-16x16.png
/public/favicon-32x32.png
/public/favicon.ico
/public/mstile-150x150.png
/public/safari-pinned-tab.svg
/public/site.webmanifest

5
Dockerfile Normal file
View file

@ -0,0 +1,5 @@
FROM registry.s-web.fr/ldc-web/projets/ldc-web-images-docker/ldcweb-production-8.2:latest
COPY --chown=www-data:www-data . /app/srcs
USER root
RUN chmod -R 755 /app/srcs/storage
USER www-data

View file

@ -1 +1,7 @@
# Agis # Agis
## CRON
Put every min in PROD :
```
php artisan schedule:run
```

View file

@ -139,7 +139,7 @@ class CommitmentController extends Controller
{ {
$commitment->products()->detach(); $commitment->products()->detach();
if ($commitment->explorerpage()->count() > 3) { if ($commitment->explorerpage()->count() === 0) {
if ($commitment->deleteOrFail()) { if ($commitment->deleteOrFail()) {
return redirect()->route('bo.commitments.index') return redirect()->route('bo.commitments.index')
->with('success', __('crud.messages.has_been_deleted', [ ->with('success', __('crud.messages.has_been_deleted', [

View file

@ -24,6 +24,7 @@ class NewsController extends Controller
/** @var \App\Models\News $newsModels */ /** @var \App\Models\News $newsModels */
$newsModels = News::query()->where('published', true)->orderBy('publish_at', 'desc')->paginate(12); $newsModels = News::query()->where('published', true)->orderBy('publish_at', 'desc')->paginate(12);
return view('fo.pages.news.index', \compact('staticPageModel', 'newsModels')); return view('fo.pages.news.index', \compact('staticPageModel', 'newsModels'));
} }

View file

@ -3,6 +3,7 @@
namespace App\Http\Controllers\Fo; namespace App\Http\Controllers\Fo;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Lib\Helpers\CollectionHelper;
use App\Models\Product; use App\Models\Product;
class ProductController extends Controller class ProductController extends Controller
@ -10,16 +11,35 @@ class ProductController extends Controller
/** /**
* Display the product page. * Display the product page.
* *
* @param \App\Models\Product $product * @param string $slug
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
*/ */
public function show(Product $product): \Illuminate\Contracts\View\View public function show(string $slug): \Illuminate\Contracts\View\View
{ {
$otherProductModels = $product->range->products() $productModel = Product::query()->where('slug', $slug)->firstOrFail();
->where('id', '!=', $product->id)
$otherProductModels = $productModel->range->products()
->where('id', '!=', $productModel->id)
->where('published', true) ->where('published', true)
->inRandomOrder() ->inRandomOrder()
->get(); ->get();
return view('fo.pages.products.show', compact('product', 'otherProductModels'));
return view('fo.pages.products.show', compact('productModel', 'otherProductModels'));
}
/**
* Get filtered products.
*
* @return \Illuminate\Http\JsonResponse
*/
public function productsFiltered(): \Illuminate\Http\JsonResponse
{
$productModels = Product::query()
->where('published', true)
->where('range_id', request()->range_id)
->orderBy('order', 'asc')
->get();
$productModels = CollectionHelper::paginateManually($productModels, 12, request()->page);
return response()->json($productModels);
} }
} }

View file

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Fo;
use App\Enums\StaticPageType; use App\Enums\StaticPageType;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Lib\Helpers\CollectionHelper;
use App\Models\Product; use App\Models\Product;
use App\Models\Range; use App\Models\Range;
use App\Models\StaticPage; use App\Models\StaticPage;
@ -17,12 +18,12 @@ class RangeController extends Controller
*/ */
public function index(): \Illuminate\Contracts\View\View public function index(): \Illuminate\Contracts\View\View
{ {
/** @var \App\Models\Range $rangeModels */
$rangeModels = Range::query()->where('published', true)->orderBy('order')->get();
/** @var \App\Models\StaticPage $staticPageModel */ /** @var \App\Models\StaticPage $staticPageModel */
$staticPageModel = StaticPage::query()->where('type', StaticPageType::ranges)->firstOrFail(); $staticPageModel = StaticPage::query()->where('type', StaticPageType::ranges)->firstOrFail();
/** @var \App\Models\Range $rangeModels */
$rangeModels = Range::query()->where('published', true)->orderBy('order')->paginate(12);
return view('fo.pages.ranges.index', compact('rangeModels', 'staticPageModel')); return view('fo.pages.ranges.index', compact('rangeModels', 'staticPageModel'));
} }
@ -38,8 +39,27 @@ class RangeController extends Controller
$rangeModel = Range::query()->where('published', true)->where('slug', $slug)->firstOrFail(); $rangeModel = Range::query()->where('published', true)->where('slug', $slug)->firstOrFail();
/** @var \App\Models\Product $productModels */ /** @var \App\Models\Product $productModels */
$productModels = Product::query()->where('range_id', $rangeModel->id)->where('published', true)->get(); $productModels = Product::query()
->where('range_id', $rangeModel->id)
->where('published', true)
->orderBy('order')
->paginate(12);
return view('fo.pages.ranges.show', compact('rangeModel', 'productModels')); return view('fo.pages.ranges.show', compact('rangeModel', 'productModels'));
} }
/**
* Get filtered ranges.
*
* @return \Illuminate\Http\JsonResponse
*/
public function rangesFiltered(): \Illuminate\Http\JsonResponse
{
$productModels = Range::query()
->where('published', true)
->orderBy('order', 'asc')
->get();
$productModels = CollectionHelper::paginateManually($productModels, 12, request()->page);
return response()->json($productModels);
}
} }

View file

@ -110,7 +110,10 @@ class StaticPageController extends Controller
*/ */
public function contactForm(ContactRequest $request): \Illuminate\Http\RedirectResponse public function contactForm(ContactRequest $request): \Illuminate\Http\RedirectResponse
{ {
Mail::to(\config('mail.from.address'))->send(new SendContactMail((object)$request->validated())); $receivers = \config('mail.contactform.receiver');
foreach ($receivers as $email) {
Mail::to($email)->send(new SendContactMail((object)$request->validated()));
}
return redirect()->route('fo.contact.show') return redirect()->route('fo.contact.show')
->with( ->with(
@ -184,7 +187,10 @@ class StaticPageController extends Controller
*/ */
public function joinusForm(JoinusRequest $request): \Illuminate\Http\RedirectResponse public function joinusForm(JoinusRequest $request): \Illuminate\Http\RedirectResponse
{ {
Mail::to(\config('mail.from.address'))->send(new SendJoinusMail((object)$request->validated())); $receivers = \config('mail.contactform.receiver');
foreach ($receivers as $email) {
Mail::to($email)->send(new SendJoinusMail((object)$request->validated()));
}
return redirect()->route('fo.joinus.show') return redirect()->route('fo.joinus.show')
->with( ->with(

View file

@ -65,5 +65,6 @@ class Kernel extends HttpKernel
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'htmlsanitize' => \App\Http\Middleware\HtmlSanitizer::class, 'htmlsanitize' => \App\Http\Middleware\HtmlSanitizer::class,
'local-development' => \App\Http\Middleware\LocalDevelopment::class,
]; ];
} }

View file

@ -0,0 +1,25 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class LocalDevelopment
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (app()->environment() != 'local') {
return abort(403, 'You are not authorized to access this');
}
return $next($request);
}
}

View file

@ -27,14 +27,14 @@ class UpdateConvictionpageRequest extends FormRequest
public function rules() public function rules()
{ {
return [ return [
'key_feed' => 'required|numeric', 'key_feed' => 'required|numeric|max:2147483647',
'key_earth_1' => 'required|numeric', 'key_earth_1' => 'required|numeric|max:2147483647',
'key_earth_2' => 'required|numeric', 'key_earth_2' => 'required|numeric|max:2147483647',
'key_together_1' => 'required|numeric', 'key_together_1' => 'required|numeric|max:2147483647',
'key_together_2' => 'required|numeric', 'key_together_2' => 'required|numeric|max:2147483647',
'key_together_3' => 'required|numeric', 'key_together_3' => 'required|numeric|max:2147483647',
'key_together_4' => 'required|numeric', 'key_together_4' => 'required|numeric|max:2147483647',
'key_territory' => 'required|numeric', 'key_territory' => 'required|numeric|max:2147483647',
]; ];
} }

View file

@ -54,7 +54,7 @@ class StoreNewsRequest extends FormRequest
'subtitle' => 'required|string|between:3,255', 'subtitle' => 'required|string|between:3,255',
'content' => 'required|string|min:15', 'content' => 'required|string|min:15',
'published' => 'required|boolean', 'published' => 'required|boolean',
'publish_at' => 'nullable|date', 'publish_at' => 'required|date',
'unpublish_at' => 'nullable|date|after:publish_at', 'unpublish_at' => 'nullable|date|after:publish_at',
]; ];

View file

@ -59,7 +59,7 @@ class StoreRangeRequest extends FormRequest
return \array_merge( return \array_merge(
$rules, $rules,
$this->pictureRules('picture', 466, 440, 466, 440, false), $this->pictureRules('picture', 466, 440, 466, 440, false),
$this->pictureRules('picture_productsheet', 332, 442, 332, 442, false), $this->pictureRules('picture_productsheet', 680, 300, 680, 300, false),
$this->pictureRules('picture_thumbnail', 246, 337, 246, 337, false), $this->pictureRules('picture_thumbnail', 246, 337, 246, 337, false),
); );
} }

View file

@ -31,9 +31,11 @@ class ContactRequest extends FormRequest
* Get the validation rules that apply to the request. * Get the validation rules that apply to the request.
* *
* @return array * @return array
* @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh
*/ */
public function rules() public function rules()
{ {
// phpcs:enable
ToolboxHelper::validateRecaptcha($this, \config('services.google.recaptcha.version')); ToolboxHelper::validateRecaptcha($this, \config('services.google.recaptcha.version'));
$rules = [ $rules = [
@ -47,100 +49,92 @@ class ContactRequest extends FormRequest
'postal_code' => 'sometimes|nullable|numeric|min:0', 'postal_code' => 'sometimes|nullable|numeric|min:0',
'city' => 'sometimes|nullable|string|between:3,255', 'city' => 'sometimes|nullable|string|between:3,255',
'object' => ['required', new Enum(ObjectEnum::class)], 'object' => ['required', new Enum(ObjectEnum::class)],
'product_name' => [ 'message' => 'required|string|between:3,500',
'nullable', 'string', 'between:3,255',
// @phpcs:ignore Generic.Files.LineLength.TooLong
'required_with:product_date_limit,product_barcode,product_lot,product_date_consumption,product_location',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_name'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_date_limit' => [
'sometimes', 'nullable', 'string', 'between:3,255',
// @phpcs:ignore Generic.Files.LineLength.TooLong
'required_with:product_name,product_barcode,product_lot,product_date_consumption,product_location',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_date_limit'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_barcode' => [
'sometimes', 'nullable', 'numeric', 'min:0',
// @phpcs:ignore Generic.Files.LineLength.TooLong
'required_with:product_name,product_date_limit,product_lot,product_date_consumption,product_location',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_barcode'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_lot' => [
'sometimes', 'nullable', 'numeric', 'min:0',
// @phpcs:ignore Generic.Files.LineLength.TooLong
'required_with:product_name,product_date_limit,product_barcode,product_date_consumption,product_location',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_lot'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_date_consumption' => [
'sometimes', 'nullable', 'string', 'between:3,255',
// @phpcs:ignore Generic.Files.LineLength.TooLong
'required_with:product_name,product_date_limit,product_barcode,product_lot,product_location',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_date_consumption'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_location' => [
'sometimes', 'nullable', 'string', 'between:3,255',
// @phpcs:ignore Generic.Files.LineLength.TooLong
'required_with:product_name,product_date_limit,product_barcode,product_lot,product_date_consumption',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_location'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'message' => 'required|string|between:3,255',
'accept_rules' => 'required|boolean', 'accept_rules' => 'required|boolean',
'send_data' => 'required|boolean', 'send_data' => 'required|boolean',
]; ];
if ($this->object === strval(ObjectEnum::customerService->value())) {
$rules = \array_merge($rules, [
'product_name' => [
'string', 'between:3,255', 'required',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_name'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_date_limit' => [
'string', 'between:3,255', 'required',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_date_limit'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_barcode' => [
'numeric', 'min:0', 'required',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_barcode'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_lot' => [
'numeric', 'min:0', 'required',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_lot'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_date_consumption' => [
'string', 'between:3,255', 'required',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_date_consumption'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
'product_location' => [
'string', 'between:3,255', 'required',
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->get("object") != ObjectEnum::customerService->value()) {
$fail(\trans('le Champs :field doit être vide lorsque le champs objet
n\'est pas égale à :enumValue.', [
'field' => trans('validation.custom.product_location'),
'enumValue' => ObjectEnum::customerService->label(),
]));
}
}
],
]);
} //end if
if ( if (
isset(request()->file) and isset(request()->file) and
(request()->file->getClientMimeType() === "image/jpeg" || (request()->file->getClientMimeType() === "image/jpeg" ||
@ -161,6 +155,20 @@ class ContactRequest extends FormRequest
//phpcs:ignore Generic.Files.LineLength.TooLong //phpcs:ignore Generic.Files.LineLength.TooLong
'file' => 'sometimes|nullable|mimes:pdf|required_with:product_name,product_date_limit,product_barcode,product_lot,product_date_consumption,product_location' 'file' => 'sometimes|nullable|mimes:pdf|required_with:product_name,product_date_limit,product_barcode,product_lot,product_date_consumption,product_location'
]); ]);
} elseif (
isset(request()->file) and
(request()->file->getClientMimeType() !== "application/pdf") and
(request()->file->getClientMimeType() !== "image/jpeg") and
(request()->file->getClientMimeType() !== "image/png")
) {
$rules = \array_merge($rules, [
'file' => [
// @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
function ($attribute, $value, $fail) {
$fail(\trans('Le format du fichier doit être .jpg, .png ou .pdf'));
}
],
]);
} //end if } //end if
return $rules; return $rules;
} }

View file

@ -21,7 +21,7 @@ class JoinusRequest extends FormRequest
'first_name' => 'required|string|between:3,255', 'first_name' => 'required|string|between:3,255',
'email' => 'required|email:rfc,strict,dns,spoof,filter|max:255', 'email' => 'required|email:rfc,strict,dns,spoof,filter|max:255',
'phone' => 'required|numeric|min:0', 'phone' => 'required|numeric|min:0',
'message' => 'required|string|between:3,255', 'message' => 'required|string|between:3,500',
"file" => "sometimes|nullable|mimes:pdf|max:10000" "file" => "sometimes|nullable|mimes:pdf|max:10000"
]; ];
} }

View file

@ -5,7 +5,6 @@ namespace App\Mail;
use App\Enums\Contact\ObjectEnum; use App\Enums\Contact\ObjectEnum;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Attachment; use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailables\Envelope;
@ -41,13 +40,6 @@ class SendContactMail extends Mailable
public function envelope(): \Illuminate\Mail\Mailables\Envelope public function envelope(): \Illuminate\Mail\Mailables\Envelope
{ {
return new Envelope( return new Envelope(
from: new Address(
$this->data->email,
($this->data->first_name !== null || $this->data->last_name !== null) ?
(($this->data->first_name ?? '') . " " . ($this->data->last_name ?? '')) :
null
),
to: [new Address(config('mail.from.address'), config('mail.from.name'))],
subject: sprintf('%s - %s', ObjectEnum::make($this->data->object)->label() ?? subject: sprintf('%s - %s', ObjectEnum::make($this->data->object)->label() ??
__('Nouveau message'), config('app.name')), __('Nouveau message'), config('app.name')),
); );

View file

@ -4,7 +4,6 @@ namespace App\Mail;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Attachment; use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailables\Envelope;
@ -40,13 +39,6 @@ class SendJoinusMail extends Mailable
public function envelope(): \Illuminate\Mail\Mailables\Envelope public function envelope(): \Illuminate\Mail\Mailables\Envelope
{ {
return new Envelope( return new Envelope(
from: new Address(
$this->data->email,
($this->data->first_name !== null || $this->data->last_name !== null) ?
(($this->data->first_name ?? '') . " " . ($this->data->last_name ?? '')) :
null
),
to: [new Address(config('mail.from.address'), config('mail.from.name'))],
subject: sprintf('%s - %s', __('Candidature spontanée'), config('app.name')), subject: sprintf('%s - %s', __('Candidature spontanée'), config('app.name')),
); );
} }

View file

@ -122,7 +122,7 @@ class ActivityLog extends Model
* *
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/ */
public function user() public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(User::class); return $this->belongsTo(User::class);
} }

View file

@ -22,7 +22,7 @@ use Illuminate\Support\Str;
* @property string $picture Path of the picture (466px * 440px). * @property string $picture Path of the picture (466px * 440px).
* @property string $picture_alt Picture alt attribute. * @property string $picture_alt Picture alt attribute.
* @property string $picture_title Picture title attribute. * @property string $picture_title Picture title attribute.
* @property string $picture_productsheet Path of the picture of the product sheet (332px * 442px). * @property string $picture_productsheet Path of the picture of the product sheet (680px * 300px).
* @property string $picture_productsheet_alt Picture alt attribute of the product sheet. * @property string $picture_productsheet_alt Picture alt attribute of the product sheet.
* @property string $picture_productsheet_title Picture title attribute of the product sheet. * @property string $picture_productsheet_title Picture title attribute of the product sheet.
* @property string $picture_thumbnail Path of the thumbnail (246px * 337px). * @property string $picture_thumbnail Path of the thumbnail (246px * 337px).

View file

@ -5,6 +5,7 @@ namespace App\Models;
use App\Lib\Helpers\FileStorageHelper; use App\Lib\Helpers\FileStorageHelper;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
/** /**
* @property string $picture Path of the picture (120px * 120px). * @property string $picture Path of the picture (120px * 120px).
@ -54,9 +55,14 @@ class Stamp extends Model
}); });
static::updated(function (self $model) { static::updated(function (self $model) {
FileStorageHelper::removeOldFile($model, 'picture'); FileStorageHelper::removeOldFile($model, 'picture');
Cache::forget('randomStampsFooter');
}); });
static::deleted(function (self $model) { static::deleted(function (self $model) {
FileStorageHelper::removeFile($model, 'picture'); FileStorageHelper::removeFile($model, 'picture');
Cache::forget('randomStampsFooter');
});
static::created(function () {
Cache::forget('randomStampsFooter');
}); });
} }
} }

View file

@ -4,6 +4,7 @@ namespace App\Providers;
use Illuminate\Pagination\Paginator; use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@ -20,6 +21,7 @@ class ViewServiceProvider extends ServiceProvider
$appInfos = Cache::remember('composer', 360, function () { $appInfos = Cache::remember('composer', 360, function () {
return json_decode(File::get(\app_path('../composer.json'))); return json_decode(File::get(\app_path('../composer.json')));
}); });
// Share composer.json infos. // Share composer.json infos.
if (isset($appInfos->name) and isset($appInfos->version)) { if (isset($appInfos->name) and isset($appInfos->version)) {
View::share('cpsr_name', $appInfos->name); View::share('cpsr_name', $appInfos->name);
@ -34,6 +36,24 @@ class ViewServiceProvider extends ServiceProvider
} else { } else {
Paginator::useBootstrapFive(); Paginator::useBootstrapFive();
} }
}
// Get all the stamps that are pubished.
$stamps = Cache::remember('randomStampsFooter', 360, function () {
return DB::table('stamps')
->select('picture', 'picture_alt', 'picture_title')
->where('published', true)
->get();
});
/**
* Share a collection of 1 or 2 random stamps for footer.
* First, check if $stamps is not empty, if not,
* we count if the number of stamp in $stamps is greater than 2.
* Then, pick 1 or 2 stamp(s) depending on the number of stamps.
*/
View::share(
'randomStampsFooter',
$stamps->isNotEmpty() ? $stamps->random($stamps->count() >= 2 ? 2 : 1) : []
);
}//end if
} }
} }

View file

@ -1,22 +1,23 @@
{ {
"name": "uwil/agis", "name": "uwil/agis",
"version": "1.0.0", "version": "2.0.0",
"type": "project", "type": "project",
"description": "Agis website.", "description": "Agis website.",
"require": { "require": {
"php": "^8.2", "php": "^8.2",
"diglactic/laravel-breadcrumbs": "^8.0", "diglactic/laravel-breadcrumbs": "^8.0",
"doctrine/dbal": "^3.7",
"guzzlehttp/guzzle": "^7.2", "guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.0", "laravel/framework": "^10.0",
"laravel/tinker": "^2.8", "laravel/tinker": "^2.8",
"laravel/ui": "^4.2", "laravel/ui": "^4.2",
"ldc/web-admin-secure-laravel": "^2.0",
"mews/purifier": "^3.4", "mews/purifier": "^3.4",
"sentry/sentry-laravel": "*" "sentry/sentry-laravel": "*",
"uwil/k8s-laravel": "^1.2"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.9.1", "fakerphp/faker": "^1.9.1",
"kitloong/laravel-migrations-generator": "^6.8",
"krlove/eloquent-model-generator": "dev-l10-compatibility",
"laravel-lang/common": "^4.0", "laravel-lang/common": "^4.0",
"laravel/pint": "^1.0", "laravel/pint": "^1.0",
"laravel/sail": "^1.18", "laravel/sail": "^1.18",
@ -24,8 +25,7 @@
"nunomaduro/collision": "^7.0", "nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.0", "phpunit/phpunit": "^10.0",
"slevomat/coding-standard": "^8.10", "slevomat/coding-standard": "^8.10",
"spatie/laravel-ignition": "^2.0", "spatie/laravel-ignition": "^2.0"
"thedoctor0/laravel-factory-generator": "^1.2"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@ -36,8 +36,8 @@
}, },
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "composer",
"url": "https://github.com/laravel-shift/eloquent-model-generator.git" "url": "https://lab.s-web.fr/api/v4/group/23/-/packages/composer/packages.json"
} }
], ],
"autoload-dev": { "autoload-dev": {

3429
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -96,6 +96,10 @@ return [
'name' => env('MAIL_FROM_NAME', 'Example'), 'name' => env('MAIL_FROM_NAME', 'Example'),
], ],
'contactform' => [
'receiver' => explode(',', env('MAIL_CONTACTFORM_RECEIVER', 'hello@example.com'))
],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Markdown Mail Settings | Markdown Mail Settings

View file

@ -38,4 +38,8 @@ return [
'version' => env('GOOGLE_RECAPTCHA_VERSION', "3") === "3" ? true : false 'version' => env('GOOGLE_RECAPTCHA_VERSION', "3") === "3" ? true : false
] ]
], ],
'matomo' => [
'site_id' => env('MATOMO_SITE_ID')
]
]; ];

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View file

@ -15,14 +15,14 @@ return new class extends Migration
{ {
Schema::create('convictionpages', function (Blueprint $table) { Schema::create('convictionpages', function (Blueprint $table) {
$table->id(); $table->id();
$table->float('key_feed')->comment('Chiffre clé \'bien nourrir\''); $table->float('key_feed', 12)->comment('Chiffre clé \'bien nourrir\'');
$table->float('key_earth_1')->comment('Chiffre clé \'respecter la terre\' 1'); $table->float('key_earth_1', 12)->comment('Chiffre clé \'respecter la terre\' 1');
$table->float('key_earth_2')->comment('Chiffre clé \'respecter la terre\' 2'); $table->float('key_earth_2', 12)->comment('Chiffre clé \'respecter la terre\' 2');
$table->float('key_together_1')->comment('Chiffre clé \'vivre ensemble\' 1'); $table->float('key_together_1', 12)->comment('Chiffre clé \'vivre ensemble\' 1');
$table->float('key_together_2')->comment('Chiffre clé \'vivre ensemble\' 2'); $table->float('key_together_2', 12)->comment('Chiffre clé \'vivre ensemble\' 2');
$table->float('key_together_3')->comment('Chiffre clé \'vivre ensemble\' 3'); $table->float('key_together_3', 12)->comment('Chiffre clé \'vivre ensemble\' 3');
$table->float('key_together_4')->comment('Chiffre clé \'vivre ensemble\' 4'); $table->float('key_together_4', 12)->comment('Chiffre clé \'vivre ensemble\' 4');
$table->float('key_territory')->comment('Chiffre clé \'intégrer son territoire\''); $table->float('key_territory', 12)->comment('Chiffre clé \'intégrer son territoire\'');
$table->timestamps(); $table->timestamps();
}); });
} }

View file

@ -26,7 +26,7 @@ return new class extends Migration
$table->string('picture_alt')->comment('Attribut alt pour l\'image picture'); $table->string('picture_alt')->comment('Attribut alt pour l\'image picture');
$table->string('picture_title')->comment('Attribut title pour l\'image picture'); $table->string('picture_title')->comment('Attribut title pour l\'image picture');
$table->string('picture_productsheet') $table->string('picture_productsheet')
->comment('Path de l\'image à afficher sur les fiches produits de cette gamme (332px * 442px)'); ->comment('Path de l\'image à afficher sur les fiches produits de cette gamme (680px * 300px)');
$table->string('picture_productsheet_alt') $table->string('picture_productsheet_alt')
->comment('Attribut alt de l\'image à afficher sur les fiches produits'); ->comment('Attribut alt de l\'image à afficher sur les fiches produits');
$table->string('picture_productsheet_title') $table->string('picture_productsheet_title')

View file

@ -21,7 +21,7 @@ class RangeSeeder extends Seeder
'../database/factories/assets/ranges/default-picture-466x440.png' '../database/factories/assets/ranges/default-picture-466x440.png'
))); )));
$range->picture_productsheet = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path( $range->picture_productsheet = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path(
'../database/factories/assets/ranges/default-picture-332x442.png' '../database/factories/assets/ranges/default-picture-680x300.png'
))); )));
$range->picture_thumbnail = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path( $range->picture_thumbnail = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path(
'../database/factories/assets/ranges/default-picture-246x337.png' '../database/factories/assets/ranges/default-picture-246x337.png'

177
manifest.yaml Normal file
View file

@ -0,0 +1,177 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: ${CI_PROJECT_PATH_SLUG}-config-map
data:
APP_NAME: "${APP_APP_NAME}"
APP_ENV: "${APP_APP_ENV}"
APP_KEY: "${APP_APP_KEY}"
APP_DEBUG: "${APP_APP_DEBUG}"
APP_URL: "https://www.${APP_DOMAIN}"
LOG_CHANNEL: "k8s"
DB_HOST: "mariadb-service.common-services"
DB_DATABASE: "${APP_DB_DATABASE}"
DB_USERNAME: "${APP_DB_USERNAME}"
DB_PASSWORD: "${APP_DB_PASSWORD}"
MAIL_HOST: "${APP_MAIL_HOST}"
MAIL_PORT: "${APP_MAIL_PORT}"
MAIL_USERNAME: "${APP_MAIL_USERNAME}"
MAIL_PASSWORD: "${APP_MAIL_PASSWORD}"
MAIL_ENCRYPTION: "${APP_MAIL_ENCRYPTION}"
MAIL_FROM_ADDRESS: "${APP_MAIL_FROM_ADDRESS}"
MAIL_FROM_NAME: "${APP_APP_NAME}"
MAIL_CONTACTFORM_RECEIVER: "${APP_MAIL_CONTACTFORM_RECEIVER}"
LDC_WEB_API_KEY: "${APP_LDC_WEB_API_KEY}"
GOOGLE_RECAPTCHA_PRIVATE: "${APP_GOOGLE_RECAPTCHA_PRIVATE}"
GOOGLE_RECAPTCHA_PUBLIC: "${APP_GOOGLE_RECAPTCHA_PUBLIC}"
GOOGLE_RECAPTCHA_VERSION: "${APP_GOOGLE_RECAPTCHA_VERSION}"
SENTRY_LARAVEL_DSN: "${APP_SENTRY_LARAVEL_DSN}"
MATOMO_SITE_ID: "${APP_MATOMO_SITE_ID}"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ${CI_PROJECT_PATH_SLUG}-pvc-storage
spec:
storageClassName: "csi-cinder-classic"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: $APP_PVC_SIZE
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${CI_PROJECT_PATH_SLUG}-deployment
spec:
replicas: 1
selector:
matchLabels:
app: ${CI_PROJECT_PATH_SLUG}-app
template:
metadata:
labels:
app: ${CI_PROJECT_PATH_SLUG}-app
spec:
containers:
- name: ${CI_PROJECT_PATH_SLUG}-container
image: $IMAGE_TAG
envFrom:
- configMapRef:
name: ${CI_PROJECT_PATH_SLUG}-config-map
volumeMounts:
- name: storage
mountPath: /app/srcs/storage
imagePullSecrets:
- name: docker-registry-credentials
securityContext:
runAsUser: 33
runAsGroup: 33
fsGroup: 33
fsGroupChangePolicy: "OnRootMismatch"
volumes:
- name: storage
persistentVolumeClaim:
claimName: ${CI_PROJECT_PATH_SLUG}-pvc-storage
---
apiVersion: v1
kind: Service
metadata:
name: ${CI_PROJECT_PATH_SLUG}-service
spec:
selector:
app: ${CI_PROJECT_PATH_SLUG}-app
ports:
- port: 80
targetPort: 443
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ${CI_PROJECT_PATH_SLUG}-ingress-route
spec:
entryPoints:
- web
- websecure
routes:
- match: Host(`${APP_DOMAIN}`, `www.${APP_DOMAIN}`)
kind: Rule
services:
- name: ${CI_PROJECT_PATH_SLUG}-service
port: 80
middlewares:
- name: redirect-no-www-to-www
namespace: common-services
tls:
secretName: $APP_DOMAIN
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: $APP_DOMAIN
spec:
dnsNames:
- $APP_DOMAIN
- www.${APP_DOMAIN}
secretName: $APP_DOMAIN
issuerRef:
name: $APP_CERT_ISSUER
kind: ClusterIssuer
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: ${CI_PROJECT_PATH_SLUG}-cronjob
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ${CI_PROJECT_PATH_SLUG}-app
topologyKey: "kubernetes.io/hostname"
namespaces: [$KUBE_NAMESPACE]
containers:
- name: ${CI_PROJECT_PATH_SLUG}-scheduled
image: $IMAGE_TAG
imagePullPolicy: IfNotPresent
command:
- "php"
args:
- "artisan"
- "schedule:run"
envFrom:
- configMapRef:
name: ${CI_PROJECT_PATH_SLUG}-config-map
volumeMounts:
- name: storage
mountPath: /app/srcs/storage
imagePullSecrets:
- name: docker-registry-credentials
volumes:
- name: storage
persistentVolumeClaim:
claimName: ${CI_PROJECT_PATH_SLUG}-pvc-storage
securityContext:
runAsUser: 33
runAsGroup: 33
fsGroup: 33
fsGroupChangePolicy: "OnRootMismatch"
restartPolicy: OnFailure

2724
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,6 @@
{ {
"private": true, "private": true,
"name": "srcs",
"scripts": { "scripts": {
"vite": "vite --clearScreen false", "vite": "vite --clearScreen false",
"prod": "vite build --mode production", "prod": "vite build --mode production",
@ -15,12 +16,11 @@
"devDependencies": { "devDependencies": {
"@babel/core": "^7.22.11", "@babel/core": "^7.22.11",
"@babel/types": "^7.21.2", "@babel/types": "^7.21.2",
"@fortawesome/fontawesome-svg-core": "latest", "@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "latest", "@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-regular-svg-icons": "latest", "@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "latest", "@fortawesome/vue-fontawesome": "^3.0.5",
"@fortawesome/vue-fontawesome": "^3.0.3", "@ldc-web/cookie-notice": "^3.1.2",
"@ldc-web/cookie-notice": "^3.0.9",
"@sipec/vue3-tags-input": "^3.0.4", "@sipec/vue3-tags-input": "^3.0.4",
"@types/bootstrap": "^5.2.7", "@types/bootstrap": "^5.2.7",
"@types/node": "^20.8.2", "@types/node": "^20.8.2",
@ -28,11 +28,10 @@
"@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.36.2", "@typescript-eslint/parser": "^5.36.2",
"@vitejs/plugin-basic-ssl": "^1.0.1", "@vitejs/plugin-basic-ssl": "^1.0.1",
"@vitejs/plugin-legacy": "latest",
"@vitejs/plugin-vue": "latest", "@vitejs/plugin-vue": "latest",
"@vue/compiler-sfc": "latest", "@vue/compiler-sfc": "latest",
"@vue/eslint-config-typescript": "latest", "@vue/eslint-config-typescript": "latest",
"@vue/tsconfig": "latest", "@vue/tsconfig": "^0.4.0",
"axios": "^1.5.1", "axios": "^1.5.1",
"bootstrap": "^5.3.2", "bootstrap": "^5.3.2",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
@ -40,33 +39,34 @@
"eslint": "latest", "eslint": "latest",
"eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-vue": "latest", "eslint-plugin-vue": "latest",
"laravel-vite-plugin": "latest", "laravel-vite-plugin": "^0.8.1",
"postcss-discard-comments": "^6.0.0", "postcss-discard-comments": "^6.0.0",
"prettier": "latest", "prettier": "latest",
"print-js": "^1.6.0", "print-js": "^1.6.0",
"resolve-url-loader": "^5.0.0", "resolve-url-loader": "^5.0.0",
"rollup-plugin-copy": "^3.5.0",
"sass": "latest", "sass": "latest",
"slugify": "^1.6.6", "slugify": "^1.6.6",
"stylelint": "latest", "stylelint": "^15.11.0",
"stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order", "stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order",
"stylelint-config-sass-guidelines": "latest", "stylelint-config-sass-guidelines": "^10.0.0",
"stylelint-config-standard-scss": "latest", "stylelint-config-standard-scss": "^11.1.0",
"stylelint-scss": "latest", "stylelint-scss": "^5.3.2",
"sweetalert2": "^11.7.31", "sweetalert2": "^11.7.31",
"swiper": "^10.2.0", "swiper": "^11.0.5",
"terser": "latest", "terser": "latest",
"toastify-js": "^1.12.0", "toastify-js": "^1.12.0",
"ts-loader": "^9.3.1", "ts-loader": "^9.3.1",
"typescript": ">=3.3.1 <5.2.0",
"typescript-eslint": "latest", "typescript-eslint": "latest",
"typescript": "latest", "vite": "^4.5.1",
"vite-plugin-babel": "latest", "vite-plugin-babel": "latest",
"vite-plugin-checker": "latest", "vite-plugin-checker": "latest",
"vite-plugin-eslint": "latest", "vite-plugin-eslint": "latest",
"vite-plugin-stylelint": "latest", "vite-plugin-stylelint": "latest",
"vite": "^4.0.0",
"vue-eslint-parser": "^9.1.0",
"vue-loader": "^16.8.3",
"vue": "latest", "vue": "latest",
"vue-tsc": "1.6.0" "vue-eslint-parser": "^9.3.2",
"vue-loader": "^17.3.1",
"vue-tsc": "1.8.11"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 0 B

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#ffc40d</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

View file

@ -0,0 +1,173 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="330.000000pt" height="330.000000pt" viewBox="0 0 330.000000 330.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,330.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1565 3286 c-113 -31 -202 -130 -219 -240 -4 -22 -8 -41 -10 -43 -1
-2 -38 -14 -82 -27 -464 -136 -823 -506 -947 -976 -25 -94 -32 -134 -43 -240
-3 -30 -7 -59 -8 -65 -2 -6 -35 -10 -75 -9 l-71 0 0 -38 0 -38 75 0 75 0 1
-32 c3 -160 55 -361 139 -533 80 -164 171 -288 303 -411 159 -149 398 -281
583 -324 50 -11 52 -13 58 -53 17 -105 94 -200 192 -236 184 -69 376 45 409
242 3 20 12 37 19 37 54 0 306 106 417 175 137 86 292 233 392 373 147 204
248 496 256 740 1 21 5 22 76 22 l75 0 0 38 0 39 -71 -1 c-39 -1 -72 2 -74 5
-2 3 -6 26 -9 52 -14 116 -16 134 -22 162 -51 281 -199 551 -413 754 -150 143
-371 267 -582 326 -54 15 -57 18 -64 53 -18 100 -91 195 -177 232 -60 26 -145
32 -203 16z m135 -70 c0 11 80 -38 108 -67 27 -28 68 -116 59 -126 -2 -2 -37
0 -78 5 -88 9 -220 8 -306 -2 -71 -9 -75 -4 -50 57 39 92 148 155 235 136 17
-4 32 -5 32 -3z m120 -271 c136 -20 253 -55 390 -117 105 -48 262 -161 358
-257 214 -216 348 -505 376 -814 4 -51 3 -57 -12 -53 -9 3 -93 28 -187 56 -93
28 -173 54 -176 58 -3 4 -19 48 -34 97 -93 304 -313 529 -615 628 -181 60
-429 54 -605 -15 -285 -110 -495 -341 -578 -633 l-23 -79 -187 -57 c-103 -31
-188 -53 -188 -50 -2 9 -2 9 5 89 14 152 79 353 161 497 131 229 321 408 560
525 152 75 266 109 425 126 30 4 56 8 58 9 6 5 226 -3 272 -10z m35 -464 c244
-65 441 -225 555 -451 33 -66 74 -179 67 -186 -1 -1 -36 8 -77 21 -41 13 -113
35 -160 49 -47 14 -200 61 -341 104 l-255 78 -205 -62 c-112 -34 -300 -91
-416 -127 -140 -42 -213 -61 -213 -52 0 51 95 247 158 325 130 163 346 292
527 316 28 3 52 8 54 10 13 12 235 -7 306 -25z m-251 -543 c-1 -35 -2 -66 -3
-69 -1 -4 -15 -9 -33 -13 -41 -8 -119 -88 -134 -138 -34 -111 38 -255 139
-275 15 -3 27 -8 28 -12 4 -23 3 -134 -1 -136 -6 -4 -156 41 -695 205 -148 45
-316 96 -372 113 -57 17 -103 34 -103 37 0 4 10 10 23 12 12 3 195 58 407 123
619 188 735 223 741 219 3 -1 4 -31 3 -66z m118 63 c13 -6 264 -82 558 -171
294 -88 546 -166 560 -172 23 -10 19 -12 -55 -35 -44 -13 -87 -26 -95 -28 -16
-4 -540 -163 -992 -301 -16 -5 -18 3 -18 64 l0 70 55 27 c30 14 67 41 80 60
90 117 42 286 -97 342 l-38 15 0 69 c0 71 3 76 42 60z m-12 -226 c46 -24 73
-71 73 -125 0 -139 -174 -194 -258 -82 -14 19 -20 43 -20 82 0 62 21 100 70
124 38 20 98 20 135 1z m-1187 -226 c95 -29 178 -55 186 -59 8 -4 25 -44 37
-89 75 -258 253 -471 499 -594 64 -32 169 -64 253 -78 65 -10 226 -14 267 -5
11 2 40 7 64 11 70 12 175 50 259 95 216 116 386 329 455 567 13 46 26 85 29
88 6 7 357 115 371 115 22 0 -19 -238 -63 -372 -59 -176 -136 -304 -290 -481
-34 -39 -180 -157 -245 -199 -318 -205 -738 -257 -1106 -137 -436 141 -764
501 -869 954 -20 87 -36 235 -26 235 4 0 84 -23 179 -51z m922 -285 c99 -30
187 -55 195 -55 17 -1 71 15 525 154 171 52 311 94 313 93 1 -2 -7 -32 -19
-67 -81 -248 -264 -443 -504 -538 -44 -17 -91 -34 -105 -36 -204 -40 -390 -24
-552 48 -142 63 -283 183 -369 314 -47 73 -101 191 -113 249 l-7 31 228 -69
c125 -38 309 -94 408 -124z m200 -998 c44 0 112 3 151 7 l72 7 -8 -35 c-41
-181 -301 -224 -405 -67 -13 20 -27 52 -31 69 l-6 32 73 -7 c41 -3 110 -6 154
-6z"/>
<path d="M1589 2881 c-11 -5 -14 -32 -14 -115 0 -106 1 -109 23 -111 14 -1 22
4 23 14 1 9 2 25 3 36 2 31 26 24 45 -14 10 -21 25 -36 39 -38 26 -3 27 3 8
48 -13 30 -13 36 2 52 21 23 21 83 -1 104 -17 17 -104 33 -128 24z m98 -67 c5
-17 -14 -35 -41 -38 -23 -3 -26 0 -22 23 2 14 5 29 5 33 1 9 54 -6 58 -18z"/>
<path d="M1320 2843 c-42 -13 -60 -29 -74 -63 -40 -100 51 -197 147 -157 89
38 97 157 14 207 -31 20 -57 23 -87 13z m53 -52 c23 -9 36 -31 43 -68 4 -21
-29 -52 -59 -57 -19 -3 -33 1 -47 17 -11 11 -20 23 -21 26 0 3 -2 14 -4 25 -4
18 35 66 54 66 5 0 21 -4 34 -9z"/>
<path d="M1890 2808 c-14 -23 -32 -54 -41 -69 -8 -15 -23 -39 -33 -53 -9 -15
-14 -31 -11 -36 9 -15 43 -12 52 5 13 22 67 5 71 -22 2 -13 13 -23 29 -26 l25
-5 -5 116 c-5 116 -11 132 -47 132 -8 0 -26 -19 -40 -42z m40 -63 c0 -28 -4
-35 -20 -35 -11 0 -20 3 -20 6 0 7 33 64 37 64 2 0 3 -16 3 -35z"/>
<path d="M2096 2775 c-9 -23 -9 -23 18 -37 l24 -13 -27 -55 c-52 -108 -51
-105 -30 -118 17 -11 23 -4 59 68 22 44 44 80 48 80 4 0 14 -4 22 -10 16 -10
40 4 40 25 0 9 -69 46 -136 72 -6 2 -14 -3 -18 -12z"/>
<path d="M1026 2717 c-17 -13 -16 -18 34 -108 29 -52 54 -95 56 -97 1 -2 27
11 58 28 49 28 54 34 46 51 -12 21 -21 24 -35 10 -6 -5 -20 -12 -32 -15 -19
-6 -26 1 -52 51 -45 88 -53 96 -75 80z"/>
<path d="M2290 2573 c-36 -46 -66 -87 -68 -92 -1 -4 22 -27 52 -50 55 -41 55
-41 67 -19 10 18 8 24 -12 39 -13 10 -27 19 -31 19 -13 0 -9 27 5 39 11 8 18
6 32 -9 22 -25 41 -26 50 -3 4 12 -2 24 -19 38 -19 16 -23 24 -15 38 10 16 12
16 40 -8 17 -14 34 -25 39 -25 14 0 33 31 24 39 -5 4 -29 24 -54 43 l-45 35
-65 -84z"/>
<path d="M832 2579 c-23 -17 -42 -36 -42 -42 0 -7 20 -32 43 -57 23 -26 54
-61 69 -79 25 -29 30 -31 48 -18 l20 14 -21 27 -21 26 26 31 c29 34 31 47 15
82 -12 26 -47 47 -78 47 -9 0 -36 -14 -59 -31z m87 -38 c8 -14 6 -23 -10 -37
-20 -18 -21 -18 -39 6 -17 22 -17 25 -2 37 24 18 40 16 51 -6z"/>
<path d="M2490 2423 c-30 -25 -60 -53 -67 -62 -36 -47 18 -140 75 -126 28 6
73 35 130 83 30 25 31 29 19 47 -14 18 -17 17 -82 -33 -56 -43 -70 -50 -87
-41 -30 16 -19 38 48 95 48 40 59 55 52 68 -14 24 -28 19 -88 -31z"/>
<path d="M680 2425 c-11 -13 -10 -22 3 -51 l17 -34 -39 6 c-33 5 -41 3 -50
-15 -7 -11 -10 -21 -9 -22 6 -1 53 -9 80 -13 38 -6 41 -9 68 -65 13 -28 26
-51 29 -51 4 0 12 9 19 20 10 17 10 26 -3 50 -20 39 -20 40 17 29 27 -7 36 -5
52 11 25 24 22 27 -34 35 -71 10 -75 12 -100 65 -25 54 -31 58 -50 35z"/>
<path d="M2630 2175 c-76 -34 -94 -47 -92 -61 6 -28 10 -29 44 -16 45 17 56
-4 21 -40 -20 -21 -24 -33 -19 -54 l7 -27 33 32 c27 26 38 31 65 26 26 -4 37
0 62 25 26 26 30 35 23 62 -8 38 -35 98 -43 97 -3 0 -49 -20 -101 -44z m94
-40 c15 -39 -25 -66 -49 -32 -14 20 -14 23 2 34 23 17 40 16 47 -2z"/>
<path d="M515 2154 c-14 -31 -25 -59 -25 -63 0 -7 153 -79 185 -87 18 -4 25 4
48 57 21 48 24 65 15 71 -24 15 -35 8 -50 -31 -13 -33 -20 -39 -37 -34 -25 6
-25 6 -6 43 14 27 14 30 -4 40 -27 14 -28 14 -40 -20 -10 -31 -17 -35 -39 -21
-11 6 -10 15 5 45 15 32 15 38 3 46 -25 16 -29 12 -55 -46z"/>
<path d="M1170 2213 l0 -93 48 0 c52 0 73 14 90 60 13 35 -4 87 -34 106 -13 9
-42 17 -64 18 l-40 2 0 -93z m98 3 c4 -32 -13 -56 -39 -56 -16 0 -19 8 -19 48
0 27 3 52 7 55 12 13 48 -20 51 -47z"/>
<path d="M1374 2302 c-5 -4 -9 -45 -9 -92 l0 -85 58 -3 c52 -3 57 -1 57 18 0
17 -6 20 -40 20 -37 0 -40 2 -31 19 7 12 18 17 33 14 18 -3 24 0 25 16 1 17
-4 21 -28 21 -22 0 -29 5 -29 19 0 12 7 18 23 18 42 1 47 3 47 21 0 15 -9 19
-48 19 -27 1 -53 -2 -58 -5z"/>
<path d="M1541 2300 c-4 -3 -8 -45 -8 -93 0 -84 1 -88 21 -85 15 2 20 9 19 26
-2 12 1 23 5 23 4 1 18 3 31 4 39 4 61 39 50 77 -7 27 -21 45 -39 49 -18 4
-72 4 -79 -1z m79 -60 c0 -25 -38 -33 -45 -9 -4 10 -4 23 -1 28 10 15 46 0 46
-19z"/>
<path d="M1700 2234 c0 -66 3 -78 24 -99 18 -18 31 -23 53 -19 47 8 57 27 59
106 1 84 0 88 -24 82 -14 -4 -17 -17 -18 -70 0 -45 -5 -68 -14 -74 -25 -16
-39 10 -42 77 -2 54 -6 67 -20 69 -16 2 -18 -7 -18 -72z"/>
<path d="M1903 2302 c-6 -4 -11 -45 -11 -94 0 -79 2 -88 19 -88 13 0 19 7 20
23 4 134 3 157 -7 161 -6 2 -15 1 -21 -2z"/>
<path d="M2011 2293 c-13 -9 -21 -25 -21 -43 0 -24 7 -33 40 -50 22 -11 40
-25 40 -30 0 -17 -16 -19 -42 -6 -22 12 -26 11 -36 -4 -8 -14 -6 -20 11 -29
40 -21 66 -21 93 2 22 19 24 26 15 50 -6 15 -25 34 -46 44 -19 9 -35 20 -35
24 0 16 20 20 41 8 17 -9 23 -8 30 2 20 33 -52 59 -90 32z"/>
<path d="M2616 1392 c-2 -4 -13 -33 -24 -65 l-21 -58 27 -10 c37 -15 176 -59
184 -59 3 0 16 28 27 62 16 48 18 64 8 70 -23 15 -34 8 -46 -32 -12 -42 -17
-45 -40 -31 -12 8 -13 14 -2 37 10 22 10 29 -1 35 -23 15 -36 10 -47 -21 -6
-17 -17 -30 -27 -30 -17 0 -16 13 2 76 4 16 0 23 -15 27 -12 3 -23 2 -25 -1z"/>
<path d="M600 1355 c-9 -11 -23 -13 -50 -9 -65 11 -100 -51 -66 -114 8 -15 17
-39 21 -54 6 -32 21 -37 29 -10 4 12 15 17 38 16 49 -2 60 4 47 28 -6 11 -17
17 -24 14 -20 -7 -28 9 -11 24 10 7 21 8 33 2 58 -30 105 37 63 91 -24 30 -61
35 -80 12z m53 -50 c1 -5 -6 -11 -15 -13 -11 -2 -18 3 -18 13 0 17 30 18 33 0z
m-99 -17 c-18 -32 -27 -39 -35 -27 -11 18 1 39 23 39 12 0 17 -4 12 -12z"/>
<path d="M2521 1164 c-22 -28 -21 -33 19 -74 3 -3 18 -20 34 -38 l30 -32 -55
17 c-74 23 -99 22 -116 -4 -14 -21 -11 -24 72 -85 47 -35 90 -64 95 -66 5 -2
13 5 19 16 9 17 3 24 -39 53 -28 19 -50 37 -50 41 0 3 25 -2 55 -13 67 -23 72
-24 84 0 11 19 10 19 -63 100 l-31 34 50 -28 c28 -16 56 -33 63 -38 12 -10 42
7 42 24 0 4 -33 27 -72 50 -40 23 -83 49 -94 56 -20 13 -24 11 -43 -13z"/>
<path d="M689 1085 c-38 -21 -59 -58 -59 -106 0 -35 6 -47 36 -75 42 -40 68
-42 108 -10 l30 23 -23 36 c-25 41 -33 44 -51 22 -10 -12 -10 -18 -1 -29 19
-22 -7 -31 -30 -10 -40 36 -8 114 48 114 30 0 63 -34 58 -59 -2 -14 3 -25 16
-32 26 -14 31 -9 32 34 2 84 -87 134 -164 92z"/>
<path d="M2311 903 c-67 -35 -85 -120 -37 -176 53 -61 133 -57 185 9 26 33 27
79 1 121 -33 55 -95 74 -149 46z m72 -44 c37 -17 53 -53 39 -84 -26 -56 -105
-50 -120 9 -10 35 8 72 36 79 9 3 18 5 19 6 1 0 13 -4 26 -10z"/>
<path d="M880 844 c-47 -30 -89 -59 -94 -65 -15 -14 26 -40 41 -27 21 17 66
-18 59 -46 -4 -15 1 -29 13 -40 17 -16 20 -12 64 84 26 55 47 104 47 109 0 8
-33 41 -41 41 -2 0 -42 -25 -89 -56z m56 -43 c-11 -20 -21 -28 -31 -25 -21 8
-19 15 13 40 34 28 38 24 18 -15z"/>
<path d="M1079 759 c-25 -25 -20 -56 18 -106 18 -24 23 -37 16 -44 -14 -14
-53 6 -53 27 0 22 -44 14 -48 -8 -4 -23 38 -65 74 -74 39 -10 78 14 82 50 3
20 -6 42 -27 71 -17 24 -31 46 -31 49 0 15 40 4 54 -15 18 -26 52 -22 48 6 -5
30 -49 65 -83 65 -16 0 -38 -9 -50 -21z"/>
<path d="M2123 769 l-22 -8 25 -56 c14 -31 24 -58 23 -60 -2 -2 -29 16 -60 39
-44 34 -60 41 -77 35 -25 -9 -24 -12 30 -124 48 -99 46 -97 68 -83 17 11 17
13 -5 65 -13 29 -22 53 -19 53 3 0 28 -16 57 -35 54 -37 64 -40 85 -27 10 7 1
33 -35 109 -44 93 -50 100 -70 92z"/>
<path d="M1265 693 c-3 -10 -2 -19 3 -21 5 -1 17 -9 27 -16 16 -12 16 -17 -8
-94 -24 -78 -24 -82 -6 -87 22 -7 39 1 39 18 0 6 10 42 21 79 20 63 23 66 45
58 19 -8 26 -5 34 10 5 10 10 21 10 23 0 5 -132 47 -148 47 -5 0 -13 -8 -17
-17z"/>
<path d="M1783 655 c-82 -35 -81 -163 1 -207 46 -25 122 -4 149 41 35 59 12
137 -49 166 -39 18 -59 18 -101 0z m96 -61 c41 -52 18 -104 -44 -104 -58 0
-86 69 -45 110 28 28 64 25 89 -6z"/>
<path d="M1486 642 c-3 -9 -8 -61 -11 -114 l-6 -98 25 0 c23 0 26 4 26 35 0
23 5 35 13 35 14 0 37 -40 37 -65 0 -10 10 -15 30 -15 l29 0 -14 41 c-14 37
-13 42 5 62 42 45 6 126 -57 128 -15 0 -38 2 -50 5 -14 2 -24 -2 -27 -14z
m101 -58 c9 -23 -18 -44 -44 -34 -15 6 -20 15 -16 29 6 25 51 29 60 5z"/>
<path d="M1279 1166 c-1 -1 -3 -13 -5 -28 -2 -19 2 -28 12 -28 17 0 16 7 18
-110 l1 -95 28 -3 28 -3 -3 132 -3 133 -37 1 c-21 1 -39 1 -39 1z"/>
<path d="M1456 1149 c-13 -10 -27 -30 -30 -43 -11 -46 25 -105 67 -106 21 0
21 -2 -3 -50 -11 -22 -20 -41 -20 -43 0 -2 14 -4 31 -5 28 -1 33 5 65 71 39
81 43 131 14 165 -26 32 -90 37 -124 11z m82 -51 c14 -14 -2 -48 -22 -48 -20
0 -37 25 -30 44 7 19 35 21 52 4z"/>
<path d="M1703 1158 c-30 -14 -48 -70 -33 -98 8 -15 8 -25 1 -34 -49 -59 23
-150 103 -130 49 12 89 99 55 119 -6 4 -8 22 -4 46 9 51 -1 76 -35 94 -33 17
-56 18 -87 3z m70 -62 c8 -19 -16 -38 -37 -30 -16 6 -21 25 -9 37 12 12 41 7
46 -7z m7 -110 c0 -28 -33 -41 -51 -20 -17 20 -3 44 26 44 20 0 25 -5 25 -24z"/>
<path d="M1883 1163 c-7 -3 -13 -16 -13 -29 0 -22 4 -24 45 -24 30 0 45 -4 45
-13 0 -7 -13 -52 -29 -99 -16 -48 -27 -89 -23 -92 12 -13 50 -5 57 12 15 37
72 237 69 241 -5 5 -137 9 -151 4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,19 @@
{
"name": "Agis",
"short_name": "Agis",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-256x256.png",
"sizes": "256x256",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

View file

@ -1,5 +1,9 @@
img { max-width: 100%; } img { max-width: 100%; }
a {
color: $color-dark;
}
.form-check-input[type="checkbox"]:checked { .form-check-input[type="checkbox"]:checked {
#{--bs-form-check-bg-image}: url("@/images/global/checkbox-cross.svg"); #{--bs-form-check-bg-image}: url("@/images/global/checkbox-cross.svg");
border-color: var(--bs-form-check-bg); border-color: var(--bs-form-check-bg);

View file

@ -55,6 +55,11 @@
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
} }
&-img-container {
width: 134px;
height: 148px !important;
}
} }
} }

View file

@ -19,6 +19,7 @@
.seasonal-sections { .seasonal-sections {
.seasonal-sections-image { .seasonal-sections-image {
width: max-content;
height: min-content; height: min-content;
&.bg-agis-white { &.bg-agis-white {
@ -96,7 +97,7 @@
&::before { &::before {
position: absolute; position: absolute;
top: 0; top: 0;
left: -20rem; left: -19rem;
display: none; display: none;
width: 500px; width: 500px;
height: 500px; height: 500px;

View file

@ -1,40 +1,30 @@
.news {
.fs-news {
font-size: calc(1.375rem + 3.2vw)
}
.swiper-button {
&-prev,
&-next { width: 3rem; }
&-next { rotate: 180deg; }
&-disabled { opacity: .5; }
}
.swiper-slide {
&-content {
width: auto;
}
}
&-category-arrow{
width: 2rem;
height: 2rem;
rotate: 180deg;
}
&-show-w-85{
width: 85%;
}
}
.news-single { .news-single {
&-img.bg-agis-white { &-img.bg-agis-white {
background-position: bottom; background-position: bottom;
background-size: 100% 85%; background-size: 100% 85%;
} }
&-content{
h3 {
width: fit-content;
padding-right: 1rem;
padding-left: 1rem;
background: url("@/images/global/bg-title.svg");
background-position: center;
background-repeat: no-repeat;
background-size: 100%;
color: #fff;
font-family: 'Readex Pro', sans-serif !important;
font-size: x-large;
}
h2 {
font-family: $font-family-base;
font-size: xx-large;
font-weight: 600;
}
}
&-title { &-title {
width: 100%; width: 100%;
} }

View file

@ -52,6 +52,12 @@
.picto-img { .picto-img {
width: 35%; width: 35%;
} }
.cooking-advice {
ul {
list-style-position: inside;
}
}
} }
.swiper-product-pictures, .swiper-product-pictures,

View file

@ -6,61 +6,6 @@
&-img { &-img {
max-width: 15rem; max-width: 15rem;
} }
&-swiper {
.swiper-ranges {
position: relative;
.swiper-slide {
&-content {
width: 246px;
p {
hyphens: auto;
line-height: 1.2em;
word-break: break-word;
}
}
&-range {
max-width: 332px;
}
}
.swiper-button {
&-prev,
&-next { width: 3rem; }
&-next { rotate: 180deg; }
&-disabled { opacity: .5; }
}
}
}
&-flexwrap {
.col-4:nth-child(1),
.col-4:nth-child(3) {
transform: translateY(-3rem);
}
.card {
width: calc(246px + 3rem);
&-header {
height: 4em;
}
.card-body div {
transition: .3s ease-in-out;
}
&:hover .card-body div {
opacity: 1 !important;
visibility: visible !important;
}
}
}
} }
.range { .range {

View file

@ -1,7 +1,10 @@
<template> <template>
<div class="news-list container"> <div class="items-list container">
<!-- TITLE & SELECT --> <!-- TITLE & SELECT -->
<div class="row pt-5"> <div
v-if="showSelect"
class="row pt-5"
>
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<div class="ranges-title w-100 w-lg-fit"> <div class="ranges-title w-100 w-lg-fit">
<span class="divide d-block w-100 mt-xl-3 my-2" /> <span class="divide d-block w-100 mt-xl-3 my-2" />
@ -17,7 +20,7 @@
<select <select
class="form-control highlight yellow" class="form-control highlight yellow"
role="button" role="button"
@change="updateNews(1)" @change="updateItems(1)"
:disabled="intLoading" :disabled="intLoading"
> >
<option <option
@ -40,40 +43,73 @@
</div> </div>
<!-- MOBILE: SLIDER --> <!-- MOBILE: SLIDER -->
<div <div
class="news-slider d-block d-lg-none bg-agis-white pb-5" class="items-slider d-block d-lg-none bg-agis-white pb-5"
:class="(newsModels.length) ? '' : 'd-none'" :class="(itemModels.length) ? '' : 'd-none'"
> >
<div class="swiper swiper-news overflow-hidden"> <div class="swiper swiper-items overflow-hidden">
<div <div
class="swiper-wrapper" class="swiper-wrapper"
@touchend="checkActiveSlide()" @touchend="checkActiveSlide()"
> >
<div <div
class="swiper-slide swiper-slide-content" class="swiper-slide swiper-slide-content"
v-for="(news, id) in newsModels" v-for="(item, id) in itemModels"
:key="id" :key="id"
> >
<div class="swiper-slide-news-container"> <div class="swiper-slide-items-container">
<div class="mx-auto p-4"> <div class="mx-auto p-4">
<p
v-if="rangeId === null && !showSelect"
class="text-primary text-center f-readex-pro p-0"
>
{{ item.title }}
</p>
<img <img
class="card-img-top" class="card-img-top"
:src="(news.picture_thumbnail as string)" :src="urlPathBase + (item.picture_thumbnail as string)"
:alt="(news.picture_thumbnail_alt as string)" :alt="(item.picture_thumbnail_alt as string)"
:title="(news.picture_thumbnail_title as string)" :title="(item.picture_thumbnail_title as string)"
> >
<div class="card-body"> <div class="card-body">
<p class="card-text m-0"> <template v-if="rangeId === null && !showSelect">
{{ new Date(news.publish_at as string).toLocaleDateString() }} <p class="card-text m-0">
</p> {{ item.tagline }}
<p class="card-text m-0"> </p>
{{ news.title }} <a
</p> class="card-text m-0"
<a :href="getShowItemRoute(item.slug as string)"
class="card-text m-0" >
:href="getShowNewsRoute(news.slug as string)" {{ __('> En savoir +') }}
> </a>
{{ __('> Lire la suite') }} </template>
</a> <template v-if="showSelect">
<p class="card-text m-0">
{{ new Date(item.publish_at as string).toLocaleDateString() }}
</p>
<p class="card-text m-0">
{{ item.title }}
</p>
<a
class="card-text m-0"
:href="getShowItemRoute(item.slug as string)"
>
{{ __('> Lire la suite') }}
</a>
</template>
<template v-if="rangeId !== null">
<p class="card-text fw-bold m-0">
{{ item.title }}
</p>
<p class="card-text m-0">
{{ item.subtitle }}
</p>
<a
class="card-text m-0"
:href="getShowItemRoute(item.slug as string)"
>
{{ __('> En savoir +') }}
</a>
</template>
</div> </div>
</div> </div>
</div> </div>
@ -92,7 +128,8 @@
<button <button
v-if="intLoadingMore" v-if="intLoadingMore"
class="btn btn-primary" class="btn btn-primary"
@click="updateNews(page + 1, true)" :title="__('Cliquer pour charger la suite')"
@click="updateItems(page + 1, true)"
> >
{{ __('> Charger plus') }} {{ __('> Charger plus') }}
</button> </button>
@ -112,7 +149,10 @@
</div> </div>
</div> </div>
<!-- DESKTOP: FLEX WRAP --> <!-- DESKTOP: FLEX WRAP -->
<div class="position-relative d-none d-lg-flex row my-4"> <div
class="position-relative d-none d-lg-flex row my-4"
:class="(rangeId === null && !showSelect) ? 'ranges-flexwrap' : ((showSelect) ? 'news-flexwrap' : 'range-flexwrap')"
>
<template v-if="intLoading"> <template v-if="intLoading">
<div class="position-absolute top-0 left-0 bg-secondary w-100 h-100 d-flex justify-content-center align-items-center bg-opacity-25 z-1"> <div class="position-absolute top-0 left-0 bg-secondary w-100 h-100 d-flex justify-content-center align-items-center bg-opacity-25 z-1">
<div <div
@ -128,7 +168,7 @@
class="cards-container col-4" class="cards-container col-4"
> >
<div <div
class="bg-agis-white d-flex flex-column p-4 my-2" class="card bg-transparent border-0 bg-agis-white d-flex flex-column p-4 my-2"
:class="((index % 3 === 0) ? 'ms-auto' : (((index % 3 === 1)) ? 'me-auto' : 'mx-auto'))" :class="((index % 3 === 0) ? 'ms-auto' : (((index % 3 === 1)) ? 'me-auto' : 'mx-auto'))"
> >
<div class="placeholder-glow"> <div class="placeholder-glow">
@ -143,45 +183,80 @@
</template> </template>
<div <div
v-else v-else
v-for="(news, id) in newsModels" v-for="(item, id) in itemModels"
:key="id" :key="id"
class="cards-container col-4" class="cards-container col-4"
> >
<div <div
class="bg-agis-white d-flex flex-column p-4 my-2" class="card border-0 bg-transparent bg-agis-white d-flex flex-column p-4 my-2"
:class="((id % 3 === 0) ? 'me-auto' : (((id % 3 === 1)) ? 'mx-auto' : 'ms-auto'))" :class="((id % 3 === 0) ? 'ms-0 me-auto' : (((id % 3 === 1)) ? 'mx-auto' : 'ms-auto me-0'))"
> >
<div class="text-center"> <div class="text-center">
<img <template v-if="rangeId === null && !showSelect">
class="img-fluid w-auto" <p class="text-dark f-readex-pro p-0">
:src="(news.picture_thumbnail as string)" {{ item.title }}
:alt="(news.picture_thumbnail_alt as string)"
:title="(news.picture_thumbnail_title as string)"
>
</div>
<div class="card-body">
<p class="card-text m-0">
{{ new Date(news.publish_at as string).toLocaleDateString() }}
</p>
<p class="card-text m-0">
{{ news.title }}
</p>
<a
class="card-text m-0"
:href="getShowNewsRoute(news.slug as string)"
>
{{ __('> Lire la suite') }}
</a>
<template
v-for="(categoryEnum, categoryEnumIndex) in categoryEnums"
:key="categoryEnumIndex"
>
<p
class="card-text m-0"
v-if="news.category === categoryEnum.value"
>
{{ categoryEnum.label }}
</p> </p>
<a
:href="getShowItemRoute(item.slug as string)"
class="stretched-link"
/>
</template>
<div class="w-fit position-relative">
<div class="card-range-hover position-absolute top-0 start-0 w-100 h-100 bg-opacity-50 bg-light p-2">
<p class="text-dark f-readex-pro p-0">
{{ String(item.subtitle).substring(0,100) + (String(item.subtitle).length > 100 ? '...' : '') }}
</p>
</div>
<img
class="img-fluid w-auto"
:src="urlPathBase + (item.picture_thumbnail as string)"
:alt="(item.picture_thumbnail_alt as string)"
:title="(item.picture_thumbnail_title as string)"
>
</div>
</div>
<div class="card-body py-2 px-0">
<template v-if="showSelect">
<p
v-if="showSelect"
class="card-text m-0"
>
{{ new Date(item.publish_at as string).toLocaleDateString() }}
</p>
<p class="card-text m-0">
{{ item.title }}
</p>
<a
class="card-text m-0"
:href="getShowItemRoute(item.slug as string)"
>
{{ __('> Lire la suite') }}
</a>
<template
v-for="(categoryEnum, categoryEnumIndex) in categoryEnums"
:key="categoryEnumIndex"
>
<p
class="card-text m-0"
v-if="item.category === categoryEnum.value"
>
{{ categoryEnum.label }}
</p>
</template>
</template>
<template v-if="rangeId !== null">
<p class="card-text fw-bold mb-1">
{{ item.title }}
</p>
<p class="card-text m-0">
{{ item.subtitle }}
</p>
<a
class="card-text stretched-link m-0"
:href="getShowItemRoute(item.slug as string)"
>
{{ __('> En savoir +') }}
</a>
</template> </template>
</div> </div>
</div> </div>
@ -218,12 +293,12 @@
</ul> </ul>
</nav> </nav>
</div> </div>
<!-- NO NEWS --> <!-- NO ITEMS -->
<p <p
v-if="!intLoading" v-if="!intLoading"
:class="(newsModels.length <= 0) ? '' : 'd-none'" :class="(itemModels.length <= 0) ? '' : 'd-none'"
> >
{{ __('Aucune actualité n\'est disponible') }} {{ __('Aucune :name n\'est disponible', {'name': modelName}) }}
</p> </p>
</div> </div>
</template> </template>
@ -237,11 +312,11 @@ import route from "./../../modules/route";
import trans from "./../../modules/trans"; import trans from "./../../modules/trans";
export default defineComponent({ export default defineComponent({
name: "NewsListComponent", name: "ItemsListComponent",
mixins: [trans, route, parseLaravelErrorMessages], mixins: [trans, route, parseLaravelErrorMessages],
data(): { data(): {
newsModels: LaravelModelList; itemModels: LaravelModelList;
newsFilteredRoute: string; itemsFilteredRoute: string;
categoryEnums: { categoryEnums: {
label: string, label: string,
name: string, name: string,
@ -251,19 +326,25 @@ export default defineComponent({
swiper: Swiper|null, swiper: Swiper|null,
intLoading: boolean, intLoading: boolean,
intLoadingMore: boolean, intLoadingMore: boolean,
concatNewsFiltered: boolean, concatItemsFiltered: boolean,
page: number; page: number;
paginator: LaravelPaginator; paginator: LaravelPaginator;
routeFiltered: string;
routeShow: string;
showSelect: boolean;
modelName: string;
rangeId: number;
urlPathBase: string;
} { } {
return { return {
newsModels: [], itemModels: [],
newsFilteredRoute: "", itemsFilteredRoute: "",
categoryEnums: [], categoryEnums: [],
selectedValue: 0, selectedValue: 0,
swiper: null, swiper: null,
intLoading: false, intLoading: false,
intLoadingMore: false, intLoadingMore: false,
concatNewsFiltered: false, concatItemsFiltered: false,
page: 1, page: 1,
paginator: { paginator: {
current_page: 1, current_page: 1,
@ -279,36 +360,51 @@ export default defineComponent({
to: 1, to: 1,
total: 1, total: 1,
}, },
routeFiltered: "",
routeShow: "",
showSelect: false,
modelName: "",
rangeId: 0,
urlPathBase: "",
}; };
}, },
computed: {},
mounted() { mounted() {
const json = String(this.$attrs.json ?? "{}"), const json = String(this.$attrs.json ?? "{}"),
data = JSON.parse(json); data = JSON.parse(json);
this.newsModels = data.newsModels.data; this.modelName = data.modelName;
this.paginator = data.newsModels; this.itemModels = data.itemModels.data;
this.categoryEnums = data.categoryEnums; this.paginator = data.itemModels;
this.initSelect(); this.categoryEnums = data.categoryEnums ?? null;
this.routeFiltered = data.routeFiltered;
this.routeShow = data.routeShow;
this.showSelect = data.showSelect;
this.rangeId = data.range_id ?? null;
this.urlPathBase = window.location.origin + "/";
if (this.showSelect) {
this.$nextTick(() => {
this.initSelect();
});
}
this.initSwiper(); this.initSwiper();
}, },
methods: { methods: {
/** Init select ::after animation */ /** Init select ::after animation */
initSelect(): void { initSelect(): void {
const contactFormSelectList = document.querySelectorAll(".news-list .select-form select") as NodeListOf<HTMLSelectElement>; const contactFormSelectList = document.querySelectorAll(".items-list .select-form select") as NodeListOf<HTMLSelectElement>;
document.body.addEventListener("click", function (e: MouseEvent) { document.body.addEventListener("click", function (e: MouseEvent) {
const target = e.target as HTMLElement | null; const target = e.target as HTMLElement | null;
contactFormSelectList.forEach(select => { contactFormSelectList.forEach(select => {
if (select.contains(target)) { if (select.contains(target)) {
select.parentElement!.classList.toggle("active"); select.parentElement?.classList.toggle("active");
} else { } else {
select.parentElement!.classList.remove("active"); select.parentElement?.classList.remove("active");
} }
}); });
}); });
}, },
/** Init news slider */ /** Init items slider */
initSwiper(): void { initSwiper(): void {
this.swiper = new Swiper(".swiper-news", { this.swiper = new Swiper(".swiper-items", {
modules: [Navigation], modules: [Navigation],
grabCursor: true, grabCursor: true,
slidesPerView: 1, slidesPerView: 1,
@ -318,39 +414,45 @@ export default defineComponent({
prevEl: ".swiper-button-prev", prevEl: ".swiper-button-prev",
}, },
}); });
this.checkActiveSlide();
this.swiper.on("slideChange", () => {
setTimeout(this.checkActiveSlide, 300);
});
}, },
/** Get selected value */ /** Get selected value */
getSelectedValue(): number { getSelectedValue(): number {
let target = document.querySelector(".news-list .select-form select") as HTMLSelectElement | null; let target = document.querySelector(".items-list .select-form select") as HTMLSelectElement | null;
return Number(target?.value); return Number(target?.value);
}, },
/** Get filtered news route */ /** Get filtered items route */
getFilteredNewsRoute(): string { getFilteredItemsRoute(): string {
const route = this.route("fo.news.filtered"); const route = this.route(this.routeFiltered);
if (!route) { if (!route) {
throw new Error("Undefined route fo.news.filtered"); throw new Error("Undefined route " + this.routeFiltered);
} }
return route + "?page=" + this.page + "&category=" + this.selectedValue; return route + "?page=" + this.page +
((this.showSelect != null) ? "&category=" + this.selectedValue : "") +
((this.rangeId != null) ? "&range_id=" + this.rangeId : "");
}, },
/** Get show news route */ /** Get show item route */
getShowNewsRoute(slug: string): string { getShowItemRoute(slug: string): string {
const route = this.route("fo.news.show", { const route = this.route(this.routeShow, {
SLUG: slug, SLUG: slug,
}); });
if (!route) { if (!route) {
throw new Error("Undefined route fo.news.show"); throw new Error("Undefined route " + this.routeShow);
} }
return route; return route;
}, },
/** Get filtered news */ /** Get filtered items */
getFilteredNews(): void { getFilteredItems(): void {
window.axios window.axios
.get(this.newsFilteredRoute) .get(this.itemsFilteredRoute)
.then((response) => { .then((response) => {
if (this.intLoadingMore && this.concatNewsFiltered) { if (this.intLoadingMore && this.concatItemsFiltered) {
this.newsModels = this.newsModels.concat(Object.values(response.data.data)); this.itemModels = this.itemModels.concat(Object.values(response.data.data));
} else { } else {
this.newsModels = Object.values(response.data.data); this.itemModels = Object.values(response.data.data);
} }
this.paginator = response.data; this.paginator = response.data;
this.intLoading = false; this.intLoading = false;
@ -388,14 +490,16 @@ export default defineComponent({
} }
console.log(message); console.log(message);
}, },
/** Update news with filtered news */ /** Update items with filtered items */
updateNews(page: number, concat = false as boolean): void { updateItems(page: number, concat = false as boolean): void {
this.concatNewsFiltered = concat; this.concatItemsFiltered = concat;
this.page = page; this.page = page;
this.intLoading = true; this.intLoading = true;
this.selectedValue = this.getSelectedValue(); if (this.showSelect) {
this.newsFilteredRoute = this.getFilteredNewsRoute(); this.selectedValue = this.getSelectedValue();
this.getFilteredNews(); }
this.itemsFilteredRoute = this.getFilteredItemsRoute();
this.getFilteredItems();
}, },
/** Get all links from the paginator */ /** Get all links from the paginator */
navigateOnPage(pageUrl: string): void { navigateOnPage(pageUrl: string): void {
@ -403,7 +507,7 @@ export default defineComponent({
this.page = Number.parseInt( this.page = Number.parseInt(
String(new URL(pageUrl).searchParams.get("page") ?? 1) String(new URL(pageUrl).searchParams.get("page") ?? 1)
); );
this.updateNews(this.page); this.updateItems(this.page);
}, },
/** Check if it's the last slide is activated */ /** Check if it's the last slide is activated */
checkActiveSlide(): void { checkActiveSlide(): void {
@ -423,7 +527,42 @@ export default defineComponent({
@import "./../../../../node_modules/bootstrap/scss/functions"; @import "./../../../../node_modules/bootstrap/scss/functions";
@import "./../../../../node_modules/bootstrap/scss/variables"; @import "./../../../../node_modules/bootstrap/scss/variables";
@import "./../../../../node_modules/bootstrap/scss/mixins"; @import "./../../../../node_modules/bootstrap/scss/mixins";
.news-list { .items-list {
.swiper .swiper-button {
&-prev,
&-next { width: 3rem; }
&-next { rotate: 180deg; }
&-disabled { opacity: .5; }
}
.card-range-hover {
opacity: 0;
visibility: hidden;
transition: .3s;
}
.news-flexwrap .card {
max-width: calc(265px + 3rem);
}
.ranges-flexwrap {
.col-4:nth-child(1),
.col-4:nth-child(3) {
transform: translateY(-3rem);
}
.card {
max-width: calc(246px + 3rem);
&:hover .card-range-hover {
opacity: 1;
visibility: visible;
}
}
}
.range-flexwrap .card {
max-width: calc(332px + 3rem);
}
.cards-container .bg-agis-white .placeholder-image {
max-width: 265px;
width: 100%;
height: 354px;
}
.select-form { .select-form {
width: 100%; width: 100%;
@include media-breakpoint-up(lg) { @include media-breakpoint-up(lg) {
@ -454,13 +593,5 @@ export default defineComponent({
transform: rotate(270deg); transform: rotate(270deg);
} }
} }
.cards-container .bg-agis-white {
max-width: 314px;
.placeholder-image {
max-width: 265px;
width: 100%;
height: 354px;
}
}
} }
</style> </style>

View file

@ -9,26 +9,26 @@
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
@hasSection('canonical') @hasSection('canonical')
<link rel="canonical" href="@yield('canonical')" /> <link href="@yield('canonical')" rel="canonical" />
@else @else
<link rel="canonical" href="{{ url()->current() }}" /> <link href="{{ url()->current() }}" rel="canonical" />
@endif @endif
<!-- META INDEX, FOLLOW --> <!-- META INDEX, FOLLOW -->
@hasSection('metaIndex') @hasSection('metaIndex')
<meta name="robots" content="@yield('metaIndex')"> <meta name="robots" content="@yield('metaIndex')">
@else @else
<meta name="robots" content="index, follow"> <meta name="robots" content="index, follow">
@endif @endif
<!-- Favicon --> {{-- Favicon --}}
{{-- GENERER favicon avec un outil https://realfavicongenerator.net/ --}} {{-- GENERER favicon avec un outil https://realfavicongenerator.net/ --}}
<link rel="apple-touch-icon" sizes="180x180" href=""> <link href="{{ asset('apple-touch-icon.png') }}" rel="apple-touch-icon" sizes="180x180">
<link rel="icon" type="image/png" sizes="32x32" href=""> <link type="image/png" href="{{ asset('favicon-32x32.png') }}" rel="icon" sizes="32x32">
<link rel="icon" type="image/png" sizes="16x16" href=""> <link type="image/png" href="{{ asset('favicon-16x16.png') }}" rel="icon" sizes="16x16">
<link rel="manifest" href=""> <link href="{{ asset('site.webmanifest') }}" rel="manifest">
<link rel="mask-icon" href="" color="#5bbad5"> <link href="{{ asset('safari-pinned-tab.svg') }}" rel="mask-icon" color="#4a4a4a">
<meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileColor" content="#ffc40d">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
@include('modules.breadcrumbs.breadcrumb-head') @include('modules.breadcrumbs.breadcrumb-head')
@ -36,6 +36,8 @@
<!-- STYLES --> <!-- STYLES -->
@vite(['resources/sass/bo/bo.scss']) @vite(['resources/sass/bo/bo.scss'])
@if(config('app.debug')) @if (config('app.debug'))
<script nonce="{{ $nonce }}">window.vueDebug = true;</script> <script nonce="{{ $nonce }}">
window.vueDebug = true;
</script>
@endif @endif

View file

@ -353,6 +353,7 @@
'id' => 'newsPublishedAt', 'id' => 'newsPublishedAt',
'name' => 'publish_at', 'name' => 'publish_at',
'model' => $newsModel ?? null, 'model' => $newsModel ?? null,
'required' => true,
'helper' => __('crud.helpers.publish_at', [ 'helper' => __('crud.helpers.publish_at', [
'model' => __('models.classes.news'), 'model' => __('models.classes.news'),
]), ]),

View file

@ -340,12 +340,12 @@
@include('bo.partials.inputs.varchar-picture', [ @include('bo.partials.inputs.varchar-picture', [
'id' => 'rangePictureProductsheet', 'id' => 'rangePictureProductsheet',
'name' => 'picture_productsheet', 'name' => 'picture_productsheet',
'width' => 332, 'width' => 680,
'height' => 442, 'height' => 300,
'model' => $rangeModel ?? null, 'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.dimensions_must_be', [ 'helper' => __('crud.minicrud.dimensions_must_be', [
'widthpx' => '332px', 'widthpx' => '680px',
'heightpx' => '442px', 'heightpx' => '300px',
]), ]),
'required' => true, 'required' => true,
'preview' => true, 'preview' => true,

View file

@ -18,14 +18,13 @@
- **{{ __('validation.attributes.message') }}:** {{ $data->message }} - **{{ __('validation.attributes.message') }}:** {{ $data->message }}
@endcomponent @endcomponent
@if( @if (
$data->product_name !== null || !empty($data->product_name) ||
$data->product_date_limit !== null || !empty($data->product_date_limit) ||
$data->product_barcode !== null || !empty($data->product_barcode) ||
$data->product_lot !== null || !empty($data->product_lot) ||
$data->product_date_consumption !== null || !empty($data->product_date_consumption) ||
$data->product_location !== null !empty($data->product_location))
)
### Information sur le produit: ### Information sur le produit:
@component('mail::panel') @component('mail::panel')
- **{{ __('validation.custom.product_name') }}:** {{ $data->product_name ?? '' }} - **{{ __('validation.custom.product_name') }}:** {{ $data->product_name ?? '' }}
@ -37,5 +36,5 @@
@endcomponent @endcomponent
@endif @endif
L'équipe {{ config('app.name') }} L'équipe {{ config('app.name') }}.
@endcomponent @endcomponent

View file

@ -2,27 +2,34 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-3 d-none d-lg-block text-end"> <div class="col-3 d-none d-lg-block text-end">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/layout/footer-left-logo.svg') }}" @if(!empty($randomStampsFooter) && isset($randomStampsFooter[0]))
alt="{{ __('Départ, Inspiration Asie') }}" /> <img class="img-fluid" src="{{ asset($randomStampsFooter[0]->picture) }}"
title="{{ __($randomStampsFooter[0]->picture_title) }}" alt="{{ __($randomStampsFooter[0]->picture_alt) }}" />
@endif
</div> </div>
<div class="col-12 col-lg-6 footer-header text-center"> <div class="col-12 col-lg-6 footer-header text-center">
<div class="h1 text-uppercase f-sheldon">{{ __('Envie d\'exploration') }}</div> <div class="h1 text-uppercase f-sheldon">{{ __('Envie d\'exploration') }}</div>
<div class="h2 text-uppercase f-sheldon">{{ __('Suivez-nous sur') }}</div> <div class="h2 text-uppercase f-sheldon">{{ __('Suivez-nous sur') }}</div>
</div> </div>
<div class="col-3 d-none d-lg-block text-start"> <div class="col-3 d-none d-lg-block text-start">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/layout/footer-right-logo.svg') }}" @if(!empty($randomStampsFooter) && isset($randomStampsFooter[1]))
alt="{{ __('Départ, Inspiration Italie') }}" /> <img class="img-fluid" src="{{ asset($randomStampsFooter[1]->picture) }}"
title="{{ __($randomStampsFooter[1]->picture_title) }}" alt="{{ __($randomStampsFooter[1]->picture_alt) }}" />
@endif
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col text-center"> <div class="col text-center">
<a class="text-decoration-none" href="#FIXME:Change this" title="{{ __('Nous suivre sur Instagram') }}" target="_blank"> <a class="text-decoration-none" href="https://www.instagram.com/agis_explorateur_et_gastronome/"
title="{{ __('Nous suivre sur Instagram') }}" target="_blank">
@include('fo.partials.social-svg-instagram') @include('fo.partials.social-svg-instagram')
</a> </a>
<a class="text-decoration-none" href="#FIXME:Change this" title="{{ __('Nous suivre sur Facebook') }}" target="_blank"> <a class="text-decoration-none" href="https://www.facebook.com/AgisGroupeLDC" title="{{ __('Nous suivre sur Facebook') }}"
target="_blank">
@include('fo.partials.social-svg-facebook') @include('fo.partials.social-svg-facebook')
</a> </a>
<a class="text-decoration-none" href="#FIXME:Change this" title="{{ __('Nous suivre sur Linkedin') }}" target="_blank"> <a class="text-decoration-none" href="https://www.linkedin.com/company/agis-groupe-ldc/mycompany/?viewAsMember=true"
title="{{ __('Nous suivre sur Linkedin') }}" target="_blank">
@include('fo.partials.social-svg-linkedin') @include('fo.partials.social-svg-linkedin')
</a> </a>
</div> </div>
@ -54,19 +61,19 @@
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-uppercase @if (request()->routeIs('CHANGEME')) active @endif py-1" data-bs-toggle="tooltip" <a class="nav-link text-uppercase @if (request()->routeIs('fo.ranges.*')) active @endif py-1" data-bs-toggle="tooltip"
href="{{ route('fo.ranges.index') }}" title="{{ __('Nos gammes') }}"> href="{{ route('fo.ranges.index') }}" title="{{ __('Nos gammes') }}">
{{ __('Nos gammes') }} {{ __('Nos gammes') }}
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-uppercase @if (request()->routeIs('CHANGEME')) active @endif py-1" data-bs-toggle="tooltip" <a class="nav-link text-uppercase @if (request()->routeIs('fo.aboutus.*')) active @endif py-1" data-bs-toggle="tooltip"
href="{{ route('fo.aboutus.show') }}" title="{{ __('Nous connaitre') }}"> href="{{ route('fo.aboutus.show') }}" title="{{ __('Nous connaitre') }}">
{{ __('Nous connaitre') }} {{ __('Nous connaitre') }}
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-uppercase cn-cookie-link @if (request()->routeIs('CHANGEME')) active @endif py-1" <a class="nav-link text-uppercase cn-cookie-link py-1"
data-bs-toggle="tooltip" href="#" title="{{ __('Gestion des cookies') }}"> data-bs-toggle="tooltip" href="#" title="{{ __('Gestion des cookies') }}">
{{ __('cookie-notice.button_customize_cookies') }} {{ __('cookie-notice.button_customize_cookies') }}
</a> </a>

View file

@ -1,7 +1,11 @@
<!-- Meta --> <!-- Meta -->
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@hasSection('metaIndex')<meta name="robots" content="@yield('metaIndex')">@else<meta name="robots" content="index, follow">@endif @hasSection('metaIndex')
<meta name="robots" content="@yield('metaIndex')">
@else
<meta name="robots" content="index, follow">
@endif
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="description" content="@yield('description')"> <meta name="description" content="@yield('description')">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -14,29 +18,29 @@
<meta property="og:image" content="" /> <meta property="og:image" content="" />
<meta property="og:description" content="@yield('description')" /> <meta property="og:description" content="@yield('description')" />
<!-- Favicon --> {{-- Favicon --}}
{{-- GENERER favicon avec un outil https://realfavicongenerator.net/ --}} {{-- GENERER favicon avec un outil https://realfavicongenerator.net/ --}}
<link rel="apple-touch-icon" sizes="180x180" href=""> <link href="{{ asset('apple-touch-icon.png') }}" rel="apple-touch-icon" sizes="180x180">
<link rel="icon" href=""> <link type="image/png" href="{{ asset('favicon-32x32.png') }}" rel="icon" sizes="32x32">
<link rel="icon" type="image/png" sizes="32x32" href=""> <link type="image/png" href="{{ asset('favicon-16x16.png') }}" rel="icon" sizes="16x16">
<link rel="icon" type="image/png" sizes="16x16" href=""> <link href="{{ asset('site.webmanifest') }}" rel="manifest">
<link rel="manifest" href=""> <link href="{{ asset('safari-pinned-tab.svg') }}" rel="mask-icon" color="#4a4a4a">
<link rel="mask-icon" href="" color="#5bbad5"> <meta name="msapplication-TileColor" content="#ffc40d">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<!-- Others --> <!-- Others -->
<title>{{ config('app.name') }} - @yield('title')</title> <title>{{ config('app.name') }} - @yield('title')</title>
@if(config('app.debug')) @if (config('app.debug'))
<script nonce="{{ $nonce }}">window.vueDebug = true;</script> <script nonce="{{ $nonce }}">
window.vueDebug = true;
</script>
@endif @endif
@hasSection('canonical') @hasSection('canonical')
<link rel="canonical" href="@yield('canonical')" /> <link href="@yield('canonical')" rel="canonical" />
@else @else
<link rel="canonical" href="{{ \config('app.url') }}/{{ \request()->path() }}" /> <link href="{{ \config('app.url') }}/{{ \request()->path() }}" rel="canonical" />
@endif @endif
<!-- STYLES --> <!-- STYLES -->
@vite(['resources/sass/fo/fo.scss']) @vite(['resources/sass/fo/fo.scss'])
@stack('styles') @stack('styles')

View file

@ -16,6 +16,10 @@
href="{{ route('fo.aboutus.show') }}" title="{{ __('Nous connaitre') }}"> href="{{ route('fo.aboutus.show') }}" title="{{ __('Nous connaitre') }}">
{{ __('Nous connaitre') }} {{ __('Nous connaitre') }}
</a> </a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('fo.convictions')) active @endif" data-bs-toggle="tooltip"
href="{{ route('fo.convictions') }}" title="{{ __('Nos convictions') }}">
{{ __('Nos convictions') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('fo.news.*')) active @endif" data-bs-toggle="tooltip" <a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('fo.news.*')) active @endif" data-bs-toggle="tooltip"
href="{{ route('fo.news.index') }}" title="{{ __('Nos actualités') }}"> href="{{ route('fo.news.index') }}" title="{{ __('Nos actualités') }}">
{{ __('Nos actualités') }} {{ __('Nos actualités') }}

File diff suppressed because one or more lines are too long

View file

@ -67,7 +67,7 @@
</div> </div>
<div class="col-12 col-md-6 p-0"> <div class="col-12 col-md-6 p-0">
<fieldset class="d-flex flex-column justify-content-center align-items-start pe-md-5"> <fieldset class="d-flex flex-column justify-content-center align-items-start pe-md-5">
<label class="mt-1">{{ Str::of(__('validation.attributes.email'))->ucFirst() }}&nbsp;:</label> <label class="mt-1">{{ Str::of(__('validation.attributes.email'))->ucFirst() }}*&nbsp;:</label>
<input class="form-control" name="email" value="{{ old('email') }}" required> <input class="form-control" name="email" value="{{ old('email') }}" required>
</fieldset> </fieldset>
</div> </div>
@ -188,11 +188,14 @@
</div> </div>
</fieldset> </fieldset>
</div> </div>
<p class="highlight white w-100 w-xl-fit m-0 mx-auto my-5 px-5 text-center">
{{ __('Laissez nous votre message, le service consommateurs vous répondra par mail dans les plus brefs délais.') }}
</p>
</div> </div>
<div class="col-12 mb-3 p-0"> <div class="col-12 mb-3 p-0">
<fieldset class="d-flex flex-column justify-content-center align-items-start"> <fieldset class="d-flex flex-column justify-content-center align-items-start">
<label class="mt-1" for="message"> <label class="mt-1" for="message">
{{ Str::of(__('message'))->ucFirst()->value() }}*&nbsp;: {{ Str::of(__('message'))->ucFirst()->value() }} {{ __('(entre 3 et 500 caractères)') }}*&nbsp;:
</label> </label>
<textarea class="form-control" id="message" name="message" rows="6" required>{{ old('message') }}</textarea> <textarea class="form-control" id="message" name="message" rows="6" required>{{ old('message') }}</textarea>
</fieldset> </fieldset>

View file

@ -9,8 +9,8 @@
<section class="convictions col-12 overflow-hidden"> <section class="convictions col-12 overflow-hidden">
<!-- TITLE CARD --> <!-- TITLE CARD -->
<section class="title-card"> <section class="title-card">
<div class="my-2 px-5 py-2 text-center lh-sm"> <div class="lh-sm my-2 px-5 py-2 text-center">
<h1 class="f-sheldon text-uppercase w-fit mx-auto"> <h1 class="f-sheldon text-uppercase mx-auto w-fit">
<span class="divide d-block mt-xl-5 mb-3 mt-4"></span> <span class="divide d-block mt-xl-5 mb-3 mt-4"></span>
{{ $staticPageModel->title }} {{ $staticPageModel->title }}
<span class="divide d-block mb-3 mt-3"></span> <span class="divide d-block mb-3 mt-3"></span>
@ -19,27 +19,28 @@
</section> </section>
<section class="feed container my-4"> <section class="feed container my-4">
<h2 class="black-title text-white f-readex-pro w-100 text-center px-4"> <h2 class="black-title f-readex-pro w-100 px-4 text-center text-white">
{{ __('01 Bien nourrir') }} {{ __('01 Bien nourrir') }}
</h2> </h2>
<div class="row"> <div class="row">
<div class="col-12 col-lg-6 my-4"> <div class="col-12 col-lg-6 my-4">
<div class="d-flex align-items-center align-items-lg-start"> <div class="d-flex align-items-center align-items-lg-start">
<p class="text-tertiary f-sheldon me-3">{{ $convictionpageModel->key_feed }}%</p> <p class="text-tertiary f-sheldon me-3">
<p class="f-readex-pro fw-bold text-justify pt-lg-3 pt-xl-4">{{ __('de nos approvisionnements en viande et volaille sont origine FRANCE') }}&nbsp;!</p> {{ rtrim(rtrim(number_format($convictionpageModel->key_feed, 2, ',', ' '), '0'), ',') }}%</p>
<p class="f-readex-pro fw-bold pt-lg-3 pt-xl-4 text-justify">
{{ __('de nos approvisionnements en viande et volaille sont origine FRANCE') }}&nbsp;!</p>
</div> </div>
</div> </div>
<div class="col-12 col-lg-6 my-4"> <div class="col-12 col-lg-6 my-4">
<div class="d-flex justify-content-center justify-content-lg-end flag"> <div class="d-flex justify-content-center justify-content-lg-end flag">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/french-flag.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/french-flag.png') }}"
alt="{{ __('Dessin d\'un drapeau français entouré de coeurs') }}" title="{{ __('Drapeau français') }}" alt="{{ __('Dessin d\'un drapeau français entouré de coeurs') }}">
title="{{ __('Drapeau français') }}">
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<p class="fw-bold"> <p class="fw-bold">
{{ __('Les produits Traiteur étant de plus en plus présents dans l\'alimentation, nous renforçons la confiance des consommateurs par') }}&nbsp;: {{ __('Les produits Traiteur étant de plus en plus présents dans l\'alimentation, nous renforçons la confiance des consommateurs par') }}&nbsp;:
</p> </p>
<ul class="mb-0"> <ul class="mb-0">
@ -61,10 +62,8 @@
</li> </li>
</ul> </ul>
<div class="w-100 d-flex justify-content-center"> <div class="w-100 d-flex justify-content-center">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/chicken.png') }}" <img class="my-4" src="{{ Vite::asset('resources/assets/images/convictionpage/chicken.png') }}"
alt="{{ __('Dessin d\'un poulet picorant des graines') }}" title="{{ __('Poulet qui picore') }}" alt="{{ __('Dessin d\'un poulet picorant des graines') }}">
title="{{ __('Poulet qui picore') }}"
class="my-4">
</div> </div>
</div> </div>
</div> </div>
@ -72,22 +71,22 @@
<section class="earth bg-agis-yellow"> <section class="earth bg-agis-yellow">
<div class="container"> <div class="container">
<h2 class="black-title text-white f-readex-pro w-100 text-center px-4"> <h2 class="black-title f-readex-pro w-100 px-4 text-center text-white">
{{ __('02 Respecter la Terre') }} {{ __('02 Respecter la Terre') }}
</h2> </h2>
</div> </div>
<div class="row values"> <div class="row values">
<div class="col-12 col-md-6 mt-4"> <div class="col-12 col-md-6 mt-4">
<div class="row mb-3 h-100"> <div class="row h-100 mb-3">
<div class="col-6 ps-0"> <div class="col-6 ps-0">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/candle.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/candle.png') }}" title="{{ __('Bougie') }}"
alt="{{ __('Dessin d\'une main tenant une bougie allumée') }}" alt="{{ __('Dessin d\'une main tenant une bougie allumée') }}">
title="{{ __('Bougie') }}">
</div> </div>
<div class="col-6"> <div class="col-6">
<div class="h-100 d-flex justify-content-center align-items-center"> <div class="h-100 d-flex justify-content-center align-items-center">
<div class="f-sheldon w-fit mx-auto text-center text-md-end"> <div class="f-sheldon text-md-end mx-auto w-fit text-center">
<p class="value mb-0">{{ $convictionpageModel->key_earth_1 }}%</p> <p class="value mb-0">
{{ rtrim(rtrim(number_format($convictionpageModel->key_earth_1, 2, ',', ' '), '0'), ',') }}%</p>
<p class="fs-2 mb-0">{{ __('d\'énergie') }}</p> <p class="fs-2 mb-0">{{ __('d\'énergie') }}</p>
<p class="f-readex-pro mb-0">{{ __('économisées') }}</p> <p class="f-readex-pro mb-0">{{ __('économisées') }}</p>
</div> </div>
@ -100,8 +99,9 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="h-100 d-flex justify-content-center align-items-center"> <div class="h-100 d-flex justify-content-center align-items-center">
<div class="f-sheldon w-fit mx-auto text-center text-md-start"> <div class="f-sheldon text-md-start mx-auto w-fit text-center">
<p class="value mb-0">{{ $convictionpageModel->key_earth_2 }}%</p> <p class="value mb-0">
{{ rtrim(rtrim(number_format($convictionpageModel->key_earth_2, 2, ',', ' '), '0'), ',') }}%</p>
<p class="fs-2 mb-0">{{ __('d\'eau') }}</p> <p class="fs-2 mb-0">{{ __('d\'eau') }}</p>
<p class="f-readex-pro mb-0">{{ __('économisées') }}</p> <p class="f-readex-pro mb-0">{{ __('économisées') }}</p>
</div> </div>
@ -110,8 +110,7 @@
<div class="col-6"> <div class="col-6">
<div class="pe-5"> <div class="pe-5">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/watercan.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/watercan.png') }}"
alt="{{ __('Dessin d\'un arrosoir versant quelques gouttes') }}" title="{{ __('Arrosoir') }}" alt="{{ __('Dessin d\'un arrosoir versant quelques gouttes') }}">
title="{{ __('Arrosoir') }}">
</div> </div>
</div> </div>
</div> </div>
@ -121,26 +120,26 @@
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<div class="row justify-content-center align-items-end"> <div class="row justify-content-center align-items-end">
<div class="d-none d-lg-flex col-2 mb-2 justify-content-end"> <div class="d-none d-lg-flex col-2 justify-content-end mb-2">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/arrow2.png') }}" <img class="me-0" src="{{ Vite::asset('resources/assets/images/convictionpage/arrow2.png') }}"
alt="{{ __('Flèche reliant l\'énergie économisée à la période') }}"
title="{{ __('Flèche vers la droite') }}" title="{{ __('Flèche vers la droite') }}"
class="me-0"> alt="{{ __('Flèche reliant l\'énergie économisée à la période') }}">
</div> </div>
<div class="col-7 col-lg-4 text-center"> <div class="col-7 col-lg-4 text-center">
<p class="text-uppercase f-readex-pro fs-5 fw-bold bg-white-svg mb-0 px-2">{{ __('sur 3 ans') }}</p> <p class="text-uppercase f-readex-pro fs-5 fw-bold bg-white-svg mb-0 px-2">{{ __('sur 3 ans') }}</p>
</div> </div>
<div class="d-none d-lg-block col-2 mb-2"> <div class="d-none d-lg-block col-2 mb-2">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/arrow3.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/arrow3.png') }}"
alt="{{ __('Flèche reliant l\'eau économisée à la période') }}" title="{{ __('Flèche vers la gauche') }}" alt="{{ __('Flèche reliant l\'eau économisée à la période') }}">
title="{{ __('Flèche vers la gauche') }}">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row mt-4 pb-4"> <div class="row mt-4 pb-4">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<p class="fw-bold">{{ __('Nous conduisons des actions pluriannuelles pour conduire un développement durable et mieux préserver notre planète et ses ressources') }}&nbsp;:</p> <p class="fw-bold">
{{ __('Nous conduisons des actions pluriannuelles pour conduire un développement durable et mieux préserver notre planète et ses ressources') }}&nbsp;:
</p>
<ul class="mb-0"> <ul class="mb-0">
<li> <li>
{{ __('Développement de matériaux d\'emballages recyclables et durables') }} {{ __('Développement de matériaux d\'emballages recyclables et durables') }}
@ -165,73 +164,81 @@
{{ __('Développement du photovoltaïque') }} {{ __('Développement du photovoltaïque') }}
</li> </li>
</ul> </ul>
<p class="fw-bold mt-5">{{ __('Un générateur photovoltaïque d\'une puissance de 62 Kw est en service depuis 2009 sur le site d\'Avignon et a permis de réduire les émissions de CO2 de 158 T/an depuis son installation.') }}</p> <p class="fw-bold mt-5">
{{ __('Un générateur photovoltaïque d\'une puissance de 62 Kw est en service depuis 2009 sur le site d\'Avignon et a permis de réduire les émissions de CO2 de 158 T/an depuis son installation.') }}
</p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
{{-- VIVRE ENSEMBLE --}}
<section class="together container-fluid my-4"> <section class="together container-fluid my-4">
<div class="container"> <div class="container">
<h2 class="black-title text-white f-readex-pro w-100 text-center px-4 my-5"> <h2 class="black-title f-readex-pro w-100 my-5 px-4 text-center text-white">
{{ __('03 Vivre ensemble') }} {{ __('03 Vivre ensemble') }}
</h2> </h2>
<div class="row"> <div class="row align-items-start mb-4">
<div class="col-12 col-sm-6 col-lg-3 mb-3"> <div class="col-12 col-sm-6 col-lg-3 mb-3">
<div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-5 text-center"> <div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-2 text-center">
<div class="h-100 d-flex align-items-center"> <div class="together-img-container h-100 d-flex align-items-center">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/balloons.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/balloons.png') }}"
alt="{{ __('Dessin de 3 ballons') }}" title="{{ __('Ballons') }}" alt="{{ __('Dessin de 3 ballons') }}">
title="{{ __('Ballons') }}">
</div> </div>
<p class="value text-uppercase fw-bold text-white fs-4 px-3 mt-3 mb-1">{{ $convictionpageModel->key_together_1 }} {{ __('ans')}}</p> <p class="value text-uppercase fw-bold fs-4 mb-1 mt-3 px-3 text-white">
<p>{{ __('d\'ancienneté moyenne')}}</p> {{ rtrim(rtrim(number_format($convictionpageModel->key_together_1, 2, ',', ' '), '0'), ',') }}
{{ __('ans') }}</p>
<p>{{ __('d\'ancienneté moyenne') }}</p>
</div> </div>
</div> </div>
<div class="col-12 col-sm-6 col-lg-3 mb-3"> <div class="col-12 col-sm-6 col-lg-3 mb-3">
<div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-5 text-center"> <div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-2 text-center">
<div class="h-100 d-flex align-items-center"> <div class="together-img-container h-100 d-flex align-items-center">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/cart.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/cart.png') }}" title="{{ __('Caddie') }}"
alt="{{ __('Dessin d\'un caddie de course') }}" alt="{{ __('Dessin d\'un caddie de course') }}">
title="{{ __('Caddie') }}">
</div> </div>
<p class="value text-uppercase fw-bold text-white fs-4 px-3 mt-3 mb-1">{{ $convictionpageModel->key_together_2 }}€</p> <p class="value text-uppercase fw-bold fs-4 mb-1 mt-3 px-3 text-white">
<p>{{ __('consacrés au budget formation')}}</p> {{ rtrim(rtrim(number_format($convictionpageModel->key_together_2, 2, ',', ' '), '0'), ',') }}€
</p>
<p>{{ __('consacrés au budget formation') }}</p>
</div> </div>
</div> </div>
<div class="col-12 col-sm-6 col-lg-3 mb-3"> <div class="col-12 col-sm-6 col-lg-3 mb-3">
<div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-5 text-center"> <div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-2 text-center">
<div class="h-100 d-flex align-items-center"> <div class="together-img-container h-100 d-flex align-items-center">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/contract.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/contract.png') }}"
alt="{{ __('Dessin d\'un crayon laissant une trace') }}" title="{{ __('Signature') }}" alt="{{ __('Dessin d\'un crayon laissant une trace') }}">
title="{{ __('Signature') }}">
</div> </div>
<p class="value text-uppercase fw-bold text-white fs-4 px-3 mt-3 mb-1">{{ $convictionpageModel->key_together_3 }}</p> <p class="value text-uppercase fw-bold fs-4 mb-1 mt-3 px-3 text-white">
<p>{{ __('CDI signés sur 3 ans')}}</p> {{ rtrim(rtrim(number_format($convictionpageModel->key_together_3, 2, ',', ' '), '0'), ',') }}
</p>
<p>{{ __('CDI signés sur 3 ans') }}</p>
</div> </div>
</div> </div>
<div class="col-12 col-sm-6 col-lg-3 mb-3"> <div class="col-12 col-sm-6 col-lg-3 mb-3">
<div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-5 text-center"> <div class="h-100 d-flex flex-column align-items-center justify-content-center f-readex-pro px-2 text-center">
<div class="h-100 d-flex align-items-center"> <div class="together-img-container h-100 d-flex align-items-center">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/hands.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/hands.png') }}" title="{{ __('Mains') }}"
alt="{{ __('Dessin de 2 mains liées') }}" alt="{{ __('Dessin de 2 mains liées') }}">
title="{{ __('Mains') }}">
</div> </div>
<p class="value text-uppercase fw-bold text-white fs-4 px-3 mt-3 mb-1">{{ $convictionpageModel->key_together_4 }}</p> <p class="value text-uppercase fw-bold fs-4 mb-1 mt-3 px-3 text-white">
<p>{{ __('Index égalité Homme/Femme')}}</p> {{ rtrim(rtrim(number_format($convictionpageModel->key_together_4, 2, ',', ' '), '0'), ',') }}
</p>
<p>{{ __('Index égalité Homme/Femme') }}</p>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<p class="fw-bold mb-4">{{ __('Développer le potentiel humain avec des conditions de travail épanouissantes et sécurisées. Le bien-être et le bien-vivre au coeur de notre réussite.') }}</p> <p class="fw-bold mb-4">
{{ __('Développer le potentiel humain avec des conditions de travail épanouissantes et sécurisées. Le bien-être et le bien-vivre au coeur de notre réussite.') }}
</p>
<ul> <ul>
<li> <li>
{{ __('Renforcer les valeurs fondamentales') }}&nbsp;: {{ __('Renforcer les valeurs fondamentales') }}&nbsp;:
</li> </li>
</ul> </ul>
<p class="text-center text-lg-start">{{ __('Le respect - L\'écoute et l\'accompagnement') }}</p> <p class="text-lg-start text-center">{{ __('Le respect - L\'écoute et l\'accompagnement') }}</p>
<p class="text-center text-lg-start">{{ __('Le partage des performances - La bienveillance') }}</p> <p class="text-lg-start text-center">{{ __('Le partage des performances - La bienveillance') }}</p>
</div> </div>
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<ul> <ul>
@ -252,35 +259,36 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/sun-with-clouds.png') }}" <img class="mb-4 p-0" src="{{ Vite::asset('resources/assets/images/convictionpage/sun-with-clouds.png') }}"
alt="{{ __('Dessin d\'un soleil avec queques nuages et une ligne en pointillés traversant') }}"
title="{{ __('Ciel') }}" title="{{ __('Ciel') }}"
class="p-0 mb-4"> alt="{{ __('Dessin d\'un soleil avec queques nuages et une ligne en pointillés traversant') }}">
</div> </div>
</section> </section>
<section class="territory container-fluid my-5"> <section class="territory container-fluid my-5">
<div class="container"> <div class="container">
<h2 class="black-title text-white f-readex-pro w-100 text-center px-4 my-5"> <h2 class="black-title f-readex-pro w-100 my-5 px-4 text-center text-white">
{{ __('04 Intégrer son territoire') }} {{ __('04 Intégrer son territoire') }}
</h2> </h2>
{{-- </div> --}} {{-- </div> --}}
{{-- <div class="ms-0 ms-lg-5 ps-0 ps-lg-5 me-0 pe-0"> --}} {{-- <div class="ms-0 ms-lg-5 ps-0 ps-lg-5 me-0 pe-0"> --}}
<div class="row"> <div class="row">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<div class="container"> <div class="container">
<p class="text-tertiary text-uppercase text-center text-lg-start f-sheldon fs-1 w-lg-75">{{ number_format($convictionpageModel->key_territory, 0, ',', ' ') }} {{ __('repas distribués gratuitement chaque année')}}</p> <p class="text-tertiary text-uppercase text-lg-start f-sheldon fs-1 w-lg-75 text-center">
<p class="f-readex-pro fw-bold">{{ __('à différentes institutions comme des banques alimentaires, les restos du coeur...')}}</p> {{ number_format($convictionpageModel->key_territory, 0, ',', ' ') }}
{{ __('repas distribués gratuitement chaque année') }}</p>
<p class="f-readex-pro fw-bold">
{{ __('à différentes institutions comme des banques alimentaires, les restos du coeur...') }}</p>
</div> </div>
</div> </div>
<div class="col-12 col-lg-6 d-flex justify-content-end pe-0 food"> <div class="col-12 col-lg-6 d-flex justify-content-end food pe-0">
<img src="{{ Vite::asset('resources/assets/images/convictionpage/food.png') }}" <img src="{{ Vite::asset('resources/assets/images/convictionpage/food.png') }}" title="{{ __('Nourriture') }}"
alt="{{ __('Dessin d\'une main tenant des tomates et des champignons') }}" alt="{{ __('Dessin d\'une main tenant des tomates et des champignons') }}">
title="{{ __('Nourriture') }}">
</div> </div>
</div> </div>
{{-- </div> --}} {{-- </div> --}}
{{-- <div class="container"> --}} {{-- <div class="container"> --}}
<div class="row mt-4"> <div class="row mt-4">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<p class="fw-bold">{{ __('L\'entreprise, acteur local, participe à la vie de sa collectivité') }}&nbsp;:</p> <p class="fw-bold">{{ __('L\'entreprise, acteur local, participe à la vie de sa collectivité') }}&nbsp;:</p>

View file

@ -170,7 +170,7 @@
<p> <p>
<span <span
class="second-paragraph lh-sm">{{ __('Et comme nous sommes curieux, ouverts sur le monde, nous avons à coeur de faire voyager vos papilles ;') }}</span> class="second-paragraph lh-sm">{{ __('Et comme nous sommes curieux, ouverts sur le monde, nous avons à coeur de faire voyager vos papilles ;') }}</span>
{{ __('nous explorons et nous innovons avec toujours plus de créativité. En plus de notre offre traditionnelle, nous proposons une palette généreuse de plats exotiques inspirés du monde entier qui ont fait notre réputation : paella, bo-bun, rouleaux de printemps.') }} {{ __('nous explorons et nous innovons avec toujours plus de créativité. En plus de notre offre traditionnelle, nous proposons une palette généreuse de plats exotiques inspirés du monde entier qui ont fait notre réputation : paella, nems, bo-bun, rouleaux de printemps.') }}
<br> <br>
{{ __('A l\'apéritif du vendredi soir ou pour un dîner en semaine, en solo ou entre amis, le dépaysement est garanti !') }} {{ __('A l\'apéritif du vendredi soir ou pour un dîner en semaine, en solo ou entre amis, le dépaysement est garanti !') }}
</p> </p>
@ -185,7 +185,7 @@
<div class="row w-100 mx-auto"> <div class="row w-100 mx-auto">
<div class="col-12 col-md-6 p-0"> <div class="col-12 col-md-6 p-0">
<div class="row w-100 justify-content-center mx-auto mb-4"> <div class="row w-100 justify-content-center mx-auto mb-4">
@foreach ($explorerpageModel->commitments as $commitment) @foreach ($explorerpageModel->commitments()->where('published', true)->orderBy('order')->get() as $commitment)
<div class="col-4 d-flex justify-content-center p-2"> <div class="col-4 d-flex justify-content-center p-2">
<img class="mx-auto" src="{{ asset($commitment->picture) }}" title="{{ $commitment->picture_title }}" <img class="mx-auto" src="{{ asset($commitment->picture) }}" title="{{ $commitment->picture_title }}"
alt="{{ $commitment->picture_alt }}"> alt="{{ $commitment->picture_alt }}">

View file

@ -32,7 +32,7 @@
<div class="row w-100 mx-auto"> <div class="row w-100 mx-auto">
<div class="col-12 col-xl-6 p-xl-5 px-0"> <div class="col-12 col-xl-6 p-xl-5 px-0">
<div class="d-flex flex-column justify-content-center align-items-start position-relative h-100 z-1 mb-5"> <div class="d-flex flex-column justify-content-center align-items-start position-relative h-100 z-1 mb-5">
<h2 class="d-flex flex-column justify-content-center align-items-start text-uppercase position-relative"> <h2 class="d-flex flex-column justify-content-center align-items-start text-uppercase position-relative w-75">
<span class="f-readex-pro fs-6 fw-semibold">{{ __('au fil de l\'année') }}</span> <span class="f-readex-pro fs-6 fw-semibold">{{ __('au fil de l\'année') }}</span>
<span class="f-sheldon fs-1 mb-3 mt-1">{{ $seasonalSectionsModel->title }}</span> <span class="f-sheldon fs-1 mb-3 mt-1">{{ $seasonalSectionsModel->title }}</span>
</h2> </h2>
@ -50,7 +50,7 @@
<div class="description container px-4 py-5"> <div class="description container px-4 py-5">
<h2 class="text-uppercase fs-1 f-sheldon text-center">{{ __('Agis c\'est') }}</h2> <h2 class="text-uppercase fs-1 f-sheldon text-center">{{ __('Agis c\'est') }}</h2>
<p class="description-subtitle lh-sm fs-6 fw-bold m-0 mx-auto px-4 text-center"> <p class="description-subtitle lh-sm fs-6 fw-bold m-0 mx-auto px-4 text-center">
{{ __('une palette généreuse de plats s\'inspirant du monde entier') }}</p> {{ $homepageModel->presentation_title }}</p>
<div class="row"> <div class="row">
<div class="col-12 col-md-6 my-xl-0 mx-auto my-2"> <div class="col-12 col-md-6 my-xl-0 mx-auto my-2">
<div class="w-75 mx-auto"> <div class="w-75 mx-auto">
@ -62,7 +62,7 @@
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<div class="description-paragraph d-flex flex-column justify-content-center align-items-start h-100"> <div class="description-paragraph d-flex flex-column justify-content-center align-items-start h-100">
{!! clean($homepageModel->presentation_content) !!} {!! clean($homepageModel->presentation_content) !!}
<button class="btn btn-primary fw-bold mt-1">{{ __('> En savoir +') }}</button> <a class="btn btn-primary fw-bold mt-1" href="{{ route('fo.explorer') }}">{{ __('> En savoir +') }}</a>
</div> </div>
</div> </div>
</div> </div>
@ -86,7 +86,8 @@
<p class="f-readex-pro m-0"> <p class="f-readex-pro m-0">
{{ \Carbon\Carbon::parse($newsModel->publish_at)->locale('fr_FR')->isoFormat('D MMM Y') }}</p> {{ \Carbon\Carbon::parse($newsModel->publish_at)->locale('fr_FR')->isoFormat('D MMM Y') }}</p>
<p class="fw-bold m-0 text-start">{{ $newsModel->title }}</p> <p class="fw-bold m-0 text-start">{{ $newsModel->title }}</p>
<a class="f-readex-pro text-dark" href="#">{{ __('> Lire la suite') }}</a> <a class="f-readex-pro text-dark"
href="{{ route('fo.news.show', $newsModel->slug) }}">{{ __('> Lire la suite') }}</a>
</div> </div>
</div> </div>
</div> </div>
@ -121,20 +122,23 @@
<div class="swiper-wrapper"> <div class="swiper-wrapper">
@foreach ($rangeModels as $key => $rangeModel) @foreach ($rangeModels as $key => $rangeModel)
<div class="swiper-slide"> <div class="swiper-slide">
<div <a href="{{ route('fo.ranges.show', $rangeModel->slug) }}">
class="swiper-slide-content d-flex flex-column flex-xl-row justify-content-center justify-content-xl-end align-items-center m-xl-0 mx-auto">
<div <div
class="swiper-slide-content-details bg-agis-white @if (!$loop->first) swiper-slide-content-translate @endif position-relative z-1"> class="swiper-slide-content d-flex flex-column flex-xl-row justify-content-center justify-content-xl-end align-items-center m-xl-0 mx-auto">
<p class="text-primary fs-5 f-readex-pro p-xl-2 p-xxl-4 text-xl-start m-0 mb-3 text-center"> <div
{{ Str::of($rangeModel->title)->limit(30) }} class="swiper-slide-content-details bg-agis-white @if (!$loop->first) swiper-slide-content-translate @endif position-relative z-1">
</p> <p class="text-primary fs-5 f-readex-pro p-xl-2 p-xxl-4 text-xl-start m-0 mb-3 text-center">
{{ Str::of($rangeModel->title)->limit(30) }}
</p>
</div>
<img src="{{ asset($rangeModel->picture_thumbnail) }}"
title="{{ $rangeModel->picture_thumbnail_title }}" alt="{{ $rangeModel->picture_thumbnail_alt }}">
<div class="w-100 d-xl-none">
<a class="text-dark w-fit"
href="{{ route('fo.ranges.show', $rangeModel->slug) }}">{{ __('> En savoir +') }}</a>
</div>
</div> </div>
<img src="{{ asset($rangeModel->picture_thumbnail) }}" title="{{ $rangeModel->picture_thumbnail_title }}" </a>
alt="{{ $rangeModel->picture_thumbnail_alt }}">
<div class="w-100 d-xl-none">
<a class="text-dark w-fit" href="">{{ __('> En savoir +') }}</a>
</div>
</div>
</div> </div>
@endforeach @endforeach
</div> </div>

View file

@ -16,7 +16,7 @@
</div> </div>
<div class="col-12 mb-xl-5"> <div class="col-12 mb-xl-5">
<p class="lh-sm m-0 mb-3 text-center"> <p class="lh-sm m-0 mb-3 text-center">
{{ Str::of(__('Après plus de 30 ans de croissance soutenue par l\'innovation, intégrée au groupe familial français LDC, leader de l\'agro-alimentaire, AGIS est désormais une société comptant plus de 800 collaborateurs passionnés répartis sur ses 3 ateliers de production et une plateforme logistiques.'))->ucFirst()->value() }} {{ Str::of(__('Après plus de 30 ans de croissance soutenue par l\'innovation, intégrée au groupe familial français LDC, leader de l\'agro-alimentaire, AGIS est désormais une société comptant plus de 800 collaborateurs passionnés répartis sur ses 3 ateliers de production et une plateforme logistique.'))->ucFirst()->value() }}
</p> </p>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-12 col-xl-5 mb-3 text-center"> <div class="col-12 col-xl-5 mb-3 text-center">

View file

@ -9,10 +9,14 @@
<section class="news position-relative bg-agis-grey pb-5"> <section class="news position-relative bg-agis-grey pb-5">
@php @php
$data = [ $data = [
'newsModels' => json_decode(json_encode($newsModels)), 'modelName' => 'actualité',
'itemModels' => json_decode(json_encode($newsModels)),
'categoryEnums' => \App\Enums\News\CategoryEnum::toArray(), 'categoryEnums' => \App\Enums\News\CategoryEnum::toArray(),
'routeFiltered' => 'fo.news.filtered',
'routeShow' => 'fo.news.show',
'showSelect' => true,
]; ];
@endphp @endphp
<div class="news-list" data-json='@json($data)'></div> <div class="items-list" data-json='@json($data)'></div>
</section> </section>
@endsection @endsection

View file

@ -26,12 +26,12 @@
</div> </div>
<article class="bg-agis-grey pt-5"> <article class="bg-agis-grey pt-5">
<div class="container"> <div class="container">
<div class="mx-auto text-center"> <div class="mx-auto">
<div class="news-single-img bg-agis-white p-lg-5 p-md-4 mx-auto w-fit p-3 pt-0"> <div class="news-single-img bg-agis-white p-lg-5 p-md-4 mx-auto w-fit p-3 pt-0">
<img class="" src="{{ asset($newsModel->picture) }}" title="{{ Str::of($newsModel->picture_title)->ucFirst() }}" <img class="" src="{{ asset($newsModel->picture) }}" title="{{ Str::of($newsModel->picture_title)->ucFirst() }}"
alt="{{ Str::of($newsModel->picture_alt)->ucFirst() }}"> alt="{{ Str::of($newsModel->picture_alt)->ucFirst() }}">
</div> </div>
<div class="mx-auto mt-3"> <div class="news-single-content mx-auto mt-3">
<p class="fs-7 fw-semibold text-start">{{ $newsModel->subtitle }}</p> <p class="fs-7 fw-semibold text-start">{{ $newsModel->subtitle }}</p>
<br> <br>
{!! clean($newsModel->content) !!} {!! clean($newsModel->content) !!}
@ -40,14 +40,14 @@
<div class="row pb-5"> <div class="row pb-5">
<div class="col text-center"> <div class="col text-center">
<p class="fs-3 mt-5">{{ __('Partager sur') }}</p> <p class="fs-3 mt-5">{{ __('Partager sur') }}</p>
<a class="text-decoration-none" href="#FIXME:Change this" title="{{ __('Nous suivre sur Instagram') }}" <a class="text-decoration-none" href="https://www.facebook.com/sharer/sharer.php?u={{ urlencode(str_replace('http://', 'https://', request()->fullurl())) }}&t={{ urlencode($newsModel->title) }}"
title="{{ __('Partager sur Facebook') }}"
target="_blank"> target="_blank">
@include('fo.partials.social-svg-instagram')
</a>
<a class="text-decoration-none" href="#FIXME:Change this" title="{{ __('Nous suivre sur Facebook') }}" target="_blank">
@include('fo.partials.social-svg-facebook') @include('fo.partials.social-svg-facebook')
</a> </a>
<a class="text-decoration-none" href="#FIXME:Change this" title="{{ __('Nous suivre sur Linkedin') }}" target="_blank"> <a class="text-decoration-none" href="https://www.linkedin.com/sharing/share-offsite/?url={{ urlencode(str_replace('http://', 'https://', request()->fullurl())) }}"
title="{{ __('Partager sur Linkedin') }}"
target="_blank">
@include('fo.partials.social-svg-linkedin') @include('fo.partials.social-svg-linkedin')
</a> </a>
</div> </div>

View file

@ -1,7 +1,7 @@
@extends('fo.layout') @extends('fo.layout')
@section('title', $product->seo_title ?? __('Fiche produit')) @section('title', $productModel->seo_title ?? __('Fiche produit'))
@section('description', $product->seo_description ?? __('Fiche descriptive d\'un produit')) @section('description', $productModel->seo_description ?? __('Fiche descriptive d\'un produit'))
@section('breadcrumb', @section('breadcrumb',
request()->route()->getName()) request()->route()->getName())
@ -10,34 +10,34 @@
<!-- TITLE CARD --> <!-- TITLE CARD -->
<section class="title-card container-fluid position-relative overflow-hidden"> <section class="title-card container-fluid position-relative overflow-hidden">
<img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1" <img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1"
src="{{ Vite::asset('resources/assets/images/global/bg-grey-desktop.png') }}" title="{{ __('Visuel servant de fond') }}" src="{{ Vite::asset('resources/assets/images/global/bg-grey-desktop.png') }}" title="{{ __('Visuel servant de fond') }}"
alt="{{ __('fond gris') }}"> alt="{{ __('fond gris') }}">
<div class="py-2 px-3 px-lg-5 text-center lh-sm"> <div class="px-lg-5 lh-sm px-3 py-2 text-center">
<span class="divide d-block w-100 mt-lg-5 mb-3 mt-4"></span> <span class="divide d-block w-100 mt-lg-5 mb-3 mt-4"></span>
<h1 class="fs-1 f-sheldon text-uppercase"> <h1 class="fs-1 f-sheldon text-uppercase">
{{ $product->title }} {{ $productModel->title }}
</h1> </h1>
<span class="divide d-block w-100 mt-lg-3 mb-1 mb-md-4 mt-3"></span> <span class="divide d-block w-100 mt-lg-3 mb-md-4 mb-1 mt-3"></span>
</div> </div>
{{-- CARROUSEL image ambiance/packshot --}} {{-- CARROUSEL image ambiance/packshot --}}
<div class="pictures mb-4 px-5"> <div class="pictures mb-4 px-5">
<div class="swiper swiper-product-pictures overflow-hidden pb-3 h-100 d-lg-none" id="swiper-product-pictures"> <div class="swiper swiper-product-pictures h-100 d-lg-none overflow-hidden pb-3" id="swiper-product-pictures">
<div class="swiper-wrapper"> <div class="swiper-wrapper">
<div class="swiper-slide"> <div class="swiper-slide">
<div class="swiper-slide-content d-flex justify-content-center align-items-center mx-auto px-3"> <div class="swiper-slide-content d-flex justify-content-center align-items-center mx-auto px-3">
<img src="{{ asset($product->picture_ambiance) }}" <img src="{{ asset($productModel->picture_ambiance) }}" title="{{ $productModel->picture_ambiance_title }}"
title="{{ $product->picture_ambiance_title }}" alt="{{ $product->picture_ambiance_alt }}"> alt="{{ $productModel->picture_ambiance_alt }}">
</div> </div>
</div> </div>
<div class="swiper-slide h-auto"> <div class="swiper-slide h-auto">
<div class="swiper-slide-content d-flex justify-content-center align-items-center mx-auto px-3 h-100"> <div class="swiper-slide-content d-flex justify-content-center align-items-center h-100 mx-auto px-3">
<img src="{{ asset($product->picture_packshot) }}" <img src="{{ asset($productModel->picture_packshot) }}" title="{{ $productModel->picture_packshot_title }}"
title="{{ $product->picture_packshot_title }}" alt="{{ $product->picture_packshot_alt }}"> alt="{{ $productModel->picture_packshot_alt }}">
</div> </div>
</div> </div>
</div> </div>
<div class="d-flex justify-content-evenly align-items-center d-lg-none pb-4 mt-4 flex-row"> <div class="d-flex justify-content-evenly align-items-center d-lg-none mt-4 flex-row pb-4">
<div class="swiper-button-prev rounded-circle" role="button"> <div class="swiper-button-prev rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}" <img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (gauche)') }}" alt="{{ __('flèche vers la gauche') }}"> title="{{ __('Navigation du slider (gauche)') }}" alt="{{ __('flèche vers la gauche') }}">
@ -48,38 +48,35 @@
</div> </div>
</div> </div>
</div> </div>
<div class="d-none d-lg-flex justify-content-center ms-5 ps-5 pe-3 pb-5"> <div class="d-none d-lg-flex justify-content-center ms-5 pb-5 pe-3 ps-5">
<img src="{{ asset($product->picture_ambiance) }}" <img class="h-100 col-8 pb-5" src="{{ asset($productModel->picture_ambiance) }}"
title="{{ $product->picture_ambiance_title }}" title="{{ $productModel->picture_ambiance_title }}" alt="{{ $productModel->picture_ambiance_alt }}">
alt="{{ $product->picture_ambiance_alt }}" <img class="h-100 col-4 ms-4 mt-auto pb-5" src="{{ asset($productModel->picture_packshot) }}"
class="h-100 col-8 pb-5"> title="{{ $productModel->picture_packshot_title }}" alt="{{ $productModel->picture_packshot_alt }}">
<img src="{{ asset($product->picture_packshot) }}"
title="{{ $product->picture_packshot_title }}"
alt="{{ $product->picture_packshot_alt }}"
class="h-100 col-4 pb-5 ms-4 mt-auto">
</div> </div>
</div> </div>
{{-- DESCRIPTION --}} {{-- DESCRIPTION --}}
<div class="text-justify text-lg-center col-12 col-lg-9 px-3 mx-lg-auto">{!! clean($product->description) !!}</div> <div class="text-lg-center col-12 col-lg-9 mx-lg-auto px-3 text-justify">{!! clean($productModel->description) !!}</div>
{{-- PICTOS --}} {{-- PICTOS --}}
@if (!empty($product->commitments)) @if (!empty($productModel->commitments))
<div class="pictos px-3 pb-5 col-12 col-lg-8 mx-auto"> <div class="pictos col-12 col-lg-8 mx-auto px-3 pb-5">
<span class="divide d-block w-100 mt-lg-5 mb-2 mb-lg-4 mt-4"></span> <span class="divide d-block w-100 mt-lg-5 mb-lg-4 mb-2 mt-4"></span>
<div class="row justify-content-center px-lg-4"> <div class="row justify-content-center px-lg-4">
@foreach ($product->commitments as $commitment) @foreach ($productModel->commitments as $commitment)
<div class="col-3"> @if ($commitment->published)
<div class="w-100 d-flex justify-content-center"> <div class="col-3">
<img src="{{ asset($commitment->picture) }}" <div class="w-100 d-flex justify-content-center">
alt="{{ $commitment->picture_alt }}" <img src="{{ asset($commitment->picture) }}" title="{{ $commitment->picture_title }}"
title="{{ $commitment->picture_title }}"> alt="{{ $commitment->picture_alt }}">
</div> </div>
</div> </div>
@endforeach @endif
@endforeach
</div>
<span class="divide d-block w-100 mt-lg-4 mb-3 mt-2"></span>
</div> </div>
<span class="divide d-block w-100 mt-lg-4 mb-3 mt-2"></span>
</div>
@endif @endif
</section> </section>
@ -87,44 +84,47 @@
<div class="row px-3"> <div class="row px-3">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
{{-- COOKING ADVICE --}} {{-- COOKING ADVICE --}}
<h2 class="green-title f-readex-pro text-white fs-6 px-4 py-2 w-100">{{ __('Conseils de Réchauffage') }}</h2> <section class="row">
<div class="col-12 mt-4"> <h2 class="green-title f-readex-pro fs-6 w-100 px-4 py-2 text-white">{{ __('Conseils de Réchauffage') }}</h2>
<img src="{{ Vite::asset($product->cooking_mode->picture()) }}" <div class="col-12 mt-4">
alt="{{ $product->cooking_mode->alt() }}" <img class="picto-img float-start me-3 mt-3" src="{{ Vite::asset($productModel->cooking_mode->picture()) }}"
title="{{ $product->cooking_mode->label() }}" title="{{ $productModel->cooking_mode->label() }}" alt="{{ $productModel->cooking_mode->alt() }}">
class="picto-img float-start me-3 mt-3"> <div class="cooking-advice text-justify">{!! clean($productModel->cooking_advice) !!}</div>
<div class="text-justify">{!! clean($product->cooking_advice) !!}</div> </div>
</div> </section>
{{-- INGREDIENTS --}} {{-- INGREDIENTS --}}
<h2 class="green-title f-readex-pro text-white fs-6 px-4 py-2 w-100 mt-5">{{ __('Ingrédients') }}</h2> <section class="row">
<div class="col-12"> <h2 class="green-title f-readex-pro fs-6 w-100 mt-5 px-4 py-2 text-white">{{ __('Ingrédients') }}</h2>
<div class="text-justify">{!! clean($product->ingredients) !!}</div> <div class="col-12">
</div> <div class="text-justify">{!! clean($productModel->ingredients) !!}</div>
</div>
</section>
</div> </div>
<div class="col-12 col-lg-6 h-auto"> <div class="col-12 col-lg-6 h-auto">
<div class="h-100 d-flex flex-column justify-content-between"> <div class="h-100 d-flex flex-column justify-content-between">
<div class="h-50 d-none d-lg-flex align-items-center"> <div class="h-50 d-none d-lg-flex align-items-center justify-content-center">
<img src="{{ Vite::asset('resources/assets/images/products/leafs-and-seeds.png') }}" <img src="{{ asset($productModel->range->picture_productsheet) }}"
alt="Dessins de feuilles et de graines éparpillées" title="{{ $productModel->range->picture_productsheet_alt }}"
title="Décoration fiche produit"> alt="{{ $productModel->range->picture_productsheet_title }}">
</div> </div>
{{-- NUTRITIONNAL VALUES --}} {{-- NUTRITIONNAL VALUES --}}
@php @php
$nutrionnal_values = json_decode($product->nutritionnal_values); $nutrionnal_values = json_decode($productModel->nutritionnal_values);
@endphp @endphp
<table class="table table-bordered mt-4 f-readex-pro"> <table class="table-bordered f-readex-pro mt-4 table">
<thead> <thead>
<tr class="table-dark"> <tr class="table-dark">
<th class="text-uppercase text-white ps-sm-5 py-xl-3">{{ __('Valeurs nutritionnelles') }}</th> <th class="text-uppercase ps-sm-5 py-xl-3 text-white">{{ __('Valeurs nutritionnelles') }}</th>
<th class="text-white text-center py-xl-3"><span class="text-uppercase">{{ __('POUR') }}</span> {{ __('100g') }}</th> <th class="py-xl-3 text-center text-white"><span class="text-uppercase">{{ __('POUR') }}</span>
{{ __('100g') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach ($nutrionnal_values as $line) @foreach ($nutrionnal_values as $line)
<tr class="table-secondary"> <tr class="table-secondary">
<td class="text-dark ps-sm-5">{{ $line->label }}</td> <td class="text-dark ps-sm-5">{{ $line->label }}</td>
<td class="text-dark text-center">{{ $line->value }}</td> <td class="text-dark text-center">{{ $line->value }}</td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>
</table> </table>
@ -134,49 +134,54 @@
</section> </section>
@if (count($otherProductModels)) @if (count($otherProductModels))
<section class="discover container-fluid position-relative py-5 mb-4"> <section class="discover container-fluid position-relative mb-4 py-5">
<img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1" <img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1"
src="{{ Vite::asset('resources/assets/images/global/bg-grey-desktop.png') }}" title="{{ __('Visuel servant de fond') }}" src="{{ Vite::asset('resources/assets/images/global/bg-grey-desktop.png') }}" title="{{ __('Visuel servant de fond') }}"
alt="{{ __('fond gris') }}"> alt="{{ __('fond gris') }}">
<h2 class="text-primary text-uppercase f-sheldon text-center w-100 pt-3 pt-xl-4 mb-5"> <h2 class="text-primary text-uppercase f-sheldon w-100 pt-xl-4 mb-5 pt-3 text-center">
{{ __('Découvrez nos produits') }} {{ __('Découvrez nos produits') }}
</h2> </h2>
{{-- CARROUSEL produits même gamme mais ordre aléatoire --}} {{-- CARROUSEL produits même gamme mais ordre aléatoire --}}
<div class="other-products px-3 px-xl-5 mx-xl-5"> <div class="other-products px-xl-5 mx-xl-5 px-3">
<div class="swiper swiper-other-products overflow-hidden w-xl-100 mx-xl-0" id="swiper-other-products"> <div class="swiper swiper-other-products w-xl-100 mx-xl-0 overflow-hidden" id="swiper-other-products">
<div class="swiper-wrapper"> <div class="swiper-wrapper">
@foreach ($otherProductModels as $otherProduct) @foreach ($otherProductModels as $otherProduct)
<div class="swiper-slide"> <div class="swiper-slide">
<div class="swiper-slide-content d-flex flex-column justify-content-center align-items-center mx-auto px-3 pt-5 pb-xl-5 w-xl-75"> <div
<img src="{{ asset($otherProduct->picture_ambiance) }}" class="swiper-slide-content d-flex flex-column justify-content-center align-items-center pb-xl-5 w-xl-75 mx-auto px-3 pt-5">
title="{{ $otherProduct->picture_ambiance_title }}" <a href="{{ route('fo.products.show', $otherProduct->slug) }}">
alt="{{ $otherProduct->picture_ambiance_alt }}" <img class="" src="{{ asset($otherProduct->picture_ambiance) }}"
class=""> title="{{ $otherProduct->picture_ambiance_title }}"
<div class="w-100 d-xl-none"> alt="{{ $otherProduct->picture_ambiance_alt }}">
<a class="w-fit" href="{{ route('fo.products.show', ['publishedProduct' => $otherProduct]) }}">{{ __('> En savoir +') }}</a> </a>
<div class="w-100 d-xl-none">
<a class="w-fit"
href="{{ route('fo.products.show', $otherProduct->slug) }}">{{ __('> En savoir +') }}</a>
</div>
</div>
</div>
@endforeach
</div>
@if (count($otherProductModels) > 1)
<div
class="navigation d-flex justify-content-evenly justify-content-xl-between align-items-center p-xl-4 mb-2 mt-3 flex-row p-0">
<div class="swiper-button-prev rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (gauche)') }}" alt="{{ __('flèche vers la gauche') }}">
</div>
<div class="swiper-button-next rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (droite)') }}" alt="{{ __('flèche vers la droite') }}">
</div> </div>
</div> </div>
</div> @endif
@endforeach
</div> </div>
@if (count($otherProductModels) > 1)
<div class="navigation d-flex justify-content-evenly justify-content-xl-between align-items-center p-xl-4 mb-2 mt-3 flex-row p-0">
<div class="swiper-button-prev rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (gauche)') }}" alt="{{ __('flèche vers la gauche') }}">
</div>
<div class="swiper-button-next rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (droite)') }}" alt="{{ __('flèche vers la droite') }}">
</div>
</div>
@endif
</div> </div>
</div> <div class="pb-4">
<div class="pb-4"> <a class="btn btn-primary d-none d-xl-block mx-auto my-4 w-fit"
<a class="btn btn-primary d-none d-xl-block mx-auto my-4 w-fit" href="#">{{ __('> Voir toutes nos gammes') }}</a> href="{{ route('fo.ranges.index') }}">{{ __('> Voir toutes nos gammes') }}</a>
</div> </div>
</section> </section>
@endif @endif
</section> </section>
@endsection @endsection

View file

@ -28,72 +28,16 @@
title="{{ Str::of(__('le plaisir de cuisiner'))->ucFirst() }}" alt="{{ Str::of(__('femme cuisine'))->ucFirst() }}"> title="{{ Str::of(__('le plaisir de cuisiner'))->ucFirst() }}" alt="{{ Str::of(__('femme cuisine'))->ucFirst() }}">
</div> </div>
</div> </div>
<div class="ranges-flexwrap d-none d-xl-flex justify-content-center align-items-center flex-row flex-wrap">
@foreach ($rangeModels as $rangeModel)
<div class="col-4 mb-5">
<div class="card position-relative rounded-0 bg-agis-white mx-auto border-0 bg-transparent p-4">
<a class="text-decoration-none stretched-link" href="{{ route('fo.ranges.show', $rangeModel->slug) }}">
<div class="card-header d-flex justify-content-center align-items-center border-0 bg-transparent p-0">
<p class="text-dark f-readex-pro m-0 p-0 text-center">
{{ Str::of($rangeModel->title)->limit(35) }}
</p>
</div>
<div class="card-body position-relative p-0">
<div
class="position-absolute w-100 h-100 visibility-hidden text-dark start-0 top-0 bg-white bg-opacity-75 p-2 opacity-0">
{{ Str::of($rangeModel->tagline)->limit(100) }}
</div>
<img src="{{ asset($rangeModel->picture_thumbnail) }}"
title="{{ $rangeModel->picture_thumbnail_title }}" alt="{{ $rangeModel->picture_thumbnail_alt }}">
</div>
</a>
</div>
</div>
@endforeach
</div>
</div>
<div class="ranges-swiper container-fluid position-relative d-xl-none px-4">
<div class="swiper swiper-ranges overflow-hidden py-4" id="swiper-ranges">
<img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1 d-xl-none"
src="{{ Vite::asset('resources/assets/images/global/bg-white-desktop.png') }}"
title="{{ __('Visuel servant de fond') }}" alt="{{ __('fond blanc') }}">
<div class="swiper-wrapper">
@foreach ($rangeModels as $key => $rangeModel)
<div class="swiper-slide">
<div class="swiper-slide-content d-flex flex-column justify-content-center align-items-center m-xl-0 mx-auto">
<div
class="swiper-slide-content-details @if (!$loop->first) swiper-slide-content-translate @endif position-relative z-1">
<img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1 d-none d-xl-block"
src="{{ Vite::asset('resources/assets/images/global/bg-white-desktop.png') }}"
title="{{ __('Visuel servant de fond') }}" alt="{{ __('fond blanc') }}">
<p class="text-primary fs-5 f-readex-pro p-xl-2 p-xxl-4 m-0 mb-3 text-center">
{{ Str::of($rangeModel->title)->limit(30) }}
</p>
</div>
<img src="{{ asset($rangeModel->picture_thumbnail) }}" title="{{ $rangeModel->picture_thumbnail_title }}"
alt="{{ $rangeModel->picture_thumbnail_alt }}">
<div class="w-100 d-xl-none mt-2">
<p class="m-0">{{ Str::of($rangeModel->tagline)->limit(100) }}</p>
<a class="text-dark fw-bold w-fit"
href="{{ route('fo.ranges.show', $rangeModel->slug) }}">{{ __('> En savoir +') }}</a>
</div>
</div>
</div>
@endforeach
</div>
<div
class="navigation d-flex justify-content-evenly justify-content-xl-between align-items-center p-xl-4 mb-2 mt-3 flex-row p-0">
<div class="swiper-button-prev rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (gauche)') }}" alt="{{ __('flèche vers la gauche') }}">
</div>
<div class="swiper-button-next rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (droite)') }}" alt="{{ __('flèche vers la droite') }}">
</div>
</div>
</div>
</div> </div>
@php
$data = [
'modelName' => 'gamme',
'itemModels' => json_decode(json_encode($rangeModels)),
'routeFiltered' => 'fo.ranges.filtered',
'routeShow' => 'fo.ranges.show',
];
@endphp
<div class="items-list" data-json='@json($data)'></div>
</div> </div>
<p class="lh-sm fw-bold my-4 px-5 text-center">{{ __('Retrouvez-nous au rayon traiteur traditionnel de vos magasins préférés.') }}</p> <p class="lh-sm fw-bold my-4 px-5 text-center">{{ __('Retrouvez-nous au rayon traiteur traditionnel de vos magasins préférés.') }}</p>
</section> </section>

View file

@ -31,72 +31,25 @@
alt="{{ Str::of($rangeModel->picture_title)->ucFirst() }}"> alt="{{ Str::of($rangeModel->picture_title)->ucFirst() }}">
</div> </div>
</div> </div>
<div class="col-12 my-xl-5"> @if (count($productModels))
<p class="highlight black f-readex-pro mx-xl-auto m-0 px-3 text-white"> <div class="col-12 mt-xl-5">
{{ Str::of(__('Quelques-unes de nos recettes...'))->ucFirst() }} <p class="highlight black f-readex-pro mx-xl-auto m-0 px-3 text-white">
</p> {{ Str::of(__('Quelques-unes de nos recettes...'))->ucFirst() }}
</div> </p>
<div class="col-12">
<div class="ranges-swiper position-relative d-xl-none">
<div class="swiper swiper-ranges overflow-hidden py-4" id="swiper-ranges">
<img class="position-absolute top-50 start-50 translate-middle w-100 h-100 z-n1 d-xl-none"
src="{{ Vite::asset('resources/assets/images/global/bg-white-desktop.png') }}"
title="{{ __('Visuel servant de fond') }}" alt="{{ __('fond blanc') }}">
<div class="swiper-wrapper">
@foreach ($productModels as $productModel)
<div class="swiper-slide">
<div class="swiper-slide-range m-xl-0 mx-auto">
<img src="{{ asset($productModel->picture_thumbnail) }}"
title="{{ $productModel->picture_thumbnail_title }}"
alt="{{ $productModel->picture_thumbnail_alt }}">
<p class="text-dark fw-bold m-0 mt-2">
{{ $productModel->title }}
</p>
<p class="text-dark m-0">
{{ $productModel->subtitle }}
</p>
<div class="w-100 d-xl-none">
<a class="fw-bold text-dark w-fit" href="#">{{ __('> En savoir +') }}</a>
</div>
</div>
</div>
@endforeach
</div>
<div
class="navigation d-flex justify-content-evenly justify-content-xl-between align-items-center p-xl-4 mb-2 mt-3 flex-row p-0">
<div class="swiper-button-prev rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (gauche)') }}" alt="{{ __('flèche vers la gauche') }}">
</div>
<div class="swiper-button-next rounded-circle" role="button">
<img src="{{ Vite::asset('resources/assets/images/global/btn-arrow.png') }}"
title="{{ __('Navigation du slider (droite)') }}" alt="{{ __('flèche vers la droite') }}">
</div>
</div>
</div>
</div> </div>
</div> <div class="col-12">
<div class="col-12"> @php
<div class="d-none d-xl-flex row gx-5 justify-content-start align-items-start flex-row flex-wrap"> $data = [
@foreach ($productModels as $productModel) 'modelName' => 'produit',
<div class="col-4 mb-5"> 'itemModels' => json_decode(json_encode($productModels)),
<div class="card mx-auto border-0"> 'range_id' => $rangeModel->id,
<a class="text-decoration-none stretched-link" href="{{ route('fo.products.show', $productModel) }}"> 'routeFiltered' => 'fo.products.filtered',
<img class="card-img-top rounded-0" src="{{ asset($productModel->picture_thumbnail) }}" 'routeShow' => 'fo.products.show',
title="{{ $productModel->picture_thumbnail_title }}" ];
alt="{{ $productModel->picture_thumbnail_alt }}"> @endphp
<div class="card-body p-0"> <div class="items-list" data-json='@json($data)'></div>
<p class="text-dark card-title fw-bold my-2">{{ $productModel->title }}</p>
<p class="text-dark card-text m-0">
{{ $productModel->subtitle }}
</p>
</div>
</a>
</div>
</div>
@endforeach
</div> </div>
</div> @endif
</div> </div>
</div> </div>
</section> </section>

View file

@ -8,5 +8,13 @@
filtered: "{{ route('fo.news.filtered') }}", filtered: "{{ route('fo.news.filtered') }}",
show: "{{ route('fo.news.show', ['slug' => 'SLUG']) }}" show: "{{ route('fo.news.show', ['slug' => 'SLUG']) }}"
}, },
ranges: {
filtered: "{{ route('fo.ranges.filtered') }}",
show: "{{ route('fo.ranges.show', ['slug' => 'SLUG']) }}"
},
products: {
filtered: "{{ route('fo.products.filtered') }}",
show: "{{ route('fo.products.show', ['slug' => 'SLUG']) }}"
},
}; };
</script> </script>

View file

@ -36,7 +36,7 @@ Route::prefix('bo')
] ]
); );
}); });
Route::middleware('auth:backend')->group(function () { Route::middleware('admin-secure', 'auth:backend')->group(function () {
Route::get('/', [DashboardController::class, 'index'])->name('dashboard'); Route::get('/', [DashboardController::class, 'index'])->name('dashboard');
// * USERS. // * USERS.

View file

@ -9,17 +9,22 @@ use Illuminate\Support\Facades\Route;
Route::middleware(['throttle:credentials']) Route::middleware(['throttle:credentials'])
->name('fo.') ->name('fo.')
->group(function () { ->group(function () {
Route::middleware(['local-development'])->group(function () {
Route::view('/bs-demo', 'fo.pages.bs-demo')->name('bs-demo');
});
Route::get('/', [StaticPageController::class, 'homepage'])->name('homepage'); Route::get('/', [StaticPageController::class, 'homepage'])->name('homepage');
Route::get('/explorateur-et-gastronome', [StaticPageController::class, 'explorer'])->name('explorer'); Route::get('/explorateur-et-gastronome', [StaticPageController::class, 'explorer'])->name('explorer');
Route::get('/nos-convictions', [StaticPageController::class, 'convictions'])->name('convictions'); Route::get('/nos-convictions', [StaticPageController::class, 'convictions'])->name('convictions');
Route::view('/bs-demo', 'fo.pages.bs-demo')->name('bs-demo');
// * RANGES // * RANGES
Route::get('/gammes', [RangeController::class, 'index'])->name('ranges.index'); Route::get('/gammes', [RangeController::class, 'index'])->name('ranges.index');
Route::get('/gammes/{slug}', [RangeController::class, 'show'])->name('ranges.show'); Route::get('/gammes/filtered', [RangeController::class, 'rangesFiltered'])->name('ranges.filtered');
Route::get('/gamme/{slug}', [RangeController::class, 'show'])->name('ranges.show');
// * PRODUCTS // * PRODUCTS
Route::get('/produits/{publishedProduct:slug}', [ProductController::class, 'show'])->name('products.show'); Route::get('/produits/filtered', [ProductController::class, 'productsFiltered'])->name('products.filtered');
Route::get('/produits/{slug}', [ProductController::class, 'show'])->name('products.show');
// * RANGES // * RANGES
Route::get('/rejoignez-nous', [StaticPageController::class, 'joinus'])->name('joinus.show'); Route::get('/rejoignez-nous', [StaticPageController::class, 'joinus'])->name('joinus.show');

View file

@ -3,6 +3,7 @@ import vue from "@vitejs/plugin-vue";
import laravel from "laravel-vite-plugin"; import laravel from "laravel-vite-plugin";
import path from "path"; import path from "path";
import postcssDiscard from "postcss-discard-comments"; import postcssDiscard from "postcss-discard-comments";
import copy from "rollup-plugin-copy";
import { defineConfig, loadEnv } from "vite"; import { defineConfig, loadEnv } from "vite";
import babel from "vite-plugin-babel"; import babel from "vite-plugin-babel";
import checker from "vite-plugin-checker"; import checker from "vite-plugin-checker";
@ -30,6 +31,11 @@ export default defineConfig({
sourcemap: process.env.NODE_ENV === "local" ? "inline" : false, sourcemap: process.env.NODE_ENV === "local" ? "inline" : false,
}, },
css: { css: {
preprocessorOptions: {
scss: {
quietDeps: true
}
},
devSourcemap: process.env.NODE_ENV === "local" ? true : false, devSourcemap: process.env.NODE_ENV === "local" ? true : false,
postcss: { postcss: {
map: { map: {
@ -40,7 +46,7 @@ export default defineConfig({
removeAll: true, removeAll: true,
}), }),
], ],
}, }
}, },
plugins: [ plugins: [
basicSsl(), basicSsl(),
@ -67,11 +73,34 @@ export default defineConfig({
input: [ input: [
"resources/sass/bo/bo.scss", "resources/sass/bo/bo.scss",
"resources/ts/bo/bo.ts", "resources/ts/bo/bo.ts",
"resources/sass/fo/mail-theme.scss",
"resources/sass/fo/fo.scss", "resources/sass/fo/fo.scss",
"resources/ts/fo/fo.ts", "resources/ts/fo/fo.ts",
], ],
refresh: true, refresh: true,
}), }),
copy({
targets: [
{
src: [
// * Engine copy (Default favicon)
path.normalize("resources/favicon/android-chrome-192x192.png"),
path.normalize("resources/favicon/android-chrome-512x512.png"),
path.normalize("resources/favicon/apple-touch-icon.png"),
path.normalize("resources/favicon/browserconfig.xml"),
path.normalize("resources/favicon/favicon.ico"),
path.normalize("resources/favicon/favicon-16x16.png"),
path.normalize("resources/favicon/favicon-32x32.png"),
path.normalize("resources/favicon/mstile-150x150.png"),
path.normalize("resources/favicon/safari-pinned-tab.svg"),
path.normalize("resources/favicon/site.webmanifest"),
],
dest: path.normalize("public")
},
],
copyOnce: true,
verbose: true
}),
stylelint({ stylelint({
dev: false, dev: false,
build: true, build: true,
@ -108,7 +137,7 @@ export default defineConfig({
], ],
server: { server: {
https: true, https: true,
host: env["APP_URL"] ? new URL(env["APP_URL"]).hostname : '', host: env["APP_URL"] ? new URL(env["APP_URL"]).hostname : "",
port: 4443, port: 4443,
watch: { watch: {
usePolling: true, usePolling: true,