fix conflicts

This commit is contained in:
Nicolas Demangeat 2023-10-20 17:04:02 +02:00
commit e7ce6aef02
87 changed files with 9377 additions and 929 deletions

View file

@ -0,0 +1,178 @@
<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\Ranges\StoreRangeRequest;
use App\Http\Requests\Bo\Ranges\UpdateRangeRequest;
use App\Models\Range;
use App\Traits\Controllers\ChangesModelOrder;
use App\Traits\Controllers\UpdateModelPublished;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RangeController extends Controller
{
use UpdateModelPublished;
use ChangesModelOrder;
/**
* Create the controller instance.
*/
public function __construct()
{
$this->authorizeResource(Range::class);
}
/**
* Display a listing of the resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function index(Request $request): \Illuminate\Contracts\View\View
{
/** @var \Illuminate\Database\Eloquent\Builder $rangeModels */
$rangeModels = Range::query();
/** @var string $search Search field */
$search = $request->search;
if ($search) {
$this->searchQuery(
$rangeModels,
$search,
null,
'title',
'subtitle',
'tagline',
'description',
);
}
$searchFields = \implode(', ', [
Str::ucfirst(trans('validation.attributes.title')),
trans('validation.custom.subtitle'),
trans('validation.custom.tagline'),
trans('validation.custom.description'),
]);
/** Sort columns with a query */
$this->sortQuery($rangeModels);
/** Custom pagination */
$rangeModels = $this->paginate($rangeModels);
return view('bo.pages.ranges.index', compact('rangeModels', 'search', 'searchFields'));
}
/**
* Show the form for creating a new resource.
*
* @param \App\Models\Range $range
* @return \Illuminate\Contracts\View\View
*/
public function create(Range $range): \Illuminate\Contracts\View\View
{
return view('bo.pages.ranges.create', ['rangeModel' => $range]);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Bo\Ranges\StoreRangeRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(StoreRangeRequest $request): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request) {
$range = new Range();
$range->fill($request->validated());
if ($range->saveOrFail()) {
return redirect()->route('bo.ranges.edit', $range)
->with('success', __('crud.messages.has_been_created', [
'model' => Str::ucfirst(__('models.classes.range'))
]));
}
return redirect()->back()
->with('error', __('crud.messages.cannot_be_created', [
'model' => Str::ucfirst(__('models.classes.range'))
]));
});
}
/**
* Show the form for editing the specified resource.
*
* @param App\Models\Range $range
* @return \Illuminate\Contracts\View\View
*/
public function edit(Range $range): \Illuminate\Contracts\View\View
{
return view('bo.pages.ranges.edit', ['rangeModel' => $range]);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\Bo\Ranges\UpdateRangeRequest $request
* @param \App\Models\Range $range
* @return \Illuminate\Http\RedirectResponse
*/
public function update(UpdateRangeRequest $request, Range $range): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request, $range) {
$range->fill($request->validated());
if ($range->saveOrFail()) {
return redirect()->route('bo.ranges.edit', $range)
->with('success', __('crud.messages.has_been_updated', [
'model' => Str::ucfirst(__('models.classes.range'))
]));
}
return redirect()->route('bo.ranges.edit', $range)
->with('error', __('crud.messages.cannot_be_updated', [
'model' => Str::ucfirst(__('models.classes.range'))
]));
});
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Range $range
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(Range $range): \Illuminate\Http\RedirectResponse
{
if (!$range->products->isEmpty()) {
return redirect()->back()
->with('error', __('crud.messages.cannot_be_deleted_relation', [
'model' => Str::ucfirst(__('models.classes.range')),
'relations' => Str::plural(__('models.classes.product'))
]));
}
if ($range->deleteOrFail()) {
return redirect()->route('bo.ranges.index')
->with('success', __('crud.messages.has_been_deleted', [
'model' => Str::ucfirst(__('models.classes.range'))
]));
}
return redirect()->back()
->with('error', __('crud.messages.cannot_be_deleted', [
'model' => Str::ucfirst(__('models.classes.range'))
]));
}
/**
* Duplicate the specified resource.
*
* @param \App\Models\Range $range
* @return \Illuminate\Contracts\View\View
*/
public function duplicate(Range $range): \Illuminate\Contracts\View\View
{
return $this->create($range->replicate());
}
}

View file

@ -0,0 +1,167 @@
<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\SeasonalSections\StoreSeasonalSectionRequest;
use App\Http\Requests\Bo\SeasonalSections\UpdateSeasonalSectionRequest;
use App\Models\SeasonalSection;
use App\Traits\Controllers\UpdateModelPublished;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class SeasonalSectionController extends Controller
{
use UpdateModelPublished;
/**
* Create the controller instance.
*/
public function __construct()
{
$this->authorizeResource(SeasonalSection::class);
}
/**
* Display a listing of the resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function index(Request $request): \Illuminate\Contracts\View\View
{
/** @var \Illuminate\Database\Eloquent\Builder $seasonalSectionModels */
$seasonalSectionModels = SeasonalSection::query();
/** @var string $search Search field */
$search = $request->search;
if ($search) {
$this->searchQuery(
$seasonalSectionModels,
$search,
null,
'title',
'text',
);
}
$searchFields = \implode(', ', [
Str::ucfirst(trans('validation.attributes.title')),
trans('validation.attributes.text'),
]);
/** Sort columns with a query */
$this->sortQuery($seasonalSectionModels);
/** Custom pagination */
$seasonalSectionModels = $this->paginate($seasonalSectionModels);
return view('bo.pages.seasonal_sections.index', compact('seasonalSectionModels', 'search', 'searchFields'));
}
/**
* Show the form for creating a new resource.
*
* @param \App\Models\SeasonalSection $seasonalSection
* @return \Illuminate\Contracts\View\View
*/
public function create(SeasonalSection $seasonalSection): \Illuminate\Contracts\View\View
{
return view('bo.pages.seasonal_sections.create', ['seasonalSectionModel' => $seasonalSection]);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Bo\SeasonalSections\StoreSeasonalSectionRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(StoreSeasonalSectionRequest $request): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request) {
$seasonalSection = new SeasonalSection();
$seasonalSection->fill($request->validated());
if ($seasonalSection->saveOrFail()) {
return redirect()->route('bo.seasonalsections.edit', $seasonalSection)
->with('success', __('crud.messages.has_been_created', [
'model' => Str::ucfirst(trans_choice('models.classes.seasonal_section', 1))
]));
}
return redirect()->back()
->with('error', __('crud.messages.cannot_be_created', [
'model' => Str::ucfirst(trans_choice('models.classes.seasonal_section', 1))
]));
});
}
/**
* Show the form for editing the specified resource.
*
* @param App\Models\SeasonalSection $seasonalSection
* @return \Illuminate\Contracts\View\View
*/
public function edit(SeasonalSection $seasonalSection): \Illuminate\Contracts\View\View
{
return view('bo.pages.seasonal_sections.edit', ['seasonalSectionModel' => $seasonalSection]);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\Bo\SeasonalSections\UpdateSeasonalSectionRequest $request
* @param \App\Models\SeasonalSection $seasonalSection
* @return \Illuminate\Http\RedirectResponse
*/
public function update(
UpdateSeasonalSectionRequest $request,
SeasonalSection $seasonalSection
): \Illuminate\Http\RedirectResponse {
return DB::transaction(function () use ($request, $seasonalSection) {
$seasonalSection->fill($request->validated());
if ($seasonalSection->saveOrFail()) {
return redirect()->route('bo.seasonalsections.edit', $seasonalSection)
->with('success', __('crud.messages.has_been_updated', [
'model' => Str::ucfirst(trans_choice('models.classes.seasonal_section', 1))
]));
}
return redirect()->route('bo.seasonalsections.edit', $seasonalSection)
->with('error', __('crud.messages.cannot_be_updated', [
'model' => Str::ucfirst(trans_choice('models.classes.seasonal_section', 1))
]));
});
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\SeasonalSection $seasonalSection
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(SeasonalSection $seasonalSection): \Illuminate\Http\RedirectResponse
{
if ($seasonalSection->deleteOrFail()) {
return redirect()->route('bo.seasonalsections.index')
->with('success', __('crud.messages.has_been_deleted', [
'model' => Str::ucfirst(trans_choice('models.classes.seasonal_section', 1))
]));
}
return redirect()->back()
->with('error', __('crud.messages.cannot_be_deleted', [
'model' => Str::ucfirst(trans_choice('models.classes.seasonal_section', 1))
]));
}
/**
* Duplicate the specified resource.
*
* @param \App\Models\SeasonalSection $seasonalSection
* @return \Illuminate\Contracts\View\View
*/
public function duplicate(SeasonalSection $seasonalSection): \Illuminate\Contracts\View\View
{
return $this->create($seasonalSection->replicate());
}
}

View file

@ -34,6 +34,7 @@ class SecureHeaders
public function handle(Request $request, Closure $next): Response
{
// phpcs:enable
$host = \parse_url(\config('app.url'), \PHP_URL_HOST);
View::share('nonce', $nonce = Vite::useCspNonce());
// * For VueJS dev tool to execute
$jsDev = config('app.debug') ? "'unsafe-eval' 'unsafe-inline'" : "'nonce-{$nonce}' 'strict-dynamic'";
@ -51,7 +52,11 @@ class SecureHeaders
"default-src 'none';",
"manifest-src 'self';",
// * CKEDITOR Specific https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/csp.html
"connect-src 'self' blob:;",
"connect-src 'self' " . implode(' ', [
// * VITE DEV
config('app.debug') ? "wss://vite.{$host}:4443" : '',
config('app.debug') ? "https://vite.{$host}:4443" : '',
]) . ';',
"img-src * data: blob:;",
'frame-src ' . implode(' ', [
'https://www.google.com/recaptcha/',
@ -62,6 +67,8 @@ class SecureHeaders
// ! Using CKEditor will must have unsafe-inline style
// phpcs:ignore Generic.Files.LineLength.TooLong
"style-src 'self' 'unsafe-inline' " . \implode(' ', [
// * VITE DEV
config('app.debug') ? "https://vite.{$host}:4443" : '',
'https://cdnjs.cloudflare.com',
// * File Manager
'https://fonts.googleapis.com',
@ -74,6 +81,8 @@ class SecureHeaders
// phpcs:ignore Generic.Files.LineLength.TooLong
"script-src 'self' {$jsDev} " . \implode(' ', [
'https: blob:',
// * VITE DEV
config('app.debug') ? "https://vite.{$host}:4443" : '',
'https://www.googletagmanager.com',
'https://cdnjs.cloudflare.com',
"$scheme://www.google-analytics.com",

View file

@ -20,7 +20,7 @@ class TrustProxies extends Middleware
* @var integer
*/
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |

View file

@ -0,0 +1,90 @@
<?php
namespace App\Http\Requests\Bo\Ranges;
use App\Traits\Requests\HasPicture;
use Illuminate\Foundation\Http\FormRequest;
class StoreRangeRequest extends FormRequest
{
use HasPicture;
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize(): bool
{
return auth('backend')->check();
}
/**
* Prepare the data for validation.
*
* @return void
*/
protected function prepareForValidation()
{
$this->merge([
'published' => $this->published ? true : false
]);
$this->mergePicture('picture');
$this->mergePicture('picture_productsheet');
$this->mergePicture('picture_thumbnail');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
$rules = [
'seo_title' => 'required|between:45,70',
'seo_description' => 'required|between:50,160',
'title' => 'required|string|between:3,100',
'subtitle' => 'required|string|between:3,255',
'tagline' => 'required|string|between:3,255',
'description' => 'required|string|min:15',
'picture_alt' => 'required|string|between:3,255',
'picture_title' => 'required|string|between:3,255',
'picture_productsheet_alt' => 'required|string|between:3,255',
'picture_productsheet_title' => 'required|string|between:3,255',
'picture_thumbnail_alt' => 'required|string|between:3,255',
'picture_thumbnail_title' => 'required|string|between:3,255',
'published' => 'required|boolean',
];
return \array_merge(
$rules,
$this->pictureRules('picture', 466, 440, 466, 440, false),
$this->pictureRules('picture_productsheet', 332, 442, 332, 442, false),
$this->pictureRules('picture_thumbnail', 246, 337, 246, 337, false),
);
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes(): array
{
return [
'seo_title' => trans('validation.custom.seo_title'),
'seo_description' => trans('validation.custom.seo_description'),
'title' => trans('validation.attributes.title'),
'subtitle' => trans('validation.custom.subtitle'),
'tagline' => trans('validation.custom.tagline'),
'description' => trans('validation.custom.description'),
'picture_alt' => trans('validation.custom.picture_alt'),
'picture_title' => trans('validation.custom.picture_title'),
'picture_productsheet_alt' => trans('validation.custom.picture_productsheet_alt'),
'picture_productsheet_title' => trans('validation.custom.picture_productsheet_title'),
'picture_thumbnail_alt' => trans('validation.custom.picture_thumbnail_alt'),
'picture_thumbnail_title' => trans('validation.custom.picture_thumbnail_title'),
'published' => trans('validation.custom.activated'),
];
}
}

View file

@ -0,0 +1,7 @@
<?php
namespace App\Http\Requests\Bo\Ranges;
class UpdateRangeRequest extends StoreRangeRequest
{
}

View file

@ -0,0 +1,80 @@
<?php
namespace App\Http\Requests\Bo\SeasonalSections;
use App\Enums\SeasonalSections\BackgroundEnum;
use App\Traits\Requests\HasPicture;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Enum;
class StoreSeasonalSectionRequest extends FormRequest
{
use HasPicture;
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize(): bool
{
return auth('backend')->check();
}
/**
* Prepare the data for validation.
*
* @return void
*/
protected function prepareForValidation()
{
$this->merge([
'published' => $this->published ? true : false
]);
$this->mergePicture('picture');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
$rules = [
'title' => 'required|string|between:3,100',
'text' => 'required|string|min:15',
'picture_alt' => 'required|string|between:3,255',
'picture_title' => 'required|string|between:3,255',
'background' => ['required', new Enum(BackgroundEnum::class)],
'published' => 'required|boolean',
'publish_at' => 'nullable|date',
'unpublish_at' => 'nullable|date|after:publish_at',
];
return \array_merge(
$rules,
$this->pictureRules('picture', 362, 542, 362, 542, false),
);
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes(): array
{
return [
'title' => trans('validation.attributes.title'),
'text' => trans('validation.attributes.content'),
'picture_alt' => trans('validation.custom.picture_alt'),
'picture_title' => trans('validation.custom.picture_title'),
'background' => trans('validation.custom.background'),
'published' => trans('validation.custom.activated'),
'publish_at' => trans('validation.custom.publish_at'),
'unpublish_at' => trans('validation.custom.unpublish_at'),
];
}
}

View file

@ -0,0 +1,7 @@
<?php
namespace App\Http\Requests\Bo\SeasonalSections;
class UpdateSeasonalSectionRequest extends StoreSeasonalSectionRequest
{
}

View file

@ -54,6 +54,7 @@ class Range extends Model
'slug',
'subtitle',
'tagline',
'description',
'picture',
'picture_alt',
'picture_title',

View file

@ -0,0 +1,120 @@
<?php
namespace App\Policies;
use App\Enums\Users\RoleEnum;
use App\Models\User;
use App\Policies\Rules\UserStaticRules;
class RangePolicy
{
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function viewAny(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can view the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function view(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can create models.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function create(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can update the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function update(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can delete the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function delete(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can restore the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function restore(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can permanently delete the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function forceDelete(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can duplicate the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function duplicate(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can publish/unpublish the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function changePublished(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can change the order of the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function changeOrder(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
}

View file

@ -0,0 +1,109 @@
<?php
namespace App\Policies;
use App\Enums\Users\RoleEnum;
use App\Models\User;
use App\Policies\Rules\UserStaticRules;
class SeasonalSectionPolicy
{
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function viewAny(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can view the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function view(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can create models.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function create(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can update the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function update(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can delete the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function delete(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can restore the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function restore(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can permanently delete the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function forceDelete(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can duplicate the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function duplicate(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Determine whether the user can publish/unpublish the model.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function changePublished(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
}

View file

@ -3,6 +3,8 @@
namespace App\Providers;
use App\Models\Commitment;
use App\Models\Range;
use App\Models\SeasonalSection;
use App\Models\User;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
@ -44,6 +46,8 @@ class RouteServiceProvider extends ServiceProvider
Route::model('user', User::class);
Route::model('commitment', Commitment::class);
Route::model('range', Range::class);
Route::model('seasonal_section', SeasonalSection::class);
}
/**

View file

@ -15,7 +15,7 @@ class SeasonalSectionFactory extends Factory
{
return [
'title' => fake()->sentence(),
'text' => fake()->text(),
'text' => \clean(\fake()->randomHtml(6, 7)),
'picture_alt' => fake()->sentence(),
'picture_title' => fake()->sentence(),
'published' => false,

View file

@ -16,16 +16,17 @@ class RangeSeeder extends Seeder
public function run()
{
FileStorageHelper::removeModelFiles(new Range());
Range::factory(10)->create([
'picture' => FileStorageHelper::storeFile(new Range(), new \SplFileInfo(\resource_path(
Range::factory(10)->make()->each(function (Range $range) {
$range->picture = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path(
'../database/factories/assets/ranges/default-picture-466x440.png'
))),
'picture_productsheet' => FileStorageHelper::storeFile(new Range(), new \SplFileInfo(\resource_path(
)));
$range->picture_productsheet = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path(
'../database/factories/assets/ranges/default-picture-332x442.png'
))),
'picture_thumbnail' => FileStorageHelper::storeFile(new Range(), new \SplFileInfo(\resource_path(
)));
$range->picture_thumbnail = FileStorageHelper::storeFile($range, new \SplFileInfo(\resource_path(
'../database/factories/assets/ranges/default-picture-246x337.png'
))),
]);
)));
$range->save();
});
}
}

View file

@ -20,15 +20,21 @@ class SeasonalSectionSeeder extends Seeder
$publish_at = now()->subDays(rand(1, 10));
$unpublish_at = $publish_at->copy()->addDays(rand(10, 20));
foreach (BackgroundEnum::cases() as $i => $background) {
SeasonalSection::factory(1)->create([
'background' => $background,
'published' => $i === array_key_first(BackgroundEnum::cases()) ? true : false,
'publish_at' => $publish_at->subMonths(),
'unpublish_at' => $unpublish_at->subMonths(),
'picture' => FileStorageHelper::storeFile(new SeasonalSection(), new \SplFileInfo(
\resource_path('../database/factories/assets/seasonalsections/default-picture-362x542.png')
)),
]);
SeasonalSection::factory(1)->make()->each(
function (SeasonalSection $seasonalSection) use ($background, $i, $publish_at, $unpublish_at) {
$seasonalSection->background = $background;
$seasonalSection->published = $i === array_key_first(BackgroundEnum::cases()) ? true : false;
$seasonalSection->publish_at = $publish_at->subMonths();
$seasonalSection->unpublish_at = $unpublish_at->subMonths();
$seasonalSection->picture = FileStorageHelper::storeFile(
new SeasonalSection(),
new \SplFileInfo(
\resource_path('../database/factories/assets/seasonalsections/default-picture-362x542.png')
)
);
$seasonalSection->save();
}
);
}
}
}

3142
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,7 @@
{
"private": true,
"scripts": {
"vite": "vite --https --host vite.agis.test --port 4443 --clearScreen false",
"prod": "vite build --mode production",
"dev": "NODE_ENV=development vite build -d --mode development",
"watch": "NODE_ENV=development vite build --mode development --watch",
@ -12,6 +13,8 @@
"stylelint-ci": "node ./node_modules/.bin/stylelint --config './.stylelintrc.json' --max-warnings 0 '**/resources/**/*.scss' -f json"
},
"devDependencies": {
"@babel/core": "^7.22.11",
"@babel/types": "^7.21.2",
"@fortawesome/fontawesome-svg-core": "latest",
"@fortawesome/free-brands-svg-icons": "latest",
"@fortawesome/free-regular-svg-icons": "latest",
@ -21,6 +24,9 @@
"@types/bootstrap": "^5.2.7",
"@types/node": "^20.8.2",
"@types/toastify-js": "^1.12.1",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.36.2",
"@vitejs/plugin-basic-ssl": "^1.0.1",
"@vitejs/plugin-legacy": "latest",
"@vitejs/plugin-vue": "latest",
"@vue/compiler-sfc": "latest",
@ -30,24 +36,34 @@
"bootstrap": "^5.3.2",
"chart.js": "^4.4.0",
"cropperjs": "^1.6.1",
"eslint": "latest",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-vue": "latest",
"eslint": "latest",
"laravel-vite-plugin": "latest",
"postcss-discard-comments": "^6.0.0",
"prettier": "latest",
"print-js": "^1.6.0",
"resolve-url-loader": "^5.0.0",
"sass": "latest",
"slugify": "^1.6.6",
"stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order",
"stylelint-config-sass-guidelines": "latest",
"stylelint-config-standard-scss": "latest",
"stylelint-scss": "latest",
"stylelint": "latest",
"sweetalert2": "^11.7.31",
"terser": "latest",
"toastify-js": "^1.12.0",
"ts-loader": "^9.3.1",
"typescript-eslint": "^0.0.1-alpha.0",
"typescript": "latest",
"vite-plugin-babel": "^1.1.3",
"vite-plugin-checker": "latest",
"vite-plugin-eslint": "latest",
"vite-plugin-stylelint": "latest",
"vite": "^4.0.0",
"vue-eslint-parser": "^9.1.0",
"vue-loader": "^16.8.3",
"vue": "latest",
"vue-tsc": "1.6.0"
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Calque_2" data-name="Calque 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 494.95 536.08">
<defs>
<style>
.cls-1 {
fill: #272724;
stroke-width: 0px;
}
.cls-2 {
opacity: .1;
}
</style>
</defs>
<g id="menu_ouvert" data-name="menu ouvert">
<g class="cls-2">
<polyline class="cls-1" points="272.39 200.82 255.04 236.75 267.27 242.66 284.62 206.73"/>
<polyline class="cls-1" points="228.84 291.02 210.41 329.19 222.64 335.1 241.07 296.92"/>
<g>
<g>
<path class="cls-1" d="m30.94,239.64c.32-2.07.96-2.94,1.18-3.47.3-.74.26-.42.86-1.41.94-1.57,2.81-3.15,4.38-3.92.47-.23,2.24-.82,2.58-.9,1.65-.45,2.82-.49,4.08-.36,1.81.19,2.99.53,4.62,1.36.69.35,1.4.97,1.95,1.47,1.01.93,2.78,3.16,3.69,4.52.12-.1,1.18-.71,1.82-1.08.65-.38,1.22-.59,1.98-.91,1.45-.63,2.89-.64,3.38-.64,2.04.1,3.82.55,5.78,1.97,1.13.84,2.12,1.99,2.77,3.27.47.77.88,1.64,1,2.65.06.51.27,1.13.32,1.75.09.78.12,1.56.1,2.28-.04.99-.15,1.98-.46,2.88-.41,1.29-1.09,2.55-2.05,3.78-.2.31-.38.52-.58.77-.18.2-.67.6-1.03.84-1.5,1.17-3.32,2.15-5.21,2.29-1.18.15-1.88-.03-3.07-.26-.54-.11-1.14-.28-1.77-.52-.38-.15-1.11-.56-1.37-.75-.92-.7-2.06-1.48-3.07-3.02-1.02-1.38-1.89-2.63-2.38-3.78-.88.52-1.77,1.09-2.6,1.61-.94.57-1.89,1.14-2.78,1.71l-1.6,1c.93.65,1.78,1.06,2.52,1.37,1.38.58,2.37.68,2.8.78,1.94.53,2.43.53,2.34,1.46l-.15,1.48c-.05.49-.15.92-.2,1.42l-.37,3.12c-.06.54-.54.44-1.37.36-.88-.09-4.33-.99-5.65-1.58-1.15-.61-4.05-1.52-6.23-4.07-.48.39-1.74,1.32-2.26,1.59-1.12.66-1.14.83-2.21,1.6l-1.19.77c-.12.04-.89.57-1.12.65-.06.05-.35.19-.54.34-.06.05-.18.09-.28.08-.22-.02-.48-.21-.44-.6.07-1.27.33-3.73.51-5.59l.31-3.01c.08-.22.32-.41.43-.45.12-.1.37-.35.48-.4.47-.29,1.37-.97,1.68-1.21-.33-.53-.53-.77-.75-1.35-.34-.98-.8-1.36-1.2-3.44-.17-1.01-.27-2.19-.16-3.34.11-1.03.33-2.12.48-3.11Zm7.75,5.89c.09.18.46.88.61,1.06,1.59-.95,2.49-1.63,4.03-2.58.48-.33,1.12-.72,1.65-.99.95-.62,1.5-1.12,2.43-1.63-1.39-2.58-3.5-3.07-3.99-3.12-.7-.18-1.47-.21-2.34.15-.52.22-1.24.7-1.67,1.16-.73.7-.98,2.05-1.09,3.15-.09.82.07,2,.38,2.81Zm20.39,2.47c.71.62.88.59,1.19.73.32.08.94.04,1.11.05.72-.03,1.18-.21,1.75-.87.56-.61.75-1.42.81-2.46.04-.94-.27-1.69-.62-2.06-.6-.56-1.28-1.02-2.35-.85-1.52.24-2.57.79-4.08,2.07.97,1.88,1.38,2.69,2.2,3.38Z"/>
<path class="cls-1" d="m49.75,321.42c-.76.14-4.02.63-4.02.63l-2.22.41c-.55.05-.79-.36-1.61-.87-1.41-.97-3.37-2.51-4.25-3.63-1.27-1.72-2.25-3.11-2.88-4.39-.91-1.9-1.37-3.44-1.69-5.22-.13-.7-.21-1.42-.36-2.23-.08-.71-.31-1.34-.13-3.38.03-.73-.05-1.5.21-2.22.21-.65.15-1.31.42-1.92.77-1.6,1.09-2.89,2.62-5.18.61-.9,1.47-2.01,2.66-3.46.36-.46,2.4-1.84,2.95-2.17,3.16-1.93,5.95-2.9,8.38-3.34,1.4-.26,2.73-.34,3.91-.33,2.48.1,4.37.64,5.59.92,1.8.39,3.55,1.08,5.26,2.15,1.34.93,2.83,1.99,4.05,3.45.37.49,2.18,2.45,2.74,3.91.04.22.92,1.95.99,2.33.35.99.45,1.2.56,1.79.08.44.16,1.14.4,2.78.26,1.68.19,3.43-.07,5.04-.32,1.91-.94,3.7-1.66,4.95-.85,1.45-1.56,2.74-2.67,3.96-.41.47-1.17,1.22-1.6,1.64-.15.08-.3.17-.41.18-.27.05-.5.04-.63-.11-.46-.36-.53-.4-.89-.9-.36-.43-.86-.73-1.22-1.17-.63-.67-1.06-.87-2.15-1.94-.27-.29-.56-.63-.87-1.07-.08-.1-.1-.2-.12-.31-.03-.16.05-.34.18-.53,1.01-.91,1.74-2.11,2.36-3.23.4-.86.74-1.76.96-2.64.36-1.35.28-2.68.12-3.54-.22-1.19-.72-2.66-1.2-3.46-.49-.81-1.67-2.04-3.1-3.17-1.38-1.09-3.04-1.62-4.52-1.79-1.08-.08-2.54-.42-4.81,0-.43.08-1.19.22-1.61.36-1.74.54-3.63,1.85-4.11,2.21-.96.85-1.71,1.66-2.39,2.79-.18.25-.29.56-.51.88-.25.43-.51.87-.58,1.39l-.16.64c-.31,1.06-.39,1.47-.42,2.54-.02.51.03,1.67.25,2.86.18.97.54,2.03.96,2.78.24.41.6,1.4.95,1.78.34.33,1.26,1.39,1.53,1.62l.38.26,2.92-.54-.56-3.03c-.4-2.16-.59-2.85-.72-3.89-.07-.38.09-.74.41-.8l.59-.11c.22-.04.8-.2,1.12-.26.7-.13,1.83-.39,2.05-.44l1.4-.26c.54-.1,1.35-.25,1.78-.33.33-.06.73.03.83.51.02.11.26,1.13.58,2.86.17.92.19,1.3.34,2.18l.52,2.8c.32,1.73.68,3.68.75,4.06l.52,2.81c.08.43-.09.68-.35.84-.04.06-1.98.48-3.72.75-1.29.24-3.3.61-4.04.81Z"/>
<path class="cls-1" d="m55.45,370.33c-.26.12-.5-.32-.57-.47-.2-.45-.44-1.13-.71-1.73l-1.52-3.3c-.63-1.4-.98-2.33-.98-2.33-.09-.21-.06-.4.12-.54l2.3-1.87c.3-.25,1.66-1.28,2.93-2.2l-3-6.73-1.83-4.12-2.96.53c-.55.13-2.93.46-3.2.52-.5.1-.81.06-.97-.29-.4-.91-.66-1.63-1.27-2.99-.2-.45-.48-.93-.68-1.39-.52-1.15-1.14-2.69-1.2-2.83-.18-.4-.09-.62.11-.71.15-.07.57-.19.75-.21l1.21-.12c.24,0,.65-.17,3.22-.47,4.16-.53,7.48-.92,10.18-1.22,2.03-.3,3.69-.5,5.08-.63l5.96-.66c1.36-.19,2.18-.25,4.11-.5,1.41-.09,3.35-.59,6.81-.8-.45.07,2.55-.36,3.29-.32.17-.02.37.02.41.12l1.13,2.27.55,1.38.61,1.35c.49,1.11.28.78,1.09,2.59.22.51.24.68.4,1.03.27.6.2.45-.24.95-.25.23-.76.45-.84.55-.18.15-2.04,1.63-2.25,1.72-.23.16-.39.35-.61.51l-2.84,2.41c-.36.28-3.92,3.37-8.38,7.15-1.49,1.26-3.1,2.52-4.66,3.88-3.1,2.64-6.22,5.23-8.72,7.18,0,0-1.49,1.26-2.25,1.84-.13.12-.39.35-.58.44Zm7.72-19.08l.65,1.46c1-.86,1.88-1.31,2.96-2.28.24-.28,1.4-1.05,1.4-1.05,1.13-.98,2.05-1.75,3.17-2.61.77-.58,2.43-1.98,4.07-3.31-1.24.19-5.01.66-6.17.88l-4.61.72-3.9.71c.47,1.05,1.05,2.36,1.46,3.14.45.89.69,1.68.98,2.34Z"/>
<path class="cls-1" d="m70.43,394.26c-1.24-1.96-1.86-3.27-2.28-5.15-.23-1.06-.45-2.67-.41-3.45.02-.9.14-3.72.44-5.25.07-.46.15-.73.33-.86.13-.09.42-.17.7-.17.5.04.73-.12,1.18.02.34.1.57.13.84.13,1.21.06,3.03.5,4.03.66.58.05.74.27,1.19.42.08.01.14.1.18.14.16.22.13.45.11.61-.21,1.66-.36,3.13-.18,5.05.15,1.6.73,3.15,1.74,4.52.46.62,1.05,1.14,1.68,1.63.14.1.47.27.69.38.72.42,2,.3,2.46.1.38-.14,1.21-.68,1.51-1.11.3-.43.41-1.12.45-1.9.04-.51.01-1.1-.07-1.58-.1-.61-.32-1.27-.45-1.93-.44-1.79-.38-1.91-.93-3.68-.15-.58-.31-1.35-.48-1.97-.13-.45-.36-1.03-.44-1.52-.27-1.3-.39-1.83-.39-2.86,0-.27-.06-.36-.03-.59,0-.48-.01-.94.07-1.48.06-.66.43-2.3.58-2.75.34-1.21,1.09-2.23,2.13-3.34.47-.48.89-.92,1.38-1.28,1.15-.85,2.17-1.32,2.67-1.48.66-.22,1.61-.78,3.82-.76,1.77,0,3.52.42,6.05,1.63,1.17.57,2.79,2.05,3.4,2.69.65.69,1.19,1.24,1.71,1.95.75,1.02,1.56,2.4,1.82,3.03.74,1.85,1.21,2.66,1.38,5.88.04.52.04,1.82-.28,4.17-.05.58-.26,1.42-.61,1.68-.13.09-.54.19-.77.16-.53-.16-.94,0-1.9-.17-1.34-.25-2.19-.1-3.81-.35-.15-.02-.9-.3-1-.43-.16-.22-.25-.43-.19-1.09.07-.46.24-2.09-.05-4.06-.11-1.08-.34-2.14-1.14-3.33l-.65-.89c-.78-.86-1.06-1.54-2.37-2.01-1.35-.44-2.43-.05-2.98.69-.2.28-.53.94-.56,1.37,0,.82-.06,1.68.08,2.33.27,1.3,1.06,3.59,1.71,6.32.26,1.1.56,2.25.73,3.42.27,1.58.24,2.56.18,3.49-.07.94-.1,1.92-.66,3.76-.25.87-.94,1.78-1.56,2.98-.16.26-.67.76-.86.97-.34.39-.7.72-1.19,1.08-.4.29-1.14.77-1.57,1.01-1.29.75-3.1.99-3.68,1.13-1.88.42-3.67.31-4.52-.02-2.11-.84-2.5-.89-4.13-2.09-1.17-.85-2.21-1.79-2.53-2.23-.26-.36-.6-.72-.89-1.12-.55-.75-1.09-1.59-1.66-2.54Z"/>
<path class="cls-1" d="m137.28,407.58l-1,1.1c-.52.57-1.41,1.54-1.97,2.15-.74.73-1.71,1.72-2.01,2.04-.18.2-.5.22-.78-.04-.52-.48-1.17-.92-2.79-2.41-1.42-1.29-2.81-2.63-4.23-3.93l-1.52,1.66-4.34,4.74c-1.37,1.5-3.11,3.41-5.49,5.93-.71.78-1.56,1.78-2.49,2.81l-4.08,4.47-3.08,3.37c-.11.12-.42.37-.74.07l-1.62-1.49c-1.63-1.48-3.66-3.42-3.86-3.6-.08-.07-.33-.45,0-.82l5.82-6.45,1.45-1.5,1.3-1.42c.63-.69,3.97-4.35,4.67-5.19l2.04-2.24c.48-.53.89-1.06,1.33-1.54.19-.21,1.07-1.26,1.59-1.82l.89-.98,1.7-1.86-.08-.08c-.32-.3-3.45-3.07-4.06-3.63l-2.97-2.79c-.33-.37-.03-.7.04-.78.37-.41,1.19-1.22,2.05-2.16l2.52-2.76c.6-.65.87-.54,1.28-.17.94.85,2.34,1.92,3.36,2.92.53.49.98.97,1.51,1.46.32.3.37.41.9.89,1.95,1.78,3.97,3.56,5.92,5.34l4.14,3.78c1.5,1.37,3,2.74,4.51,4.12.24.22.29.57.07.81Z"/>
<path class="cls-1" d="m150.37,461.26c-.14.24-.52.34-.8.17l-.72-.41c-.24-.14-.5-.23-.74-.37-.21-.19-2.7-1.58-2.7-1.58-1.45-.91-2.25-1.38-2.73-1.65-.97-.63-.63-.88-.55-1.79.02-.37.14-.56.17-1.17.2-1.1.36-2.47.59-3.73.08-.78.17-1.49.25-2.07.09-.71.24-1.39.33-2.1.02-.37.32-1.97.4-2.31.03-.05.04-.29.09-.59l-.81-.47c-.62-.36-2.35-1.31-3.21-1.81l-.76-.45c-.11.19-.25.43-.36.62-.11.19-1.01,1.83-2.78,4.87l-1.11,1.89c-.28.48-.56,1.07-.87,1.6l-.81,1.38c-.11.2-.32.45-.61.29l-.42-.25-.6-.28-3.41-2.12c-.66-.39-1.35-.73-2.02-1.12-.33-.19-.5-.55-.34-.83.39-.67.7-1.31,1.09-1.98l1.22-2.09c1.11-1.9,2.22-4.12,3.39-5.91.19-.33.41-.59.58-.87.27-.47.52-.9.73-1.35l1.38-2.37,3.32-5.9.94-1.61c1.55-2.66,3.62-6.1,3.98-6.72.75-1.4,2.13-3.65,2.69-4.6.22-.38.45-.56.88-.31l.24.14c.85.5,2.32,1.35,3.75,2.18l2.83,1.59,1.71,1c1.95,1.14,4.1,2.14,6.02,3.96.84.74,2.34,2.64,2.48,2.85,1.18,1.58,2.02,3.73,2.12,6.08.01.52.04,1.36.05,1.43-.03.81-.18,1.61-.41,2.55-.2.78-.53,1.67-.83,2.51-.26.68-.74,1.48-1.12,2.15s-.85,1.35-1.33,1.96c-.05.09-.48.61-.61.72-.7.55-.81.74-2.81,1.98-.88.63-2.03,1.18-4.25,1.72l-1.83.2c-.05-.02-.08.02-.12,0-.01.13-.04.17-.02.25-.13.87-.46,3.29-.53,4.08-.05,1.18-.13,1.96-.23,3.11-.15,1.57-.32,2.61-.47,4.18-.02.25-.13,1.2-.15,2.21-.01.57-.09,1.03-.17,1.17Zm-3.83-26.03c.59.29,1.76,1.02,2.35,1.31.14.08.55.26.77.32.75.24,1.43.39,2.12.29.93-.17,1.63-.39,2.14-.73.49-.41,1-.94,1.56-1.69.17-.28.46-1,.54-1.15.14-.24.32-.65.2-1.86-.16-1.37-.57-2.18-1.55-3.13-.6-.61-1.47-1.3-2.7-2.02l-3.42-1.99c-.44.64-.71,1.11-.9,1.44l-1.68,2.77c-.91,1.56-1.97,3.37-2.61,4.58l.67.39c.38.23,1.97,1.21,2.52,1.47Z"/>
<path class="cls-1" d="m185.29,475.36c-1.04-.35-1.38-.39-3.18-1.48-.63-.41-1.25-.64-1.72-1.18-.49-.48-1.31-.83-1.72-1.4-1.05-1.33-1.85-1.96-3.26-4.25-.64-.98-1.15-2.39-1.95-4.21-.11-.2-.64-3.16-.68-3.63-.22-2.24-.2-3.89.4-6.81.13-.65.23-1.2.47-2.05.47-1.64,1-3.09,2.66-5.71.54-.88,1.37-1.78,2.06-2.62,1.72-2.03,3.88-3.59,6.1-4.55,2.83-1.31,6.31-1.87,7.5-1.82,3.04.18,4.51.25,6.52.83.79.23,1.68.54,2.87.99,1.03.4,2.09,1.11,3.22,1.94,1.15.79,2.19,1.77,3.51,2.95.54.5.78,1.08,1.18,1.66,1.36,1.87,2.27,3.67,2.84,5.73.42,1.54.7,3.17,1,4.92.1.66-.11,1.4-.03,2.11.01.75-.04,1.54-.18,2.23-.25,1.48-.38,2.35-.58,3.04-.27.95-.66,1.92-1.21,3.26-.25.67-.61,1.31-.98,2.01-.32.71-.86,1.42-1.48,2.38-.41.62-1,1.31-1.51,1.68-.47.44-1.01,1.14-1.52,1.51-.96.76-.51.38-3.07,1.93-1.37.81-2.66,1.3-3.73,1.63-1.8.51-3.18.52-3.84.62-.36.07-3.35-.1-3.68-.14-.79-.05-1.86-.3-2.86-.59-1.43-.41-2.83-.92-3.15-1.01Zm7.25-6.98c1.34.1,1.61.17,3.63-.28.38-.12.95-.13,1.51-.49.63-.39,1.22-.68,1.66-1.01,1.09-.83,1.44-1.25,2.19-2.07.98-1.03,1.52-2.71,1.85-3.7l.4-1.21c.19-.69.32-1.51.35-2.24.11-1.57.15-2.94-.09-3.69-.23-.98-.75-2.79-.9-3.06-.71-1.34-1.6-2.23-2.53-3.18-1.29-1.29-1.9-1.57-2.91-2.04-.96-.44-1.89-.59-2.7-.77-2.83-.52-4.4,0-5.65.34-1.14.58-1.67.84-2.48,1.29-.27.15-.46.39-.66.49-.39.35-.79.58-1.11.89-1.14,1.17-2.23,2.79-2.93,5.06-.64,2.05-.73,3.57-.59,5.1.15,1.47.22,2.06.64,2.98.55,1.3,1.49,2.82,1.49,2.82.23.58.86.99,1.26,1.39.91,1.01,2.18,2,4.08,2.53.26.08,1.8.69,3.49.82Z"/>
<path class="cls-1" d="m259.76,444.79c-.01,1.21-.13,1.76-.14,2.86l-.06,6.27c-.01,1.43-.1,4.57-.13,7.31l-.02,1.76c-.04,3.91-.27,10.23-.31,14.47-.02,1.6-.03,3.03.02,3.8l-.02,1.27c0,.22,0,.6-.06.88,0,.22-.28.38-.39.38l-2.04.03c-.27,0-.82,0-1.48-.07-.33.05-.66.05-1.1.05-1.43-.02-1.76-.07-1.87-.07-.82,0-1.1-.23-1.53-.95l-1.57-2.66c-.81-1.33-1.68-2.71-2.49-4.04-.7-1.22-1.9-2.94-2-3.32-.7-1.5-2.71-4.49-3.36-5.43l-1.78-3.04c-.76-1.16-1.46-2.49-1.89-3.43-.03,2.75.02,3.31.02,3.31.05.82.03,2.69,0,5.72l-.12,6.77c-.03,2.75,0,5.01,0,6,0,.99-.39.94-.67.93-2.31.04-2.53-.02-3.69-.03h-.66c-1.38-.02-.94.03-1.93.03-.11,0-.66-.06-1.16-.07-.27,0-.66,0-.65-.66.01-1.21.07-1.98.09-3.08l.06-6.16c0,.22.1-4.57.13-7.32l.02-1.76c.04-3.91.21-10.18.25-14.41.02-1.6.03-3.14-.01-3.91,0-.44.06-.82,0-1.26,0-.22,0-.61.06-.88,0-.22.11-.38.38-.36.66.01,1.26-.04,1.92-.03.44,0,1.65.07,2.6.05h.71c.61-.04,1.05-.04,1.16-.03,1.38.01,1.43.29,1.81,1.06,1.41,2.71,1.99,3.93,3.13,6.09l1.79,3.04s1.35,2.1,3.24,5.7c1.51,2.98,1.95,3.43,2.87,5.2.16.28,1.03,1.82,1.14,2.1s.43.89.75,1.55l.05-5.06c-.04-.83-.03-2.7,0-5.72l.12-6.77c.03-2.86,0-5.07,0-6.06.01-1.05.4-1.04.67-1.04,2.31.03,2.53.09,3.68.1h.66c1.37.02,2.03.08,3.02.09h.05c.28,0,.72.06.71.83Z"/>
<path class="cls-1" d="m298.27,477.74c-1.08.22-1.39.36-3.49.34-.75-.04-1.4.08-2.08-.14-.67-.17-1.55-.06-2.19-.34-1.58-.61-2.58-.75-4.95-2.02-1.05-.52-2.2-1.48-3.81-2.65-.2-.12-2.15-2.4-2.42-2.78-1.32-1.82-2.15-3.25-3.1-6.07-.22-.63-.41-1.14-.63-2-.42-1.65-.7-3.17-.59-6.27.02-1.03.27-2.23.45-3.29.46-2.62,1.54-5.06,2.96-7.02,1.78-2.56,4.5-4.8,5.55-5.36,2.71-1.38,4.01-2.06,6.03-2.58.8-.21,1.72-.39,2.98-.6,1.09-.17,2.36-.1,3.76.05,1.39.1,2.78.42,4.52.76.72.16,1.22.54,1.86.82,2.12.93,3.82,2.03,5.34,3.51,1.14,1.13,2.21,2.38,3.35,3.74.42.52.61,1.26,1.04,1.83.39.64.74,1.34.98,2.01.53,1.39.86,2.22,1.04,2.91.25.96.4,2,.59,3.44.13.7.14,1.44.18,2.22.09.77-.03,1.65-.07,2.8-.04.74-.2,1.64-.45,2.22-.18.62-.3,1.5-.55,2.07-.44,1.14-.25.58-1.67,3.21-.78,1.4-1.63,2.47-2.39,3.29-1.3,1.36-2.48,2.07-3,2.48-.28.25-2.94,1.61-3.24,1.75-.7.35-1.75.68-2.77.94-1.44.37-2.9.64-3.22.72Zm2.73-9.69c1.21-.59,1.47-.66,2.98-2.07.27-.3.76-.6,1.06-1.19.34-.66.71-1.21.92-1.71.52-1.27.61-1.81.84-2.89.32-1.39-.06-3.11-.27-4.13l-.26-1.24c-.18-.69-.49-1.46-.83-2.12-.7-1.41-1.36-2.6-1.95-3.14-.7-.73-2.06-2.02-2.33-2.18-1.29-.8-2.5-1.11-3.79-1.46-1.76-.45-2.43-.39-3.54-.27-1.05.1-1.93.44-2.72.7-2.7.98-3.8,2.23-4.7,3.14-.69,1.09-1.02,1.57-1.49,2.38-.16.26-.19.56-.31.76-.16.5-.39.9-.51,1.33-.39,1.58-.5,3.54.03,5.84.49,2.09,1.18,3.44,2.07,4.69.88,1.19,1.23,1.67,2.06,2.25,1.13.84,2.71,1.68,2.71,1.68.49.39,1.24.42,1.79.56,1.3.4,2.89.62,4.8.12.27-.07,1.9-.32,3.42-1.06Z"/>
<path class="cls-1" d="m375.3,441.74c.2.33-.07.62-.22.71-.71.42-1.34.86-2.22,1.32l-1.1.73s-.62.37-.66.39c-.95.56-1.35.74-2.29,1.3-.52.31-.61.17-.88-.18-1.69-2.52-1.53-2.36-2.94-4.4-.5-.72-1.1-1.84-2.28-3.39-.68-.93-1.3-1.85-1.93-2.81-.29-.47-.92-1.31-1.2-1.79-.67-1.01-1.38-1.99-2.05-3-.25-.43-2.43-3.87-4.85-7.49.34,1.33.71,2.59.87,3.07.98,3.26,1.56,5.1,2.1,7.08l.48,1.76c.35,1.46.89,2.67,1.3,4.22.2.77.55,2.1.75,2.75.47,1.64,1.31,4.35,1.31,4.35.15,1,.9,3.44.96,3.98.07.54.29.6-.23.91-.62.37-.54.39-1.39.89l-1.04.62c-.28.17-.57.34-.8.48l-1.04.62c-.8.48-.59.41-1.42.85-.55.26-.47.28-.94-.08-.31-.2-2.32-2.27-3.03-2.93,0,0-2.37-2.37-3.67-3.58-.35-.37-1.4-1.28-1.74-1.53-1.15-1.17-1.99-2.14-3.1-3.15-.31-.19-2.27-2.3-2.5-2.48-1.48-1.42-2.27-2.3-4.05-3.99l-1.94-1.86c1.93,3.66,3.77,6.98,4.03,7.4.58,1.06,1.1,2.16,1.67,3.23.28.48.67,1.46.96,1.93.59.99,1.06,2,1.56,3.05.89,1.71,1.54,2.8,1.95,3.58,1.17,2.18,1.11,1.96,2.52,4.65.18.41.26.55-.26.86-.99.59-1.25.81-2.24,1.4l-.75.45c-.28.17-.83.43-1.17.63l-2.03,1.21c-.43.26-.65.2-.82-.08-.2-.34-.34-.57-.49-.93-2.3-4.39-4.55-8.82-6.86-13.21l-1.87-3.56c-2.57-4.75-4.12-7.67-4.78-8.88-.15-.35-1.46-3.1-2.46-4.87l-1.44-2.73c-.18-.41-.05-.93.28-1.13.52-.31,1.06-.7,1.58-1.01.54-.39,1.51-.9,2.46-1.47.1-.05.24-.14.36-.15l1.37-.81s.05-.03.1-.06l3.03-1.8c.52-.3.97.13,1.5.58.76.83,2.31,2.15,4.11,3.89,1.33,1.25,2.87,2.77,4.58,4.45,1.86,1.84,3.03,2.93,5.55,5.34l1.81,1.74c.19.21,1.52,1.59,2.89,3.01-.56-1.9-1.14-3.74-1.24-4l-.67-2.42c-.54-1.98-.89-3.31-1.25-4.57-.24-.95-.55-1.79-.8-2.86-.67-2.29-1.31-4.35-1.79-6.11-.67-2.42-1.18-4.36-1.56-5.42-.25-.62-.41-1.23.15-1.57l3.03-1.8c.75-.45,1.49-.95,2.19-1.37.85-.51,1.63-1.04,2.17-1.29.52-.31,1.12-.6,1.64-.92.33-.2.86-.06,1.13.29l1.72,2.56c1.09,1.72,2.87,4.18,3.12,4.48,1,1.58,2.54,3.93,5.54,8.42l2.99,4.37c2.09,2.98,6.3,9.18,7.75,11.4.19.21.36.49.5.73Z"/>
<path class="cls-1" d="m409.3,408.51c.16.16.35.43.55.7.19.27,0,.55-.34.89-.86.86-2.36,2.38-4.29,4.41l-.81.83c-1.7,1.71-3.02,3.13-4.64,4.76l-5.73,5.79c-.42.43-.73.66-.96.89-.15.16-.35.28-.78-.07-.31-.31-.98-1.04-1.48-1.54l-1.21-1.12-2.93-2.9c-2.23-2.13-3.86-3.75-6.44-6.3l-1.83-1.9c-.78-.78-1.6-1.43-2.42-2.25-3.24-3.21-5.71-5.8-7.74-7.89l-1.48-1.4-1.84-1.82c-.23-.23-.31-.62-.12-.81.16-.24,1.24-1.33,2.55-2.74l.77-.78c.58-.59,1.63-1.64,2.2-2.23l.93-.94c1.27-1.21,2.82-2.77,2.94-2.89l1.62-1.64c2.05-2.07,4.87-5,5.26-5.39.27-.28.62-.16.78,0,.19.19.51.43.74.66l3.36,3.4c.35.35.7.78,1.06,1.12.27.27.43.5.04.9l-1.2,1.21c-.31.31-.58.58-.89.9l-.81.82c-.27.27-1.67,1.68-1.94,1.96l-.69.7c-.62.63-2.05,1.99-2.67,2.62l-2.51,2.54c.59.57,1.29,1.27,2.11,2.09.51.42,1.76,1.66,3.05,2.86l.93-.94,2.28-2.3,1.05-1.14,1.16-1.17c.39-.39,1.9-1.91,2.2-2.14l.81-.74c.54-.47.74-.28,1.13.11,0,0,.51.35,1.09.93.47.47,1.17,1.24,1.72,1.78l1.95,2.01c.47.47.31.7-.04,1.05l-3.75,3.79-4.53,4.57.51.49c.43.42.7.7,1.1,1.16,1.09,1.08,1.99,1.9,3.27,3.19l.51.5,3.75-3.79c.82-.82,1.55-1.64,2.36-2.46l1-1.09c1.39-1.41,2.28-2.3,3.67-3.71.31-.31.74-.2.86-.08.04.04.82.74,1.72,1.62.98.89,2.34,2.24,3.05,2.94Z"/>
</g>
<g>
<path class="cls-1" d="m143.86,124.48c.14.17.32.45.49.74.17.28-.04.54-.42.86-.92.79-2.55,2.18-4.64,4.05l-.88.75c-1.84,1.57-3.26,2.87-5.02,4.37l-6.18,5.29c-.46.39-.79.6-1.04.82-.17.14-.37.24-.77-.14-.28-.34-.89-1.12-1.35-1.66l-1.11-1.22-2.68-3.13c-2.04-2.3-3.55-4.06-5.91-6.81l-1.68-2.04c-.72-.83-1.48-1.56-2.23-2.44-2.97-3.46-5.21-6.25-7.07-8.5l-1.37-1.5-1.68-1.96c-.21-.25-.26-.65-.05-.82.17-.22,1.34-1.22,2.77-2.52l.83-.72c.63-.53,1.75-1.51,2.38-2.04l1-.86c1.37-1.1,3.04-2.53,3.16-2.64l1.75-1.51c2.21-1.9,5.27-4.58,5.68-4.94.29-.26.63-.11.78.06.18.2.47.46.69.71l3.07,3.67c.32.37.64.83.96,1.2.25.29.39.54-.03.9l-1.29,1.11c-.34.28-.63.53-.96.82l-.88.75c-.29.25-1.79,1.54-2.09,1.79l-.75.64c-.67.57-2.21,1.82-2.87,2.39l-2.71,2.33c.54.62,1.18,1.37,1.93,2.25.47.47,1.62,1.8,2.8,3.1l1-.86,2.46-2.11,1.13-1.04,1.25-1.07c.42-.36,2.04-1.76,2.38-1.97l.87-.67c.57-.42.76-.21,1.11.21,0,0,.48.39,1.02,1.01.43.5,1.06,1.33,1.56,1.92l1.79,2.16c.43.5.26.72-.12,1.04l-4.05,3.47-4.88,4.19.46.55c.39.46.64.75,1,1.25,1,1.16,1.83,2.05,3.01,3.42l.47.54,4.05-3.47c.87-.75,1.67-1.5,2.55-2.26l1.09-1.01c1.5-1.29,2.47-2.11,3.97-3.4.34-.28.75-.13.86,0,.04.04.76.8,1.58,1.76.9.96,2.15,2.43,2.79,3.18Z"/>
<path class="cls-1" d="m179.64,105.1c.15.29.04.54-.4.77l-4.32,2.27c-.54.29-.9.54-1.29.75-.2.1-1.66.87-1.93.97-.2.1-.7-.25-.85-.42-1.25-.84-2.33-1.82-3.08-2.3-1.4-1-2.63-2.16-3.23-2.59l-3.96-3.13c.11,1.5.28,3.83.36,5.04.07.71.33,2.38.36,4.1-.08.91.13,2.36.16,3.83.05.22.07.84-.12.93-.22.18-1.58.9-1.77,1-.49.26-.9.42-1.44.7l-4.33,2.29c-.44.23-.71.19-.87-.1-.1-.19-.18-.46-.16-.78l-.07-4.94v-3.3s-.06-2.96-.06-2.96c-.04-1.6-.07-4.26-.18-7.99-.06-.47-.09-1.7-.05-2.22-1.3-.93-1.88-1.55-2.4-1.84-1.25-.84-2.97-1.97-4.65-3.02-1.95-1.21-3.8-2.72-6.25-4.29-.8-.57-1.68-1.29-2.58-1.82l-1.35-.9c-.07-.03-.27-.16-.35-.31-.13-.24-.14-.61.21-.8,1.02-.54,1.97-1.1,2.99-1.64l2.04-1.08c.39-.2,1.03-.42,1.44-.7.31-.23.75-.33.9-.41.34-.18.69.01,1.19.37l1.8,1.41c.28.17,1.77,1.12,2.68,1.89.43.33,2.3,1.77,2.78,2.08.45.38.97.67,1.5,1.07.4.28.76.6,1.08.86.01-.44-.05-.91-.06-1.4-.04-.66-.03-1.23-.09-1.82.01-.57-.06-2.96-.1-3.5-.12-1.18-.11-2.92-.1-3.25l-.1-2.31c-.01-.62.03-1.01.37-1.19.15-.08.53-.41.85-.51.41-.16.9-.54,1.29-.74l.58-.31,4.6-2.37c.34-.18.64.04.77.28.08.15.09.39.06.47v1.62c-.09,1.04.01,2.17.03,3.15-.08,2.91.12,5.29.02,7.58-.08,1.97,0,3.99-.02,5.49-.06.59.13,1.42.17,3.02.45.26,1.45.97,1.8,1.29,3.03,2.19,5.11,3.78,6.41,4.7l2.4,1.72,2.73,1.86,4.05,2.84c.27.16.45.38.55.58Z"/>
<path class="cls-1" d="m212.26,69.6c.2.74.33,1.45.44,2.28.03.1.1.77.09.94-.11.88.07,1.12-.43,3.48-.11,1.06-.62,2.33-1.79,4.36l-1.43,1.47c-1.08,1.26-2.43,1.97-3.48,2.54-.95.49-3.31,1.23-5.02,1.7l-3.38.97c-.11.03-.21.05-.37.1l.06.21c.05.22.6,2,1.52,5.41l.57,2.12c.14.53.37,1.15.52,1.74l.42,1.54c.05.22.09.55-.23.63l-.48.13-.62.22-3.91.94-2.22.66c-.37.1-.75-.03-.84-.35l-.64-2.17-.63-2.34c-.57-2.12-1.38-4.47-1.83-6.58-.1-.37-.14-.7-.22-1.02-.14-.53-.27-1.01-.46-1.47l-.72-2.66-1.87-6.5-.49-1.81c-.81-2.97-1.8-6.87-1.98-7.56-.47-1.53-1.11-4.09-1.39-5.15-.12-.42-.07-.66.4-.84l.27-.07c1.65-.45,5.42-1.47,7.32-2.03l.02.05,1.53-.46c2.16-.65,4.42-1.37,7.07-1.46,1.12-.07,2.44-.03,3.73.3l.75.26c3.5.94,4.38,2.06,5.06,2.68.73.6,2.01,2.14,2.58,3.01.47.67.89,1.59,1.22,2.41.35.65.66,1.59.86,2.34Zm-8.89,1.71c-.08-.32-.41-1.09-.45-1.25-.05-.22-.24-.68-1.08-1.48-1.01-.98-2.09-1.21-3.48-1.28-.85,0-1.96.13-3.34.5l-3.35.9c.15.76.3,1.35.4,1.72l.79,3.15c.55,2.02,1.25,4.4,1.58,5.62l.37-.1c.42-.11,2.23-.6,2.8-.81.57-.21,1.96-.53,2.59-.75.16-.05.57-.21.77-.32.7-.36,1.34-.93,1.74-1.55.54-.78.71-1.39.82-2.05.05-.64-.03-1.36-.17-2.29Z"/>
<path class="cls-1" d="m253.75,83.72l.21,4.51c.04.93.05,2.2.06,2.47.04.71-.18.89-1,.93-1.04.05-2.03.04-3.3.16,0,0-.98.1-4.23.25-.72.03-3.52.17-5.94.22l-1.04.1-3.3.16c-.99.05-2.04.04-2.2.05l-1.15.06c-.28.02-.34-.32-.36-.59-.1-2.09-.25-4.17-.35-6.27-.09-.71-.07-1.43-.16-2.14-.09-1.98-.07-2.53-.17-4.9-.13-1.65-.21-3.35-.29-5-.03-.77-.13-1.54-.16-2.31l-.09-1.81c-.09-1.87-.18-2.53-.25-4.12l-.09-1.87-.08-1.76c-.03-.77-.07-1.48-.1-2.25-.05-.99-.15-2.03-.18-2.52-.06-1.21-.17-2.37-.22-3.57-.02-.33.3-.68.57-.69l3.24-.21,2.31-.1h1.27s.83-.05.83-.05c.33-.02.45.26.46.53.01.28-.02.66,0,1.16.05.99.17,2.31.23,3.79l.21,3.29c.19,2.97.39,7.15.44,8.08,0,.22,0,1.32.16,5.83l.16,3.47c.03.6.16,2.2.24,4.01l.06,1.21c1.81-.09,3.74-.18,4.45-.2,1.76-.09,3.85-.13,4.45-.21,1.04-.1,4.02-.19,4.73-.23.22,0,.56.2.57.53Z"/>
<path class="cls-1" d="m279.52,95.08c-1.07-.26-1.4-.27-3.3-1.19-.67-.35-1.3-.52-1.83-1.01-.53-.44-1.38-.71-1.84-1.24-1.17-1.23-2.02-1.78-3.63-3.93-.72-.92-1.37-2.28-2.32-4.02-.13-.2-.93-3.09-1.01-3.55-.42-2.21-.56-3.87-.22-6.83.07-.66.11-1.2.28-2.07.32-1.68.71-3.18,2.13-5.93.45-.92,1.2-1.91,1.81-2.79,1.53-2.18,3.54-3.93,5.67-5.1,2.7-1.56,6.12-2.43,7.31-2.49,3.04-.1,4.51-.16,6.57.23.81.15,1.72.38,2.94.73,1.06.31,2.18.91,3.39,1.65,1.22.68,2.34,1.57,3.76,2.62.59.44.87,1,1.33,1.54,1.52,1.74,2.6,3.46,3.34,5.45.56,1.5.99,3.09,1.45,4.81.16.65.02,1.4.17,2.1.08.74.1,1.53.03,2.24-.12,1.49-.17,2.38-.3,3.08-.19.98-.49,1.99-.92,3.37-.18.69-.48,1.37-.79,2.09-.25.74-.73,1.49-1.26,2.51-.35.67-.88,1.41-1.35,1.82-.42.47-.9,1.23-1.38,1.64-.89.85-.47.42-2.88,2.21-1.3.93-2.53,1.54-3.56,1.96-1.75.68-3.12.81-3.77.97-.36.1-3.35.21-3.68.2-.79.02-1.88-.13-2.91-.33-1.46-.28-2.9-.66-3.23-.71Zm6.59-7.61c1.35-.03,1.62.03,3.59-.61.36-.16.94-.22,1.46-.62.59-.45,1.16-.79,1.57-1.17,1.01-.93,1.32-1.37,1.99-2.25.89-1.12,1.27-2.84,1.51-3.86l.29-1.24c.13-.71.18-1.54.15-2.27-.04-1.58-.12-2.93-.43-3.66-.32-.96-1-2.71-1.18-2.97-.83-1.28-1.79-2.08-2.81-2.94-1.41-1.16-2.04-1.39-3.09-1.76-1-.36-1.94-.42-2.76-.52-2.86-.26-4.39.4-5.59.84-1.08.7-1.59.99-2.36,1.52-.26.17-.42.43-.61.56-.35.38-.74.65-1.03.98-1.02,1.26-1.96,3-2.46,5.31-.45,2.1-.4,3.62-.13,5.13.29,1.46.4,2.03.91,2.92.66,1.25,1.74,2.68,1.74,2.68.28.56.95.9,1.38,1.27,1,.92,2.35,1.78,4.3,2.15.27.05,1.87.52,3.55.5Z"/>
<path class="cls-1" d="m340.67,116.58c-.12.25-.49.37-.79.22l-.74-.37c-.24-.13-.51-.2-.76-.32-.22-.17-2.8-1.41-2.8-1.41-1.5-.82-2.34-1.24-2.82-1.49-1.01-.57-.69-.84-.66-1.74,0-.37.1-.57.1-1.18.12-1.11.21-2.49.36-3.76.03-.79.08-1.5.13-2.09.05-.71.15-1.4.2-2.11,0-.37.21-2,.25-2.34.03-.05.03-.29.05-.59l-.84-.42c-.64-.32-2.43-1.16-3.31-1.62l-.79-.4c-.1.2-.22.45-.32.64-.1.2-.89,1.9-2.48,5.04l-.99,1.97c-.25.49-.5,1.1-.77,1.64l-.72,1.43c-.1.2-.3.47-.59.32l-.44-.22-.61-.25-3.54-1.91c-.69-.35-1.4-.64-2.09-.99-.35-.18-.54-.52-.4-.81.35-.69.62-1.36.97-2.04l1.09-2.16c.99-1.97,1.96-4.26,3.02-6.12.18-.35.37-.62.52-.91.25-.49.47-.94.65-1.4l1.23-2.45,2.95-6.1.84-1.67c1.38-2.75,3.24-6.31,3.56-6.95.67-1.45,1.9-3.78,2.4-4.76.2-.39.42-.59.86-.36l.25.12c.88.44,2.41,1.21,3.88,1.96l2.92,1.41,1.77.89c2.01,1.02,4.22,1.89,6.26,3.59.88.69,2.5,2.5,2.65,2.69,1.28,1.5,2.26,3.6,2.49,5.94.05.52.12,1.36.14,1.43.02.81-.08,1.63-.25,2.59-.15.79-.43,1.7-.67,2.56-.22.69-.64,1.52-.99,2.21-.35.69-.77,1.4-1.21,2.03-.05.1-.45.65-.57.77-.66.58-.76.78-2.69,2.16-.84.68-1.95,1.3-4.14,1.98l-1.82.31s-.07.02-.12,0c0,.12-.02.17,0,.25-.08.88-.26,3.32-.28,4.11.02,1.19,0,1.97-.04,3.13-.06,1.57-.16,2.63-.21,4.21,0,.25-.05,1.2,0,2.22.02.57-.03,1.03-.1,1.18Zm-5.43-25.79c.61.26,1.82.92,2.44,1.17.14.08.56.22.78.27.76.2,1.45.3,2.14.16.91-.22,1.6-.49,2.09-.85.47-.44.94-1.01,1.46-1.79.15-.29.4-1.03.47-1.18.12-.25.27-.66.08-1.87-.24-1.36-.7-2.15-1.73-3.03-.64-.57-1.55-1.21-2.83-1.85l-3.54-1.79c-.4.67-.64,1.16-.82,1.5l-1.51,2.88c-.82,1.62-1.76,3.49-2.33,4.74l.69.35c.39.2,2.04,1.08,2.6,1.31Z"/>
<path class="cls-1" d="m375.04,143.5c-.18.21-.59-.06-.72-.17-.38-.32-.89-.82-1.4-1.25l-2.82-2.28c-1.18-.99-1.91-1.67-1.91-1.67-.17-.14-.22-.33-.13-.53l1.24-2.69c.17-.37.93-1.88,1.66-3.28l-5.66-4.72-3.46-2.9-2.42,1.78c-.44.35-2.43,1.7-2.64,1.88-.4.31-.71.41-1,.17-.76-.64-1.32-1.17-2.46-2.12-.38-.32-.84-.63-1.21-.95-.98-.81-2.21-1.91-2.33-2.01-.34-.29-.36-.52-.22-.69.11-.13.43-.43.58-.52l1.04-.64c.23-.1.51-.44,2.69-1.85,3.5-2.3,6.31-4.12,8.61-5.58,1.69-1.16,3.09-2.08,4.28-2.81l5.06-3.23c1.14-.77,1.85-1.18,3.47-2.27,1.23-.69,2.75-2,5.76-3.72-.37.27,2.14-1.44,2.82-1.74.15-.09.34-.14.42-.07l2.01,1.54,1.11,1,1.14.95c.93.78.6.57,2.12,1.84.42.35.51.5.81.75.51.42.38.32.2.96-.13.32-.48.75-.51.86-.1.2-1.12,2.37-1.26,2.53-.14.25-.19.49-.33.74l-1.49,3.41c-.2.41-2.04,4.76-4.37,10.12-.78,1.79-1.67,3.63-2.48,5.54-1.62,3.74-3.28,7.45-4.66,10.31,0,0-.78,1.79-1.21,2.65-.06.16-.19.49-.33.65Zm-1.49-20.54l1.23,1.02c.51-1.22,1.11-2.02,1.65-3.35.09-.36.8-1.55.8-1.55.58-1.38,1.07-2.48,1.7-3.75.43-.85,1.31-2.85,2.19-4.77-1.03.72-4.21,2.8-5.16,3.52l-3.82,2.69-3.19,2.36c.88.74,1.98,1.66,2.7,2.18.8.59,1.36,1.21,1.91,1.67Z"/>
<path class="cls-1" d="m427.28,146.16l-1.17.92c-.6.48-1.64,1.29-2.29,1.8-.86.61-1.97,1.41-2.31,1.68-.22.17-.53.13-.76-.17-.44-.56-1.01-1.1-2.37-2.83-1.19-1.51-2.34-3.06-3.53-4.57l-1.77,1.39-5.06,3.98c-1.6,1.26-3.63,2.86-6.39,4.96-.82.65-1.82,1.51-2.91,2.36l-4.75,3.74-3.59,2.82c-.13.1-.47.3-.74-.04l-1.36-1.73c-1.36-1.73-3.05-3.97-3.22-4.18-.07-.08-.25-.5.14-.8l6.8-5.42,1.68-1.25,1.51-1.19c.74-.58,4.62-3.64,5.46-4.37l2.37-1.87c.56-.45,1.05-.89,1.57-1.31.22-.17,1.26-1.06,1.87-1.54l1.04-.82,1.99-1.56-.07-.09c-.27-.35-2.9-3.6-3.41-4.24l-2.47-3.23c-.26-.43.08-.7.17-.76.43-.35,1.37-1.01,2.37-1.8l2.94-2.31c.69-.54.95-.4,1.29.03.78.99,2,2.28,2.84,3.44.44.56.81,1.11,1.25,1.67.27.35.3.47.74,1.03,1.63,2.07,3.34,4.16,4.98,6.24l3.47,4.4c1.26,1.6,2.52,3.2,3.77,4.8.2.26.2.61-.06.81Z"/>
<path class="cls-1" d="m414.78,203.16c-.2.09-.52.19-.84.28-.32.1-.52-.17-.73-.62-.53-1.09-1.46-3.02-2.74-5.52l-.5-1.04c-1.05-2.18-1.94-3.89-2.95-5.97l-3.55-7.32c-.26-.55-.38-.91-.53-1.22-.1-.2-.14-.42.33-.71.39-.19,1.31-.57,1.96-.89l1.46-.77,3.71-1.8c2.75-1.39,4.83-2.4,8.1-3.99l2.4-1.1c.99-.48,1.88-1.03,2.92-1.54,4.11-1.99,7.37-3.45,10.02-4.67l1.81-.94,2.33-1.12c.3-.15.69-.09.81.16.17.22.84,1.61,1.73,3.31l.48.99c.36.75,1.01,2.08,1.37,2.82l.58,1.19c.72,1.61,1.68,3.59,1.75,3.74l1.01,2.08c1.27,2.63,3.09,6.27,3.33,6.76.17.35-.06.63-.25.73-.25.12-.57.34-.87.48l-4.33,2.03c-.44.22-.96.41-1.41.62-.35.17-.62.24-.86-.26l-.75-1.53c-.19-.4-.36-.74-.55-1.14l-.5-1.04c-.17-.35-1.03-2.13-1.2-2.48l-.43-.89c-.38-.79-1.2-2.6-1.58-3.39l-1.56-3.22c-.74.36-1.63.79-2.67,1.3-.57.34-2.15,1.11-3.72,1.93l.58,1.19,1.42,2.92.72,1.36.72,1.49c.24.49,1.17,2.42,1.29,2.8l.43,1.01c.26.67.01.79-.48,1.03,0,0-.5.36-1.24.73-.59.29-1.56.69-2.25,1.03l-2.55,1.17c-.6.29-.77.07-.98-.38l-2.33-4.8-2.81-5.79-.64.31c-.54.26-.89.43-1.46.64-1.39.67-2.45,1.25-4.08,2.04l-.65.32,2.33,4.8c.5,1.04,1.03,2.01,1.54,3.05l.7,1.31c.87,1.78,1.42,2.92,2.28,4.7.19.4-.06.77-.21.84-.05.02-.97.53-2.11,1.08-1.17.63-2.9,1.47-3.79,1.9Z"/>
<path class="cls-1" d="m420.32,229.58c-.27-1.74-.51-3.1-.28-4.84.06-.24.1-1.09.16-1.33.02-.17.35-.7.46-1,.49-1.35.78-2.32,1.75-3.32.99-1.12,1.86-2.05,2.78-2.75,1.16-.88,2.42-1.55,4-2.07,1.51-.55,3.38-1.03,5.85-1.57,2.15-.48,4.74-.99,7.97-1.7l4.14-.91c-.12-.03,2.14-.53,4.12-.97l3.5-.77c.43-.09.97-.21,1.14-.19l.48-.11c.48-.11.75.06.89.7l.41,1.88c.19.86.28,1.29.38,2,.11.77.42,1.65.57,2.36l.15.64c.13.59-.18.72-1.26.96-.43.09-.97.21-1.87.46-.42.15-1.58.24-3.57.68-.59.13-1.3.22-2.04.45-1.33.35-2.3.56-3.09.79-3.09.79-2.34.34-3.94.81-2.89.69-3.7.87-4.23,1-.65.14-.26.11-3.54.84-.7.15-1.45.32-2.38.69-1.35.52-2.29,1.35-3,2.02-.33.3-.59.92-.76,1.41-.23.73-.41,1.45-.36,2.22.05.72.24,1.58.4,2.06.29.78.74,1.3,1.07,1.79.36.6,1.02,1.01,2.01,1.42.85.26,1.64.26,3.12.1,2.2-.26,4.13-.68,4.83-.84,1.4-.25,2.35-.57,3.75-.88-.23,0,4.46-.99,9.3-2.05,1.61-.36,3.16-.75,4.66-1.09,1.07-.24,2.11-.41,3.02-.6.48-.11.68.02.9,1.27.08.38.29,1.57.62,3.07l.77,3.72c.02.11-.09.36-.41.43l-3.4.69-5.16,1.14-8.81,1.94c-1.72.38-3.94.81-6.2,1.31-3.01.67-5.63.79-6.79.65-.76-.11-.73,0-2.67-.36-.7-.13-1.63-.49-2.16-.88-.33-.21-.62-.26-1.01-.51-1.44-.92-2.29-1.69-3.02-2.43-.15-.14-.73-1.02-.9-1.27-.82-1.17-1.45-3-2-4.97-.18-.58-.24-1.36-.34-2.07Z"/>
<path class="cls-1" d="m425.27,289.07c-.27,0-.54-.29-.53-.62l.03-.82c0-.27-.04-.55-.03-.83.06-.27.1-3.13.1-3.13.11-1.7.14-2.63.15-3.18.09-1.16.47-.98,1.31-1.34.33-.15.56-.15,1.11-.4,1.06-.36,2.34-.87,3.56-1.27.72-.31,1.39-.56,1.95-.77.67-.26,1.33-.45,2-.71.33-.15,1.89-.66,2.23-.76.05,0,.28-.11.55-.2l.03-.94c.02-.71.03-2.7.06-3.68l.03-.88c-.22,0-.49-.01-.71-.02-.22,0-2.09,0-5.61-.12l-2.2-.07c-.55-.02-1.21.02-1.82,0l-1.6-.05c-.22,0-.54-.07-.54-.4l.02-.5-.04-.66.23-4.01c.03-.77,0-1.54.02-2.31.01-.38.24-.71.57-.7.77.02,1.48,0,2.25.02l2.42.07c2.2.07,4.68-.03,6.82.15.38.01.71.08,1.04.09.55.02,1.04.03,1.54,0l2.75.09,6.77.09,1.87.06c3.08.09,7.09.28,7.81.3,1.6,0,4.23.13,5.33.16.44.01.71.14.7.63v.28c-.04.99-.09,2.69-.14,4.34l-.04,3.24-.06,1.98c-.07,2.25.08,4.62-.6,7.19-.26,1.09-1.21,3.32-1.32,3.54-.82,1.79-2.31,3.56-4.33,4.76-.45.26-1.18.68-1.23.73-.73.36-1.5.62-2.45.86-.78.2-1.72.33-2.6.47-.72.09-1.65.06-2.43.04-.77-.02-1.59-.11-2.36-.24-.11,0-.77-.13-.93-.19-.82-.35-1.04-.36-3.09-1.53-.97-.47-2-1.21-3.54-2.91l-1.04-1.55c0-.06-.05-.06-.05-.11-.11.05-.16.05-.23.13-.83.3-3.12,1.17-3.84,1.47-1.06.52-1.79.83-2.85,1.29-1.45.62-2.45.97-3.9,1.59-.22.11-1.11.46-2.01.93-.51.26-.95.41-1.12.41Zm21.07-15.8c.03.66-.06,2.03-.03,2.7,0,.16.04.61.08.83.14.77.34,1.44.77,2,.58.74,1.12,1.24,1.66,1.54.6.24,1.31.42,2.24.57.33.01,1.1-.08,1.27-.07.27,0,.72-.03,1.73-.72,1.12-.79,1.64-1.54,2.01-2.86.25-.82.45-1.91.49-3.34l.12-3.96c-.77-.07-1.32-.09-1.71-.1l-3.24-.16c-1.82-.06-3.91-.12-5.28-.11l-.02.77c-.01.44-.13,2.31-.09,2.91Z"/>
</g>
</g>
<g>
<path class="cls-1" d="m124.08,179.31c42.26-58.92,121.95-80.76,189.49-48.16,67.62,32.65,100.07,108.81,80.05,178.62,3,.24,6.02,1.06,8.87,2.44,1.44.7,2.69,1.62,3.79,2.69,22.58-76.36-12.81-160.25-86.8-195.98-74.46-35.95-162.83-10.97-208.34,55.13,3.06.22,6.14,1.05,9.04,2.45,1.49.72,2.78,1.69,3.91,2.81Z"/>
<path class="cls-1" d="m376.33,354.94c-1.08-.52-2.04-1.17-2.93-1.9-41.53,61.69-123.09,85.17-192.02,51.89-68.27-32.96-100.66-110.25-79.43-180.61-1.61-.42-3.2-.99-4.73-1.73-3.03-1.46-5.3-3.87-6.83-6.73-25.88,77.75,9.37,164.74,85.08,201.29,76.14,36.76,166.8,9.77,211.32-59.71-3.52-.03-7.11-.88-10.47-2.5Z"/>
</g>
<path class="cls-1" d="m494.95,379.99l-24.04-11.61c46.59-103.65,14.9-223.92-71.15-292.2,12.19-26.5.93-58.1-25.45-70.84-26.38-12.74-58.12-1.9-71.3,24.12C196.03,4.54,82.14,54.51,29.94,155.46l-24.04-11.61-5.91,12.23,24.04,11.61c-46.59,103.65-14.9,223.92,71.15,292.2-12.19,26.5-.93,58.1,25.45,70.84,26.38,12.74,58.12,1.9,71.3-24.12,106.98,24.92,220.88-25.05,273.08-126l24.04,11.61,5.91-12.23ZM368.41,17.57c18.82,9.09,27.33,31.02,20.14,50.22-10.78-7.59-22.31-14.41-34.57-20.33-12.26-5.92-24.77-10.7-37.42-14.43,10.56-17.57,33.03-24.55,51.85-15.46Zm-241.86,500.93c-18.82-9.09-27.33-31.02-20.14-50.22,10.78,7.59,22.31,14.41,34.57,20.33,12.26,5.92,24.77,10.7,37.42,14.43-10.56,17.57-33.03,24.55-51.85,15.46Zm326.23-143.8c-57.43,110.67-192.87,156.25-305.89,101.68C33.87,421.81-14.68,287.41,36.28,173.61l5.91-12.23C99.61,50.7,235.05,5.13,348.07,59.7c113.02,54.57,161.56,188.98,110.61,302.77l-5.91,12.23Z"/>
<g>
<path class="cls-1" d="m161.74,326.38l-2.15,4.31-2.09,4.34c-.95,1.97-2.12,4.25-3.19,6.44l-2.74,5.67-6.64,13.75c-.11.23-1.08,2.4-1.65,3.41-.14.29-.36.46-.77.27l-7.75-3.74c-.7-.34-.65-.73-.28-1.34l1.62-3.22,5.72-11.84c.26-.53,1.85-3.67,3.1-6.43.95-1.96,1.76-3.77,1.87-4.01.39-.8,1.2-2.34,1.34-2.63.06-.12.89-1.85,1.9-4.07-1.88-.98-3.67-1.85-4.37-2.18-.46-.22-.47-.51-.19-1.08.23-.47.17-.5.64-1.47.34-.7.76-1.42,1.09-2.11l1.54-3.18c.11-.23.25-.38.33-.55.32-.5.54-.52,1.12-.25.75.36,1.99.89,4.19,1.95l.23.11,2.19,1.06,4.51,2.18,1.07.59c.84.48.96.54.68,1.11l-.31.64s-.36.89-1.03,2.27Z"/>
<path class="cls-1" d="m191.81,336.33c.4.34.84.63,1.19,1.08.3.43.76.65,1.05,1.08.65,1.16,1.16.84,2.3,4.39.24.68.51,1.59.81,2.75.06.16.18,2.43.15,2.78-.23,2.53-1.14,5.01-1.95,6.69-.5,1.03-2.12,4.38-4.47,6.46-.88.79-1.7,1.6-2.89,2.59-.97.82-2.07,1.93-3.36,2.81-.39.37-3.18,2.45-3.26,2.48-1.71,1.17-2.98,2.19-4.2,3.09-2.99,2.2-4.69,3.66-5.74,4.37-.22.17-.42.29-.62.41-.51.32-.83.38-1.52.05l-6.07-2.93c-.75-.36-1.47-.78-2.22-1.15s-1.08-.73-.56-1.2c.54-.53,1.76-1.43,3.24-2.42,1.59-1.08,3.24-2.14,3.75-2.6.77-.71,3.53-2.44,3.58-2.55.57-.44,1.08-.62,1.65-1.05q2.33-1.73,2.96-2.14c-1.22-.44-3.32-1.38-4.39-2.27-1.28-1.04-2.18-2.12-3.21-3.4-.82-1.11-1.46-2.28-1.77-3.42-.18-.8-.57-1.77-.72-4.41-.03-.52-.04-.95-.01-1.29-.02-1-.02-1.43.14-2.21.18-.98.32-1.7,1.18-3.49.31-.64.67-1.24,1.04-1.85,1.01-1.65,2.17-3.01,3.03-3.6.51-.32,1.42-1.02,2.79-1.78.51-.33,1.4-.69,2.37-.93.71-.16,2.66-.64,3.52-.65,1.55.04,2.78,0,3.68.21,1.98.47,4.53,1.7,5.68,2.25s1.8,1,2.87,1.88Zm-10.29,5.95c-.66-.11-1.43.02-1.78.13-1.14.44-1.59.8-2.08,1.2-1.11.96-1.7,2.04-1.93,3.42-.13.72.03,1.86.15,2.35.24.68.24.83.59,1.43,1.27,1.96,3.16,2.31,3.63,2.54.83.33,1.64.29,2.41.16.69-.23.97-.24,2.17-1.09.45-.36.96-.96,1.1-1.25s.43-.73.48-.85c.11-.23.36-.89.43-1.35.08-.61.18-1.71-.03-2.45-.24-.83-.71-1.63-.94-1.88-.67-.68-1.22-1.3-1.86-1.61-.52-.25-1.01-.56-2.34-.77Z"/>
<path class="cls-1" d="m199.06,391.59c-.32-.36-.84-.61-1.11-1.1-.68-1.11-1.16-.85-2.32-3.91-.33-.79-.69-1.83-1.14-3.26-.03-.22-.12-2.41-.09-2.75.15-1.78.35-3.68,1.1-5.24.59-1.21.81-1.67,1.17-2.28,1.27-1.89,2.75-2.88,4.05-3.95,1.31-1.24,2.15-1.67,4.31-2.28l-.39-.97c.03-.06-.34-1.81-.35-2.66-.04-.95.07-1.76.34-2.62.21-.89.82-2.88,1.27-3.52,1.49-2.35,2.96-3.92,4.38-4.95.63-.41,1.14-.73,1.68-.97,1.74-.8,2.95-.93,3.46-1.11.34-.12,3.78-.31,5.14,0,1.21.3,2.88.53,4.76,1.51.86.42,1.68.96,2.72,1.74,2.47,1.98,3.11,3,4.23,4.96.2.32.47.66.53.97.42,1.34.75,2.44.88,3.36.5,2.8-.03,3.76-.16,4.77-.1,1.09-.82,3.02-1.13,3.66-.81,1.67-2.19,3.07-2.73,3.6-.51.46-.79.89-1.9,1.57-.72.44-1,.45-2,1.03.45,1.43.73,2.63.89,3.64.26,2.69-.1,3.73-.11,4.21.01,1.01-.65,2.68-1.23,3.89-.59,1.23-.9,1.57-1.6,2.59-.42.58-.9,1.27-2.32,2.44l-1.65,1.35c-1.17.65-1.93,1.05-3.14,1.33-1.57.31-3.12.57-4.62.56-1.69-.03-3.19-.19-4.63-.59-2.53-.66-7.23-3.64-8.28-5Zm13.4-4.86c1.09-.33,1.49-.57,2.31-1.24.45-.34,1.26-1.88,1.52-2.41.31-.64.4-2.3.28-2.63-.22-.89-.69-1.98-1.27-2.69-.47-.51-.99-1.04-1.6-1.41-.69-.33-1.3-.55-1.99-.6-.97-.19-2.12-.03-2.95.35-1.09.48-1.51.91-2.22,1.79-.33.4-.89,1.55-.97,2.02-.41,1.73-.02,2.55.21,3.39.3.85,1.29,1.9,2.07,2.35.29.14,1.18.65,1.68.81,1.16.41,2.14.45,2.93.28Zm7.74-17.36c1.18-.37,2.2-.86,3.02-2.4.62-1.14.62-2.34.45-2.85-.31-1.87-1.48-3.14-2.9-3.75-.67-.25-1.3-.55-1.96-.52-.48-.03-.92.12-1.26.24-1.32.37-2.6,1.25-3.09,3.01-.27,1.01-.42.72-.29,1.92.08,1.18.19.95.71,2.06.39.82,2.04,1.98,2.41,2.08.84.33,1.87.41,2.9.2Z"/>
<path class="cls-1" d="m229.41,406.24c-.32-.23-.16-.71.24-1.23.9-1.28,2.75-2.88,3.06-3.23,1.16-1.22,1.8-1.97,2.91-3.08,1.37-1.34,2.41-2.47,3.12-3.2l4.75-4.83c.85-.88,1.67-1.55,2.47-2.44.99-1.17,2.38-2.57,2.86-3.12,1.56-1.74,2.46-2.87,2.77-3.22l3.56-3.83-5.43-2.62c-3.47-1.67-5.66-2.73-7.14-3.37l-1.33-.64c-1.01-.56-1.07-.87-.68-1.69l.89-1.99c1.37-2.83,1.51-2.84,2.35-4.72.53-1.24,1.1-.81,1.34-.7.61.22,2.19,1.06,5.78,2.79,1.1.53,2.43,1.03,3.7,1.64s2.49,1.35,3.79,1.9l1.56.75c3.64,1.76,6.85,3.23,7.92,3.82l2.25,1.24c.61.36.67.68.5,1.03-.47.97-1.94,2.54-2.62,3.36-.9,1.13-1.47,1.57-2.71,2.97-.79.91-1.47,1.57-2.71,2.97l-3.03,3.31c-1.5,1.63-3.06,3.38-4.78,5.18-2.26,2.47-4.63,5.02-6.95,7.47-2.32,2.45-2.18,2.44-3.25,3.63-.37.32-4.73,5.06-5.01,5.35-.45.5-1.01,1.22-1.59.8-.93-.6-1.73-.7-2.63-1.2-1.85-1.04-4.68-2.26-5.92-3.08Z"/>
</g>
<g>
<path class="cls-1" d="m245.93,151.8c-.3.62-.5.94-.87,1.42-.66.9-1.25,2.01-2.55,2.96-.4.26-.97.97-2.32,1.63-.83.41-1.11.72-2.19,1.1-.49.17-2.52.76-3.1.75-.29.04-1.23.04-1.56.06-.71.06-2.71-.45-3.33-.66-.51-.16-2.01-.88-2.9-1.27-.6-.25-2.53-1.18-3.19-1.5-.27-.18-.57-.32-.88-.51l-.25-.12-1.39-.67-.99-.48-.51-.25c-.4-.19-.33-.43-.1-.9.46-.95,1.07-2.32,2.13-4.51l1.25-2.59c.47-1.26,1.09-2.53,1.7-3.81l.7-1.45c.37-.77.78-1.52,1.15-2.28.92-1.9,1.73-3.67,2.4-5.06l.47-.98c.62-1.27,1.04-2.15,1.09-2.26l.9-1.86c.11-.22.23-.38.33-.6s.42-.3.71-.16c.51.25,1,.44,1.48.67l1.28.62.51.25c.11.05.69.34,1.15.6.23.07.42.16.64.26,1.39.67,3.08,1.53,3.38,1.67.46.27,1.66.85,2.75,1.96.66.68,1.4,1.48,1.97,2.44.24.43.52.7.76,1.13.15.34.5.92.62,1.33.45,1.48.57,1.99.83,3.6.16.88.02,2-.15,3.57-.05.48-.24.96-.29,1.44-.05.56-.2,1.07-.39,1.65-.35,1-.88,2.1-1.23,2.82Zm-5.17-4.3c.18-.36.24-.69.37-1.22.15-.78.41-1.78.34-2.76-.05-.83-.22-1.59-.43-2.27-.19-.64-.42-1.19-.73-1.66-.55-.81-1.32-1.54-1.98-1.95-.4-.28-.81-.48-1.21-.67l-.95-.46-1.13-.55c-.44.82-.83,1.62-1.23,2.46l-.74,1.54c-2.38,5.01-1.53,3.26-1.8,3.81l-1.94,4.01c-.3.63-.93,2.02-1.59,3.38l1.68.81,1.24.6c1.02.49,1.77.63,2.75.65.4.01,1.03-.09,1.47-.14,1.25-.26.7-.16,2.33-.9.47-.22.82-.68,1.06-.89.54-.46.88-.88,1.11-1.27.21-.35.69-1.06.83-1.35l.56-1.17Z"/>
<path class="cls-1" d="m264.34,174.63c-.07.15-.21.34-.36.55-.14.2-.38.13-.71-.03-.8-.39-2.22-1.07-4.1-1.94l-.77-.37c-1.61-.78-2.9-1.36-4.43-2.1l-5.4-2.61c-.4-.19-.64-.35-.86-.46-.15-.07-.27-.18-.13-.56.14-.29.5-.94.72-1.41l.49-1.11,1.32-2.73c.95-2.06,1.69-3.6,2.85-6.01l.88-1.73c.35-.73.61-1.46.98-2.22,1.46-3.03,2.68-5.37,3.65-7.28l.62-1.37.83-1.72c.11-.22.35-.37.54-.28.2.04,1.22.54,2.52,1.12l.73.35c.55.26,1.53.74,2.08,1l.88.42c1.15.6,2.61,1.3,2.72,1.36l1.53.74c1.93.93,4.65,2.2,5.02,2.38.25.12.26.4.19.54-.09.19-.18.46-.28.68l-1.57,3.16c-.16.33-.37.67-.53,1-.12.26-.25.42-.62.25l-1.13-.55-.84-.4-.77-.37-1.82-.88-.66-.32c-.58-.28-1.88-.96-2.46-1.24l-2.37-1.14-.95,1.97c-.18.46-.74,1.63-1.27,2.81l.88.42,2.15,1.04,1.04.46,1.1.53c.36.18,1.79.86,2.03,1.02l.71.39c.46.26.37.45.19.81,0,0-.12.43-.39.98-.21.44-.58,1.11-.83,1.63l-.93,1.84c-.21.44-.41.39-.74.23l-3.54-1.71-4.27-2.06-.23.47c-.2.41-.32.66-.55,1.04-.49,1.02-.84,1.84-1.43,3.04l-.23.48,3.54,1.71c.77.37,1.52.69,2.28,1.06l1,.44c1.31.63,2.15,1.04,3.46,1.67.29.14.31.47.26.57-.02.04-.32.74-.72,1.58-.38.89-1,2.18-1.32,2.83Z"/>
<path class="cls-1" d="m297.92,171.37c-.25.51-.51.97-.85,1.48-.03.07-.32.48-.41.57-.48.44-.5.66-1.92,1.73-.57.53-1.47.99-3.09,1.56l-1.5.13c-1.22.18-2.31-.08-3.16-.26-.76-.19-2.44-.91-3.61-1.47l-2.35-1.09-.25-.12-.07.14c-.07.15-.63,1.41-1.76,3.74l-.7,1.46c-.18.36-.35.82-.55,1.22l-.51,1.06c-.07.14-.21.35-.43.24l-.33-.16-.46-.18-2.63-1.36-1.55-.71c-.26-.12-.4-.37-.3-.59l.69-1.51.78-1.61c.7-1.46,1.38-3.15,2.14-4.54.12-.26.27-.46.38-.68.18-.36.33-.69.45-1.04l.88-1.82,2.1-4.53.6-1.24c.99-2.04,2.31-4.69,2.54-5.17.47-1.07,1.35-2.8,1.71-3.54.14-.29.28-.4.63-.28l.18.09c1.13.55,3.72,1.8,5.06,2.39l-.02.04,1.08.47c1.51.69,3.12,1.37,4.64,2.6.66.5,1.37,1.16,1.93,1.97l.3.5c1.5,2.21,1.44,3.26,1.52,3.93.12.69.08,2.16-.02,2.92-.06.6-.27,1.31-.48,1.93-.12.53-.4,1.2-.65,1.72Zm-5.77-3.33c.1-.21.29-.8.35-.91.07-.14.19-.49.11-1.34-.09-1.03-.59-1.67-1.32-2.39-.48-.41-1.15-.87-2.1-1.33l-2.3-1.11c-.28.49-.48.89-.6,1.15l-1.07,2.13c-.67,1.39-1.43,3.04-1.83,3.88l.26.12c.29.14,1.53.74,1.95.9.42.16,1.35.65,1.8.83.11.05.42.16.58.19.56.13,1.19.13,1.72-.03.67-.17,1.06-.43,1.44-.74.34-.33.64-.76,1.01-1.35Z"/>
<path class="cls-1" d="m303.57,195.2c-1.13-.64-2.03-1.12-2.93-2.05-.11-.14-.59-.56-.7-.7-.09-.09-.24-.52-.37-.72-.56-.89-.98-1.51-1.12-2.52-.2-1.09-.34-2.01-.33-2.86.02-1.07.2-2.1.62-3.25.36-1.12.95-2.42,1.75-4.1.7-1.46,1.59-3.19,2.64-5.39l1.36-2.81c-.07.06.67-1.47,1.32-2.82l1.14-2.37c.14-.29.32-.66.41-.75l.16-.33c.16-.33.38-.41.81-.2l1.28.62c.58.28.88.42,1.33.69.5.28,1.15.5,1.63.73l.44.21c.4.19.33.43-.02,1.17-.14.29-.32.65-.58,1.29-.1.31-.58,1.03-1.23,2.37-.2.41-.46.86-.67,1.39-.4.93-.72,1.58-.95,2.15-.95,2.15-.87,1.52-1.32,2.65-.92,1.99-1.18,2.54-1.36,2.9-.21.44-.05.2-1.12,2.43-.23.48-.48.99-.68,1.7-.31,1.02-.27,1.94-.2,2.65.02.33.26.76.47,1.08.31.47.65.9,1.12,1.22.44.3,1.03.58,1.37.71.58.19,1.09.17,1.52.2.51.06,1.05-.13,1.73-.52.54-.37.9-.83,1.48-1.76.85-1.39,1.49-2.71,1.71-3.18.49-.93.74-1.63,1.2-2.57-.11.13,1.46-3.03,3.05-6.31.53-1.09,1-2.17,1.49-3.19.35-.73.73-1.4,1.03-2.02.16-.33.32-.39,1.14.05.26.12,1.04.55,2.06,1.04l2.5,1.26c.07.03.17.21.06.43l-1.14,2.28-1.69,3.5-2.89,5.99c-.56,1.17-1.32,2.64-2.06,4.17-.99,2.04-2.11,3.62-2.71,4.23-.41.38-.34.42-1.43,1.37-.39.35-1.02.73-1.49.86-.27.1-.43.24-.76.36-1.19.42-2.02.55-2.78.63-.15.03-.93-.04-1.15-.05-1.05-.06-2.4-.53-3.78-1.11-.42-.16-.89-.48-1.35-.74Z"/>
<path class="cls-1" d="m323.06,204.06c-.27-.18-.42-.25-.11-.9.34-.79,1.02-2.21,1.76-3.74,1.29-2.66,2.54-5.34,2.68-5.63l2.71-5.8c.12-.26.75-1.66,1.07-2.32.11-.22.44-.82,1.04-2.15.28-.58.55-1.23.86-1.88l1.81-3.76c.16-.33.28-.58.68-.39.26.12.38.24.58.28l.11.05c.19.09.27.18.46.27.55.17,1.02.4,1.53.64.73.35,1.3.67,2.1,1.06l.22.11c.22.11.34.22.12.69l-.14.29c-.21.62-.6,1.24-.88,1.82l-.37.77c-.28.58-.62,1.19-.67,1.3-.4.93-.67,1.47-1.49,3.19-.55,1.13-1.68,3.38-3.72,7.61l-.83,1.72c-.65,1.35-1.39,3.07-2.16,4.67l-2.06,4.27c-.07.14-.2.31-.45.19l-.4-.19-2.5-1.16c-.77-.37-1.53-.74-1.95-.99Z"/>
<path class="cls-1" d="m343.59,214.34c-1.48-.85-2.34-1.49-3.26-2.57-.52-.61-1.22-1.57-1.46-2.1-.3-.59-1.19-2.46-1.52-3.57-.11-.32-.15-.52-.08-.66.05-.11.22-.26.39-.35.34-.15.43-.33.78-.39.25-.05.42-.12.59-.21.81-.37,2.15-.72,2.85-.97.39-.17.58-.08.92-.14.05-.02.13.02.16.03.18.09.24.25.28.36.43,1.16.84,2.16,1.62,3.35.65.99,1.56,1.79,2.69,2.34.51.25,1.07.39,1.66.48.12.02.4.02.58,0,.61.03,1.4-.49,1.64-.78.19-.22.55-.86.6-1.24.05-.38-.12-.87-.36-1.4-.15-.34-.37-.72-.59-1.01-.28-.35-.65-.72-.96-1.09-.9-1.02-.9-1.11-1.88-2.07-.29-.33-.66-.78-.99-1.11-.24-.25-.59-.56-.81-.85-.63-.75-.88-1.05-1.24-1.72-.09-.18-.17-.21-.22-.37-.17-.31-.33-.62-.46-1-.19-.44-.52-1.64-.58-1.98-.19-.9-.06-1.83.23-2.91.14-.47.26-.91.46-1.31.46-.95.95-1.61,1.22-1.89.36-.36.78-1.06,2.22-1.81,1.15-.61,2.43-.94,4.5-1.02.96-.03,2.52.37,3.14.58.66.22,1.2.4,1.79.68.84.41,1.84,1.03,2.23,1.35,1.12.94,1.7,1.31,2.93,3.35.2.33.65,1.17,1.26,2.81.17.4.32,1.01.18,1.31-.05.11-.29.31-.45.37-.4.07-.61.33-1.29.54-.96.3-1.46.69-2.59,1.08-.11.04-.68.12-.79.06-.18-.09-.31-.19-.5-.65-.11-.32-.56-1.44-1.43-2.62-.45-.66-.96-1.27-1.89-1.77l-.73-.35c-.8-.3-1.22-.63-2.23-.5-1.03.18-1.6.81-1.71,1.48-.03.25-.02.8.11,1.08.27.54.54,1.12.85,1.5.63.75,1.93,1.96,3.29,3.52.55.63,1.14,1.27,1.66,1.97.72.94,1.04,1.58,1.32,2.21.28.63.59,1.28.87,2.68.14.65,0,1.49.01,2.48-.01.21-.17.73-.22.92-.09.37-.21.71-.41,1.11-.16.33-.48.89-.67,1.2-.59.94-1.68,1.71-2.01,2.01-1.07.92-2.28,1.46-2.95,1.54-1.67.19-1.93.28-3.41.07-1.05-.15-2.05-.41-2.42-.59-.29-.14-.64-.26-.96-.42-.62-.3-1.26-.65-1.96-1.08Z"/>
</g>
<path class="cls-1" d="m51.66,173.49l224.51,35.13,167.13,153.96-224.51-35.13L51.66,173.49m-35.22-17.01l27.53,25.36,167.13,153.96,2.53,2.33,3.4.53,224.51,35.13,36.98,5.79-27.53-25.36-167.13-153.96-2.53-2.33-3.4-.53-224.51-35.13-36.98-5.79h0Z"/>
<path class="cls-1" d="m258.52,245.16c12.64,6.1,17.93,21.29,11.83,33.93-6.1,12.64-21.29,17.93-33.93,11.83-12.64-6.1-17.93-21.29-11.83-33.93,6.1-12.64,21.29-17.93,33.93-11.83m5.91-12.23c-19.36-9.35-42.72-1.2-52.07,18.16-9.35,19.36-1.2,42.72,18.16,52.07,19.36,9.35,42.72,1.2,52.07-18.16,9.35-19.36,1.2-42.72-18.16-52.07h0Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Calque_2" data-name="Calque 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36.98 33.38">
<defs>
<style>
.cls-1 {
stroke-width: 0px;
}
</style>
</defs>
<g id="header_menu" data-name="header menu">
<g>
<path class="cls-1" d="m.1,1.36C.09-.09,2.17,0,2.64,0l3.29.08c2.19.06,4.39.11,6.58.17,4.39.11,18.3.23,22.69.34.14,0,1.71-.16,1.71.04,0,1.21.01,2.41.02,3.62C27.8,4.26,9.13,4.01,0,3.52c0-.88.11-1.58.1-2.16Z"/>
<path class="cls-1" d="m36.83,16.04c-.89,1.8-2.07,1.37-2.54,1.36l-3.29-.08c-2.19-.06-4.39-.11-6.58-.17-4.39-.11-18.3-.23-22.69-.34-.14,0-1.71.16-1.71-.04,0-1.21-.01-2.41-.02-3.62,9.13,0,27.8.24,36.93.73,0,.88.15,1.64-.1,2.16Z"/>
<path class="cls-1" d="m.1,31.97c0,1.8,2.07,1.37,2.54,1.36l3.29-.08c2.19-.06,4.39-.11,6.58-.17,4.39-.11,18.3-.23,22.69-.34.14,0,1.71.16,1.71-.04,0-1.21.01-2.41.02-3.62C27.8,29.07,9.13,29.32,0,29.81c0,.88.11,1.58.1,2.16Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 990 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

View file

@ -39,17 +39,18 @@ return [
],
'messages' => [
'has_been_created' => ':model has been created',
'cannot_be_created' => ':model cannot be created',
'has_been_updated' => ':model has been updated',
'cannot_be_updated' => ':model cannot be updated',
'has_been_deleted' => ':model has been deleted',
'cannot_be_deleted' => ':model cannot be deleted',
'order_changed' => 'The order has been changed!',
'order_not_changed' => 'The order hasn\'t been changed!',
'publish_status_saved' => 'Change of publication status successful!',
'right' => 'You don\'t have the rights to access this part !',
'theme_updated' => 'The theme has been updated !',
'has_been_created' => ':model has been created',
'cannot_be_created' => ':model cannot be created',
'has_been_updated' => ':model has been updated',
'cannot_be_updated' => ':model cannot be updated',
'has_been_deleted' => ':model has been deleted',
'cannot_be_deleted' => ':model cannot be deleted',
'cannot_be_deleted_relation' => ':model cannot be deleted because some :relations are attached to it',
'order_changed' => 'The order has been changed!',
'order_not_changed' => 'The order hasn\'t been changed!',
'publish_status_saved' => 'Change of publication status successful!',
'right' => 'You don\'t have the rights to access this part !',
'theme_updated' => 'The theme has been updated !',
],
'minicrud' => [

View file

@ -2,9 +2,10 @@
return [
'classes' => [
'user' => 'user',
'user' => 'user',
'activity_log' => 'activity log|activity logs',
'static_page' => 'static page|static pages',
'commitment' => 'commitment'
'static_page' => 'static page|static pages',
'commitment' => 'commitment',
'range' => 'range'
]
];

View file

@ -220,52 +220,24 @@ return [
'female' => 'of the ',
'vowel' => 'of the '
],
'event' => 'event',
'model' => 'target element',
'order' => 'order',
'publication' => 'publication',
'activated' => 'activated',
'target' => 'target',
'information' => 'information',
'picture_thumbnail' => 'thumbnail',
'picture' => 'picture',
'seo' => 'SEO',
'seo_title' => 'SEO title',
'seo_description' => 'SEO description',
'attribute_alt' => 'alt attribute',
'attribute_title' => 'title attribute',
'pdf' => 'PDF file',
'publish_at' => 'publication date',
'unpublish_at' => 'end of publication date',
'field' => 'field',
'color' => 'color',
'pictogramme' => 'pictogram',
'logo_1' => 'first logo',
'logo_2' => 'second logo',
'logo_3' => 'third logo',
'mainline' => 'mainline',
'subline' => 'subline',
'description' => 'description',
'label' => 'label',
'skin' => 'skin',
'plumage' => 'feathers',
'legs' => 'paws',
'bald_neck' => 'bald neck',
'crossbreeding' => 'crossbreeding',
'growth_potential' => 'growth potential',
'pdf_title' => 'PDF title',
'details' => 'details',
'bald_neck_label' => 'does it have bald neck ?',
'activity' => 'activity',
'company' => 'company',
'publication_state' => 'state of publication',
'author' => 'author',
'column' => 'column',
'type' => 'type',
'global_infos' => 'Main informations',
'modifications' => 'Changes made',
'hatchery' => 'hatchery',
'header' => 'header',
'event' => 'event',
'model' => 'target element',
'order' => 'order',
'publication' => 'publication',
'activated' => 'activated',
'target' => 'target',
'static_page_type' => 'static page type',
'seo' => 'SEO',
'seo_title' => 'SEO title',
'seo_description' => 'SEO description',
'description' => 'description',
'subtitle' => 'subtitle',
'tagline' => 'tagline',
'attribute_alt' => 'alt attribute',
'attribute_title' => 'title attribute',
'picture_productsheet' => 'productsheet picture',
'picture_thumbnail' => 'thumbnail',
'background' => 'background',
],
];

View file

@ -40,22 +40,24 @@ return [
],
'messages' => [
'has_been_created' => ':model a été créé',
'cannot_be_created' => ':model ne peut être créé',
'has_been_updated' => ':model a été mis à jour',
'cannot_be_updated' => ':model ne peut être mis à jour',
'has_been_deleted' => ':model a été supprimé',
'cannot_be_deleted' => ':model ne peut être supprimé',
'order_changed' => 'L\'ordre a été changé !',
'order_not_changed' => 'L\'ordre n\'a pas été changé !',
'publish_status_saved' => 'Changement de l\'état de publication réussit !',
'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !',
'theme_updated' => 'Le thème a été mis à jour !',
'has_been_created' => ':model a été créé',
'cannot_be_created' => ':model ne peut être créé',
'has_been_updated' => ':model a été mis à jour',
'cannot_be_updated' => ':model ne peut être mis à jour',
'has_been_deleted' => ':model a été supprimé',
'cannot_be_deleted' => ':model ne peut être supprimé',
'cannot_be_deleted_relation' => ':model ne peut être supprimé car des :relations lui sont attaché(e)s',
'order_changed' => 'L\'ordre a été changé !',
'order_not_changed' => 'L\'ordre n\'a pas été changé !',
'publish_status_saved' => 'Changement de l\'état de publication réussi !',
'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !',
'theme_updated' => 'Le thème a été mis à jour !',
],
'minicrud' => [
'visibility_label' => 'Visibilité',
'visibility_helper' => 'Vérifier qu\'il est visible.',
'visibility_helper' => 'Cocher pour rendre visible.',
'enum_select' => 'Sélectionnez :enum dans la liste.',
'associated_enum' => 'Associé :enum',
'dimensions_must_be' => 'Doit être :widthpx (largeur) par :heightpx (hauteur).',

View file

@ -2,9 +2,11 @@
return [
'classes' => [
'user' => 'utilisateur',
'activity_log' => 'journal d\'activité|journaux d\'activité',
'static_page' => 'page statique|pages statiques',
'commitment' => 'engagement'
'user' => 'utilisateur',
'activity_log' => 'journal d\'activité|journaux d\'activité',
'static_page' => 'page statique|pages statiques',
'commitment' => 'engagement',
'range' => 'gamme',
'seasonal_section' => 'section saisonnière|sections saisonnières',
]
];

View file

@ -222,53 +222,23 @@ return [
'female' => 'de la ',
'vowel' => 'de l\''
],
'event' => 'évènement',
'model' => 'élément ciblé',
'order' => 'ordre',
'publication' => 'publication',
'activated' => 'activé',
'target' => 'cible',
'picture_thumbnail' => 'vignette',
'picture' => 'image',
'seo' => 'référencement',
'seo_title' => 'titre SEO',
'seo_description' => 'description SEO',
'attribute_alt' => 'attribut alt',
'attribute_title' => 'attribut title',
'pdf' => 'fichier PDF',
'publish_at' => 'date de publication',
'unpublish_at' => 'date de fin de publication',
'field' => 'champ',
'information' => 'information',
'color' => 'couleur',
'pictogramme' => 'pictogramme',
'logo_1' => 'premier logo',
'logo_2' => 'deuxième logo',
'logo_3' => 'troisième logo',
'mainline' => 'ligne principale',
'subline' => 'ligne secondaire',
'description' => 'description',
'label' => 'label',
'skin' => 'peau',
'plumage' => 'plumage',
'legs' => 'pattes',
'bald_neck' => 'cou nu',
'mainline' => 'ligne principale',
'subline' => 'ligne secondaire',
'crossbreeding' => 'croisement',
'growth_potential' => 'croissance',
'pdf_title' => 'titre du PDF',
'details' => 'détails',
'bald_neck_label' => 'a-t-il le cou nu ?',
'activity' => 'activité',
'company' => 'entreprise',
'publication_state' => 'état de publication',
'author' => 'auteur',
'column' => 'colonne',
'type' => 'type',
'global_infos' => 'Informations principales',
'modifications' => 'Modifications apportées',
'hatchery' => 'couvoirs',
'header' => 'header',
]
'event' => 'évènement',
'model' => 'élément ciblé',
'order' => 'ordre',
'publication' => 'publication',
'activated' => 'activé',
'target' => 'cible',
'static_page_type' => 'type de page',
'seo' => 'référencement SEO',
'seo_title' => 'titre SEO',
'seo_description' => 'description SEO',
'description' => 'description',
'subtitle' => 'sous-titre',
'tagline' => 'phrase d\'accroche',
'attribute_alt' => 'attribut alt',
'attribute_title' => 'attribut title',
'picture_productsheet' => 'image de la fiche produit',
'picture_thumbnail' => 'vignette',
'background' => 'fond',
],
];

View file

@ -1,4 +1,4 @@
.nav-link.active {
color: $primary;
font-weight: bold;
color: $primary;
font-weight: bold;
}

View file

@ -1,66 +1,66 @@
// * LAYOUT
main {
min-height: calc(100vh - #{$bo-header-height} - #{$bo-footer-height});
min-height: calc(100vh - #{$bo-header-height} - #{$bo-footer-height});
}
.container-fluid {
margin-top: $bo-header-height;
margin-top: $bo-header-height;
}
#footer {
box-shadow: 0 -0.125rem 0.25rem rgb(0 0 0 / 7.5%) !important;
box-shadow: 0 -0.125rem 0.25rem rgb(0 0 0 / 7.5%) !important;
}
// * OTHERS
.table {
&-fix-action {
th:last-child,
td:last-child {
position: sticky;
right: 0;
width: 0;
background-color: rgb(var(--bs-secondary-bg-rgb));
color: rgb(var(--bs-body-color));
white-space: nowrap;
}
&-fix-action {
th:last-child,
td:last-child {
position: sticky;
right: 0;
width: 0;
background-color: rgb(var(--bs-secondary-bg-rgb));
color: rgb(var(--bs-body-color));
white-space: nowrap;
}
}
.text-ellipsis {
overflow: hidden;
width: 20rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.text-ellipsis {
overflow: hidden;
width: 20rem;
text-overflow: ellipsis;
white-space: nowrap;
}
&-col-sorter {
height: 3rem;
}
&-col-sorter {
height: 3rem;
}
}
.w-fit {
width: fit-content;
width: fit-content;
}
.btn-md {
height: 38px;
height: 38px;
}
.btn-sm {
height: 31px;
height: 31px;
}
.pagination-custom .dropdown-menu {
overflow: auto;
min-width: 5rem;
max-height: 178px;
overflow: auto;
min-width: 5rem;
max-height: 178px;
}
.need-word-counter-password {
border-radius: 0 0 0 0.375rem !important;
border-radius: 0 0 0 0.375rem !important;
&-btn {
border-radius: 0 0 0.375rem !important;
}
&-btn {
border-radius: 0 0 0.375rem !important;
}
}

View file

@ -1,12 +1,12 @@
@charset "UTF-8";
// * UTILITIES
@import "./utilities/variables";
@import './utilities/variables';
// * VENDOR
@import "./vendor/bootstrap";
@import './vendor/bootstrap';
// * BASE
@import "./base/bootstrap-overload";
@import "./base/fonts";
@import "./base/common";
@import './base/bootstrap-overload';
@import './base/fonts';
@import './base/common';

View file

@ -1,36 +1,36 @@
@use "sass:list";
@import "mixins";
@use 'sass:list';
@import 'mixins';
// SET SOME CLASSES WITH BOOTSTRAP BREAKPOINTS
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
@include generate-bs-borders($infix, $prefix);
@include generate-bs-borders($infix, $prefix);
.w#{$infix}-25 {
width: 25% !important;
}
.w#{$infix}-50 {
width: 50% !important;
}
.w#{$infix}-75 {
width: 75% !important;
}
.w#{$infix}-100 {
width: 100% !important;
}
@each $prop, $unit in (width: vw, height: vh) {
@each $size in [25, 50, 75, 100] {
.#{$unit}#{$infix}-#{$size} {
#{$prop}: #{$size}#{$unit} !important;
}
}
}
@each $color, $value in $theme-colors {
@include generate-bs-borders($infix, $prefix, $color);
}
.w#{$infix}-25 {
width: 25% !important;
}
.w#{$infix}-50 {
width: 50% !important;
}
.w#{$infix}-75 {
width: 75% !important;
}
.w#{$infix}-100 {
width: 100% !important;
}
@each $prop, $unit in (width: vw, height: vh) {
@each $size in [25, 50, 75, 100] {
.#{$unit}#{$infix}-#{$size} {
#{$prop}: #{$size}#{$unit} !important;
}
}
}
@each $color, $value in $theme-colors {
@include generate-bs-borders($infix, $prefix, $color);
}
}
}

View file

@ -8,14 +8,14 @@ $danger: $color-danger;
$light: $color-light;
$dark: $color-dark;
$theme-colors: (
primary: $primary,
secondary: $secondary,
success: $success,
info: $info,
warning: $warning,
danger: $danger,
light: $light,
dark: $dark,
primary: $primary,
secondary: $secondary,
success: $success,
info: $info,
warning: $warning,
danger: $danger,
light: $light,
dark: $dark,
);
// Override bootstrap vars

View file

@ -1,54 +1,54 @@
@mixin generate-bs-borders($infix, $prefix, $color:null) {
$color-var: var(--#{$prefix}border-color);
$color-var: var(--#{$prefix}border-color);
@if $color {
$color-var: rgba(var(--#{$prefix}#{$color}-rgb));
$color: "-#{$color}";
}
@if $color {
$color-var: rgba(var(--#{$prefix}#{$color}-rgb));
$color: '-#{$color}';
}
.border#{$infix}#{$color}-top {
border-top: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-end {
border-right: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-bottom {
border-bottom: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-start {
border-left: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-top {
border-top: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-end {
border-right: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-bottom {
border-bottom: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-start {
border-left: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-0 { border: 0 !important; }
.border#{$infix}#{$color}-top-0 { border-top: 0 !important; }
.border#{$infix}#{$color}-end-0 { border-right: 0 !important; }
.border#{$infix}#{$color}-bottom-0 { border-bottom: 0 !important; }
.border#{$infix}#{$color}-start-0 { border-left: 0 !important; }
.border#{$infix}#{$color}-0 { border: 0 !important; }
.border#{$infix}#{$color}-top-0 { border-top: 0 !important; }
.border#{$infix}#{$color}-end-0 { border-right: 0 !important; }
.border#{$infix}#{$color}-bottom-0 { border-bottom: 0 !important; }
.border#{$infix}#{$color}-start-0 { border-left: 0 !important; }
@each $idx, $b-width in $border-widths {
$pidx: list.index(($border-widths), ($idx $b-width));
@each $idx, $b-width in $border-widths {
$pidx: list.index(($border-widths), ($idx $b-width));
.border#{$infix}#{$color}-top-#{$idx} {
border-top: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-end-#{$idx} {
border-right: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-bottom-#{$idx} {
border-bottom: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-start-#{$idx} {
border-left: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-top-#{$idx} {
border-top: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-x {
border-right: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
border-left: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
.border#{$infix}#{$color}-end-#{$idx} {
border-right: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-y {
border-top: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
border-bottom: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
.border#{$infix}#{$color}-bottom-#{$idx} {
border-bottom: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-start-#{$idx} {
border-left: $b-width var(--#{$prefix}border-style) #{$color-var} !important;
}
}
.border#{$infix}#{$color}-x {
border-right: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
border-left: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
.border#{$infix}#{$color}-y {
border-top: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
border-bottom: $border-width var(--#{$prefix}border-style) #{$color-var} !important;
}
}

View file

@ -10,9 +10,9 @@ $color-primary: #0d6efd;
$color-secondary: #6c757d;
// * FONTS
$font-default-family-base: system-ui, -apple-system, "Segoe UI", "Roboto",
"Helvetica Neue", "Arial", "Noto Sans", "Liberation Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; // - The default site font family.
$font-default-family-base: system-ui, -apple-system, 'Segoe UI', 'Roboto',
'Helvetica Neue', 'Arial', 'Noto Sans', 'Liberation Sans', sans-serif,
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; // - The default site font family.
$font-default-size-base: 1rem; // Assumes the browser default, typically `16px`
$line-default-height-base: 1.5;

View file

@ -1,4 +1,4 @@
.nav-link.active {
color: $primary;
font-weight: bold;
color: $primary;
font-weight: bold;
}

View file

@ -1 +1,78 @@
// Empty.
@font-face {
font-display: swap;
font-family: Basecoat;
font-style: normal;
font-weight: bold;
src: url('@/fonts/Basecoat-Bold.woff2') format('woff2'),
url('@/fonts/Basecoat-Bold.woff') format('woff');
}
@font-face {
font-display: swap;
font-family: Basecoat;
font-style: normal;
font-weight: normal;
src: url('@/fonts/Basecoat-Regular.woff2') format('woff2'),
url('@/fonts/Basecoat-Regular.woff') format('woff');
}
@font-face {
font-display: swap;
font-family: 'Readex Pro';
font-style: normal;
font-weight: normal;
src: url('@/fonts/ReadexPro-Regular.woff2') format('woff2'),
url('@/fonts/ReadexPro-Regular.woff') format('woff');
}
@font-face {
font-display: swap;
font-family: 'Readex Pro';
font-style: normal;
font-weight: bold;
src: url('@/fonts/ReadexPro-Bold.woff2') format('woff2'),
url('@/fonts/ReadexPro-Bold.woff') format('woff');
}
@font-face {
font-display: swap;
font-family: Rufina;
font-style: normal;
font-weight: bold;
src: url('@/fonts/Rufina-Bold.woff2') format('woff2'),
url('@/fonts/Rufina-Bold.woff') format('woff');
}
@font-face {
font-display: swap;
font-family: Rufina;
font-style: normal;
font-weight: normal;
src: url('@/fonts/Rufina-Regular.woff2') format('woff2'),
url('@/fonts/Rufina-Regular.woff') format('woff');
}
@font-face {
font-display: swap;
font-family: Sheldon;
font-style: normal;
font-weight: 500;
src: url('@/fonts/Sheldon.woff2') format('woff2'),
url('@/fonts/Sheldon.woff') format('woff');
}
.f-rufina {
font-family: Rufina, serif !important;
}
.f-readex-pro {
font-family: 'Readex Pro', sans-serif !important;
}
.f-sheldon {
font-family: Sheldon, sans-serif !important;
}
.f-basecoat {
font-family: Basecoat, sans-serif !important;
}

View file

@ -0,0 +1,44 @@
.main-menu {
.center-main-menu-text {
font-family: 'Readex Pro', Arial, Helvetica, sans-serif;
font-weight: bold;
}
.offcanvas-main-menu {
height: inherit !important;
}
#offcanvas-nav-menu {
background-color: $bg-white;
background-image: url('@/images/layout/links-menu-bg-mobile.svg');
background-position: center;
background-repeat: no-repeat;
background-size: 100% 100%;
@include media-breakpoint-up(md) {
background-image: url('@/images/layout/links-menu-bg.svg');
}
hr {
position: relative;
width: 90vw;
border-top-width: 0.2rem;
margin: 0 auto;
opacity: 1;
}
.offcanvas-body {
background-image: url('@/images/layout/bg-compass.svg');
background-position-x: 43vw;
background-position-y: 96%;
background-size: 64vw;
@include media-breakpoint-up(md) {
background-image: url('@/images/layout/links-menu-bg.svg');
background-position-x: 85%;
background-position-y: center;
background-size: 47rem;
}
}
}
}

View file

@ -1,13 +1,14 @@
@charset "UTF-8";
// * UTILITIES
@import "./utilities/variables";
@import './utilities/variables';
// * VENDOR
@import "./vendor/ckEditorContent";
@import "./vendor/bootstrap";
@import './vendor/ckEditorContent';
@import './vendor/bootstrap';
// * BASE
@import "./base/bootstrap-overload";
@import "./base/fonts";
@import "./base/common";
@import './base/bootstrap-overload';
@import './base/fonts';
@import './base/common';
@import './base/layout';

View file

@ -1,14 +1,14 @@
@use "sass:color";
@import "utilities/variables";
@use 'sass:color';
@import 'utilities/variables';
// 1. Include new custom variables
@import "utilities/bootstrap-variables";
@import 'utilities/bootstrap-variables';
// 2. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "bootstrap/scss/functions";
@import 'bootstrap/scss/functions';
// 3. Include remainder of required Bootstrap stylesheets
@import "bootstrap/scss/variables";
@import 'bootstrap/scss/variables';
// * Laravel mail vendor
@ -16,298 +16,298 @@
body,
body *:not(html, style, br, tr, code) {
position: relative;
box-sizing: border-box;
font-family:
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Helvetica,
Arial,
sans-serif,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol";
position: relative;
box-sizing: border-box;
font-family:
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
Roboto,
Helvetica,
Arial,
sans-serif,
'Apple Color Emoji',
'Segoe UI Emoji',
'Segoe UI Symbol';
}
body {
width: 100% !important;
height: 100%;
padding: 0;
margin: 0;
background-color: $body-bg;
color: $body-color;
line-height: 1.4;
text-size-adjust: none;
width: 100% !important;
height: 100%;
padding: 0;
margin: 0;
background-color: $body-bg;
color: $body-color;
line-height: 1.4;
text-size-adjust: none;
}
p,
ul,
ol,
blockquote {
line-height: 1.4;
text-align: left;
line-height: 1.4;
text-align: left;
}
img {
max-width: 100%;
max-width: 100%;
}
a {
color: $link-color;
color: $link-color;
}
a img {
border: 0;
border: 0;
}
/* Typography */
h1 {
margin-top: 0;
color: $color-primary;
font-size: 18px;
font-weight: bold;
text-align: left;
margin-top: 0;
color: $color-primary;
font-size: 18px;
font-weight: bold;
text-align: left;
}
h2 {
margin-top: 0;
font-size: 16px;
font-weight: bold;
text-align: left;
margin-top: 0;
font-size: 16px;
font-weight: bold;
text-align: left;
}
h3 {
margin-top: 0;
font-size: 14px;
font-weight: bold;
text-align: left;
margin-top: 0;
font-size: 14px;
font-weight: bold;
text-align: left;
}
p {
margin-top: 0;
font-size: 16px;
line-height: 1.5em;
text-align: left;
margin-top: 0;
font-size: 16px;
line-height: 1.5em;
text-align: left;
}
.sub {
font-size: 12px;
font-size: 12px;
}
/* Layout */
.wrapper {
-premailer-width: 100%;
width: 100%;
padding: 0;
margin: 0;
background-color: $bg-lightened;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
-premailer-width: 100%;
width: 100%;
padding: 0;
margin: 0;
background-color: $bg-lightened;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.content {
-premailer-width: 100%;
width: 100%;
padding: 0;
margin: 0;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
-premailer-width: 100%;
width: 100%;
padding: 0;
margin: 0;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
/* Header */
.header {
padding: 25px 0;
text-align: center;
padding: 25px 0;
text-align: center;
}
.header a {
color: $color-primary;
font-size: 19px;
font-weight: bold;
text-decoration: none;
color: $color-primary;
font-size: 19px;
font-weight: bold;
text-decoration: none;
}
/* Logo */
.logo {
width: 75px;
height: 75px;
max-height: 75px;
width: 75px;
height: 75px;
max-height: 75px;
}
/* Body */
.body {
-premailer-width: 100%;
width: 100%;
padding: 0;
border-top: 1px solid #{$bg-lightened};
border-bottom: 1px solid #{$bg-lightened};
margin: 0;
background-color: $bg-lightened;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
-premailer-width: 100%;
width: 100%;
padding: 0;
border-top: 1px solid #{$bg-lightened};
border-bottom: 1px solid #{$bg-lightened};
margin: 0;
background-color: $bg-lightened;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.inner-body {
-premailer-width: 570px;
width: 570px;
padding: 0;
border-width: 1px;
border-color: color.scale($body-bg, $lightness: -30%);
border-radius: 2px;
margin: 0 auto;
background-color: $body-bg;
box-shadow: 0 2px 0 rgb(0 0 150 / 2.5%), 2px 4px 0 rgb(0 0 150 / 1.5%);
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
-premailer-width: 570px;
width: 570px;
padding: 0;
border-width: 1px;
border-color: color.scale($body-bg, $lightness: -30%);
border-radius: 2px;
margin: 0 auto;
background-color: $body-bg;
box-shadow: 0 2px 0 rgb(0 0 150 / 2.5%), 2px 4px 0 rgb(0 0 150 / 1.5%);
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
/* Subcopy */
.subcopy {
padding-top: 25px;
border-top: 1px solid color.scale($body-bg, $lightness: -30%);
margin-top: 25px;
padding-top: 25px;
border-top: 1px solid color.scale($body-bg, $lightness: -30%);
margin-top: 25px;
}
.subcopy p {
font-size: 14px;
font-size: 14px;
}
/* Footer */
.footer {
-premailer-width: 570px;
width: 570px;
padding: 0;
margin: 0 auto;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
text-align: center;
-premailer-width: 570px;
width: 570px;
padding: 0;
margin: 0 auto;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
text-align: center;
}
.footer p {
color: #b0adc5;
font-size: 12px;
text-align: center;
color: #b0adc5;
font-size: 12px;
text-align: center;
}
.footer a {
color: #b0adc5;
text-decoration: underline;
color: #b0adc5;
text-decoration: underline;
}
/* Tables */
.table table {
-premailer-width: 100%;
width: 100%;
margin: 30px auto;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
-premailer-width: 100%;
width: 100%;
margin: 30px auto;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.table th {
padding-bottom: 8px;
border-bottom: 1px solid #edeff2;
margin: 0;
padding-bottom: 8px;
border-bottom: 1px solid #edeff2;
margin: 0;
}
.table td {
padding: 10px 0;
margin: 0;
color: #74787e;
font-size: 15px;
line-height: 18px;
padding: 10px 0;
margin: 0;
color: #74787e;
font-size: 15px;
line-height: 18px;
}
.content-cell {
max-width: 100vw;
padding: 32px;
max-width: 100vw;
padding: 32px;
}
/* Buttons */
.action {
-premailer-width: 100%;
width: 100%;
padding: 0;
margin: 30px auto;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
text-align: center;
-premailer-width: 100%;
width: 100%;
padding: 0;
margin: 30px auto;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
text-align: center;
}
.button {
display: inline-block;
overflow: hidden;
border-radius: 4px;
color: $body-bg;
text-decoration: none;
text-size-adjust: none;
display: inline-block;
overflow: hidden;
border-radius: 4px;
color: $body-bg;
text-decoration: none;
text-size-adjust: none;
}
.button-blue,
.button-primary {
border-top: 8px solid #{$color-primary};
border-right: 18px solid #{$color-primary};
border-bottom: 8px solid #{$color-primary};
border-left: 18px solid #{$color-primary};
background-color: #{$color-primary};
border-top: 8px solid #{$color-primary};
border-right: 18px solid #{$color-primary};
border-bottom: 8px solid #{$color-primary};
border-left: 18px solid #{$color-primary};
background-color: #{$color-primary};
}
.button-green,
.button-success {
border-top: 8px solid #{$color-success};
border-right: 18px solid #{$color-success};
border-bottom: 8px solid #{$color-success};
border-left: 18px solid #{$color-success};
background-color: #{$color-success};
border-top: 8px solid #{$color-success};
border-right: 18px solid #{$color-success};
border-bottom: 8px solid #{$color-success};
border-left: 18px solid #{$color-success};
background-color: #{$color-success};
}
.button-red,
.button-error {
border-top: 8px solid #{$color-danger};
border-right: 18px solid #{$color-danger};
border-bottom: 8px solid #{$color-danger};
border-left: 18px solid #{$color-danger};
background-color: #{$color-danger};
border-top: 8px solid #{$color-danger};
border-right: 18px solid #{$color-danger};
border-bottom: 8px solid #{$color-danger};
border-left: 18px solid #{$color-danger};
background-color: #{$color-danger};
}
/* Panels */
.panel {
border-left: $color-primary solid 4px;
margin: 21px 0;
border-left: $color-primary solid 4px;
margin: 21px 0;
}
.panel-content {
padding: 16px;
background-color: $bg-lightened;
color: $body-color;
padding: 16px;
background-color: $bg-lightened;
color: $body-color;
}
.panel-content p {
color: $body-color;
color: $body-color;
}
.panel-item {
padding: 0;
padding: 0;
}
.panel-item p:last-of-type {
padding-bottom: 0;
margin-bottom: 0;
padding-bottom: 0;
margin-bottom: 0;
}
/* Utilities */
.break-all {
word-break: break-all;
word-break: break-all;
}

View file

@ -1,5 +1,7 @@
@use "sass:list";
@import "mixins";
@import "bootstrap/scss/functions";
@import "./bs-customs/button";
// SET SOME CLASSES WITH BOOTSTRAP BREAKPOINTS
// * Reponsive borders

View file

@ -1,6 +1,12 @@
@use 'sass:map';
@import 'bootstrap/scss/functions';
// Override bootstrap colors
$primary: $color-primary;
$secondary: $color-secondary;
$tertiary: $color-tertiary;
$quad: $color-quad;
$quint: $color-quint;
$success: $color-success;
$info: $color-info;
$warning: $color-warning;
@ -8,15 +14,26 @@ $danger: $color-danger;
$light: $color-light;
$dark: $color-dark;
$theme-colors: (
primary: $primary,
secondary: $secondary,
success: $success,
info: $info,
warning: $warning,
danger: $danger,
light: $light,
dark: $dark,
primary: $primary,
secondary: $secondary,
tertiary: $tertiary,
quad: $quad,
quint: $quint,
success: $success,
info: $info,
warning: $warning,
danger: $danger,
light: $light,
dark: $dark,
);
$custom-theme-colors: map.merge($theme-colors,
(
'tertiary': $tertiary,
'quad': $quad,
'quint': $quint,
));
$theme-colors: map.merge($theme-colors, $custom-theme-colors);
$theme-colors-rgb: map-loop($theme-colors, to-rgb, '$value');
// Override bootstrap vars
$font-family-base: $font-default-family-base;

File diff suppressed because one or more lines are too long

View file

@ -1,15 +1,19 @@
// * COLORS
$color-white: #fff;
$color-light: #f8f9fa;
$color-dark: #212529;
$color-success: #198754;
$color-light: #efefef;
$color-dark: #0a2747;
$color-success: #52bd00;
$color-danger: #dc3545;
$color-info: #0dcaf0;
$color-warning: #ffc107;
$color-primary: #0d6efd;
$color-secondary: #6c757d;
$color-info: #5077b7;
$color-warning: #f69f2d;
$color-primary: #ffd264;
$color-secondary: #e33f1c;
$color-tertiary: #b6d1da;
$color-quad: #6e130a;
$color-quint: #003a5d;
// * BACKGROUNDS COLORS
$bg-white: $color-white;
$bg-lightened: $color-light;
$bg-darkened: $color-dark;
$bg-action: $color-primary;
@ -19,6 +23,46 @@ $color-default-titles: $color-primary;
$color-default-texts: $color-dark;
// * FONTS
$font-default-family-base: "Imprima Regular", sans-serif; // - The default site font family.
$font-default-family-base: 'Rufina', serif; // - The default site font family.
$font-default-size-base: 1rem; // Assumes the browser default, typically `16px`
$line-default-height-base: 1.65;
// * Layout Main Menu backdrop
$offcanvas-backdrop-bg: $color-white;
// * HEADINGS
// $headings-margin-bottom: $spacer * .5 !default;
$headings-font-family: 'Readex-Pro', serif;
// $headings-font-style: null !default;
// $headings-font-weight: 500 !default;
// $headings-line-height: 1.2 !default;
// $headings-color: inherit !default;
$display-font-family: 'Readex Pro', sans-serif;
// $display-font-style: null !default;
// $display-font-weight: 300 !default;
// $display-line-height: $headings-line-height !default;
// * Buttons
$input-btn-active-bg-color: #000;
// scss-docs-start input-btn-variables
// $input-btn-padding-y: .375rem !default;
// $input-btn-padding-x: .75rem !default;
// $input-btn-font-family: null !default;
// $input-btn-font-size: $font-size-base !default;
// $input-btn-line-height: $line-height-base !default;
// $input-btn-focus-width: $focus-ring-width !default;
// $input-btn-focus-color-opacity: $focus-ring-opacity !default;
// $input-btn-focus-color: $focus-ring-color !default;
// $input-btn-focus-blur: $focus-ring-blur !default;
// $input-btn-focus-box-shadow: $focus-ring-box-shadow !default;
// $input-btn-padding-y-sm: .25rem !default;
// $input-btn-padding-x-sm: .5rem !default;
// $input-btn-font-size-sm: $font-size-sm !default;
// $input-btn-padding-y-lg: .5rem !default;
// $input-btn-padding-x-lg: 1rem !default;
// $input-btn-font-size-lg: $font-size-lg !default;
// $input-btn-border-width: var(--#{$prefix}border-width) !default;

View file

@ -0,0 +1,46 @@
@each $color, $value in $theme-colors {
.btn-#{$color} {
--#{$prefix}btn-color: #{color-contrast($value)};
--#{$prefix}btn-bg: #{$value};
--#{$prefix}btn-hover-color: #{color-contrast(shade-color($input-btn-active-bg-color, $btn-hover-bg-shade-amount))};
--#{$prefix}btn-hover-bg: #{shade-color($input-btn-active-bg-color, $btn-hover-bg-shade-amount)};
--#{$prefix}btn-active-color: color-contrast(shade-color($input-btn-active-bg-color, $btn-active-bg-shade-amount));
--#{$prefix}btn-active-bg: #{shade-color($input-btn-active-bg-color, $btn-active-bg-shade-amount)};
--#{$prefix}btn-disabled-color: #{color-contrast($input-btn-active-bg-color)};
--#{$prefix}btn-disabled-bg: #{$input-btn-active-bg-color};
@include button-shape($value);
&:hover {
@include button-shape(shade-color($input-btn-active-bg-color, $btn-hover-bg-shade-amount));
}
&:active {
@include button-shape(shade-color($input-btn-active-bg-color, $btn-active-bg-shade-amount));
}
.btn-check + &:hover {
@include button-shape(shade-color($input-btn-active-bg-color, $btn-hover-bg-shade-amount));
color: #{color-contrast(shade-color($input-btn-active-bg-color, $btn-hover-bg-shade-amount))};
}
.btn-check:checked + &,
:not(.btn-check) + &:active,
&:first-child:active,
&.active,
&.show {
@include button-shape(shade-color($input-btn-active-bg-color, $btn-active-bg-shade-amount));
color: #{color-contrast(shade-color($input-btn-active-bg-color, $btn-active-bg-shade-amount))};
}
&:disabled,
&.disabled,
fieldset:disabled & {
@include button-shape(color-contrast($input-btn-active-bg-color));
color: #{color-contrast($input-btn-active-bg-color)};
}
}
}

View file

@ -36,7 +36,7 @@
@import "bootstrap/scss/utilities";
@import "bootstrap/scss/close";
@import "bootstrap/scss/breadcrumb";
@import "bootstrap/scss/breadcrumb";
@import "bootstrap/scss/offcanvas";
// 6. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
@import "bootstrap/scss/utilities/api";

View file

@ -24,6 +24,23 @@
</a>
</li>
@endcan
@can('viewAny', \App\Models\Range::class)
<li>
<a class="nav-link @if (request()->routeIs('bo.ranges.*')) active @endif" data-bs-toggle="tooltip" href="{{ route('bo.ranges.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.range'))]) }}">
{{ Str::of(__('models.classes.range'))->plural()->ucfirst() }}
</a>
</li>
@endcan
@can('viewAny', \App\Models\SeasonalSection::class)
<li>
<a class="nav-link @if (request()->routeIs('bo.seasonalsections.*')) active @endif" data-bs-toggle="tooltip"
href="{{ route('bo.seasonalsections.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::title(trans_choice('models.classes.seasonal_section', '*'))]) }}">
{{ Str::title(trans_choice('models.classes.seasonal_section', '*')) }}
</a>
</li>
@endcan
@canAny(['isConceptor', 'viewAny'], \App\Models\User::class)
<li class="nav-item">
<div class="dropdown">

View file

@ -0,0 +1,36 @@
@extends('bo.layout', ['brParam' => $rangeModel])
@section('title', __('Création d\'un :model', ['model' => __('models.classes.range')]))
@section('description', __('Création d\'un tout nouveau :model', ['model' => __('models.classes.range')]))
@section('breadcrumb',
request()->route()->getName())
@section('content')
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3">
<div class="d-flex align-items-start flex-row">
<a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.ranges.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.range')]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel])
</div>
<div class="mb-md-0 mb-2">
<button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.range')]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
</div>
</div>
<form action="{{ route('bo.ranges.store') }}" method="POST" enctype="multipart/form-data">
@csrf
@include('bo.pages.ranges.form')
<div class="row mt-3">
<div class="col text-center">
<button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.range')]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
</div>
</div>
</form>
@endsection

View file

@ -0,0 +1,52 @@
@extends('bo.layout', ['brParam' => $rangeModel])
@section('title', __('Édition d\'un :model', ['model' => __('models.classes.range')]))
@section('description', __('Édition d\'un :model déjà existant', ['model' => __('models.classes.range')]))
@section('breadcrumb',
request()->route()->getName())
@section('content')
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3">
<div class="d-flex align-items-start flex-row">
<a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.ranges.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.range'))]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel])
</div>
<div class="mb-md-0 mb-2">
<form class="btn-group confirmDeleteTS" action="{{ route('bo.ranges.destroy', $rangeModel) }}" method="POST" novalidate>
@can('duplicate', $rangeModel)
<a class="btn btn-secondary" data-bs-toggle="tooltip" href="{{ route('bo.ranges.duplicate', ['range' => $rangeModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.duplicate')) }}">
<i class="fa-solid fa-copy"></i>
</a>
@endcan
<button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.range')]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
@can('delete', $rangeModel)
@csrf
@method('DELETE')
<button class="btn btn-danger" data-bs-toggle="tooltip" type="submit" title="{{ Str::ucfirst(__('crud.actions.delete')) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
</div>
</div>
<form action="{{ route('bo.ranges.update', $rangeModel) }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
@include('bo.pages.ranges.form')
<div class="row">
<div class="col text-center">
<button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.range')]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
</div>
</div>
</form>
@endsection

View file

@ -0,0 +1,452 @@
<div class="row">
{{-- SEO --}}
<div class="col-12 pb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo')) }}</legend>
<div class="row mb-3">
{{-- SEO_TITLE --}}
<div class="col-12 col-md-6 m-md-0 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangeSeoTitle',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_title')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'seo_title',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => sprintf(
'%s %s',
__('crud.helpers.seo_title'),
__('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => __('validation.custom.seo_title'),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'min' => 45,
'max' => 70,
])),
'placeholder' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_title')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- SEO_DESCRIPTION --}}
<div class="col-12 col-md-6 m-md-0 mb-3">
@include('bo.partials.inputs.varchar-multiline', [
'id' => 'rangeSeoDescription',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_description')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'seo_description',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => sprintf(
'%s %s',
__('crud.helpers.seo_description'),
__('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => __('validation.custom.seo_description'),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'min' => 50,
'max' => 160,
])),
'placeholder' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_description')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
</div>
</fieldset>
</div>
{{-- TITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.title')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.varchar', [
'id' => 'rangeTitle',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.attributes.title')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'title',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => __('validation.attributes.title'),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'min' => 3,
'max' => 255,
]),
'placeholder' => __('Un titre clair et concis'),
])
</div>
</div>
</fieldset>
</div>
{{-- SUBTITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.subtitle')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.varchar', [
'id' => 'rangeSubtitle',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.subtitle')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'subtitle',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.subtitle')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'min' => 3,
'max' => 255,
]),
'placeholder' => __('Un sous-titre clair et concis'),
])
</div>
</div>
</fieldset>
</div>
{{-- TAGLINE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.tagline')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.varchar', [
'id' => 'rangeTagline',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.tagline')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'tagline',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.tagline')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'min' => 3,
'max' => 255,
]),
'placeholder' => __('Une belle phrase d\'accroche'),
])
</div>
</div>
</fieldset>
</div>
{{-- PUBLISHED --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ __('crud.minicrud.visibility_label') }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.tinyint-boolean', [
'id' => 'rangeStatus',
'name' => 'published',
'model' => $rangeModel ?? null,
'label' => __('crud.minicrud.visibility_label'),
'helper' => __('crud.minicrud.visibility_helper'),
])
</div>
</div>
</fieldset>
</div>
{{-- DESCRIPTION --}}
<div class="col-12 mb-3">
<fieldset class="border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.description')) }}</legend>
<div class="row mb-3">
<div class="col-12">
@include('bo.partials.inputs.text-html', [
'id' => 'rangeDescription',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.description')),
'inter' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'name' => 'description',
'model' => $rangeModel ?? null,
'required' => true,
'helper' => __('crud.minicrud.text_warning'),
])
</div>
</div>
</fieldset>
</div>
{{-- PICTURE --}}
<div class="col-12 pb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.image')) }}</legend>
<div class="row mb-3">
{{-- PICTURE_ALT --}}
<div class="col-12 col-md-6 m-md-0 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangePictureAlt',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'picture_alt',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.picture_alt_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- PICTURE_TITLE --}}
<div class="col-12 col-md-6 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangePictureTitle',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'picture_title',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.picture_title_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- PICTURE --}}
<div class="col-12">
@include('bo.partials.inputs.varchar-picture', [
'id' => 'rangePicture',
'name' => 'picture',
'width' => 466,
'height' => 440,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.dimensions_must_be', [
'widthpx' => '466px',
'heightpx' => '440px',
]),
'required' => true,
'preview' => true,
])
</div>
</div>
</fieldset>
</div>
{{-- PICTURE_PRODUCTSHEET --}}
<div class="col-12 pb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.picture_productsheet')) }}</legend>
<div class="row mb-3">
{{-- PICTURE_PRODUCTSHEET_ALT --}}
<div class="col-12 col-md-6 m-md-0 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangePictureProductsheetAlt',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.custom.picture_productsheet'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'picture_productsheet_alt',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.picture_alt_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.custom.picture_productsheet'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- PICTURE_PRODUCTSHEET_TITLE --}}
<div class="col-12 col-md-6 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangePictureProductsheetTitle',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.custom.picture_productsheet'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'picture_productsheet_title',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.picture_title_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.custom.picture_productsheet'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- PICTURE_PRODUCTSHEET --}}
<div class="col-12">
@include('bo.partials.inputs.varchar-picture', [
'id' => 'rangePictureProductsheet',
'name' => 'picture_productsheet',
'width' => 332,
'height' => 442,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.dimensions_must_be', [
'widthpx' => '332px',
'heightpx' => '442px',
]),
'required' => true,
'preview' => true,
])
</div>
</div>
</fieldset>
</div>
{{-- PICTURE_THUMBNAIL --}}
<div class="col-12 pb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.picture_thumbnail')) }}</legend>
<div class="row mb-3">
{{-- PICTURE_THUMBNAIL_ALT --}}
<div class="col-12 col-md-6 m-md-0 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangePictureThumbnailAlt',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.female'),
'field2' => __('validation.custom.picture_thumbnail'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'picture_thumbnail_alt',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.picture_alt_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.female'),
'field2' => __('validation.custom.picture_thumbnail'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- PICTURE_THUMBNAIL_TITLE --}}
<div class="col-12 col-md-6 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'rangePictureThumbnailTitle',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.female'),
'field2' => __('validation.custom.picture_thumbnail'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
'hasWordCounter' => true,
'name' => 'picture_thumbnail_title',
'required' => true,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.picture_title_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.female'),
'field2' => __('validation.custom.picture_thumbnail'),
'inter2' => __('validation.custom.of_the.female'),
'model' => __('models.classes.range'),
]),
])
</div>
{{-- PICTURE_THUMBNAIL --}}
<div class="col-12">
@include('bo.partials.inputs.varchar-picture', [
'id' => 'rangePictureThumbnail',
'name' => 'picture_thumbnail',
'width' => 246,
'height' => 337,
'model' => $rangeModel ?? null,
'helper' => __('crud.minicrud.dimensions_must_be', [
'widthpx' => '246px',
'heightpx' => '337px',
]),
'required' => true,
'preview' => true,
])
</div>
</div>
</fieldset>
</div>
</div>
<div class="row">
<div class="col text-center">
<p><b>{{ __('* Champs obligatoires') }}</b></p>
</div>
</div>
@push('scripts')
<script nonce="{{ $nonce }}">
document.addEventListener("DOMContentLoaded", () => {
// Submit button clone.
const submit = document.getElementById('formSubmit')
submitClone = document.getElementById('formSubmitClone');
submitClone.addEventListener('click', (event) => {
event.preventDefault();
submit.click('');
})
});
</script>
@endpush

View file

@ -0,0 +1,81 @@
<table class="table-hover table-fix-action m-0 table">
@if (count($rangeModels) > 0)
<thead>
@include('bo.modules.table-col-sorter', [
'cols' => [
'title' => Str::ucfirst(__('validation.attributes.title')),
'picture' => Str::ucfirst(__('validation.attributes.image')),
'order' => Str::ucfirst(__('validation.custom.order')),
'published' => Str::ucfirst(__('validation.custom.activated')),
'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')),
],
])
</thead>
<tbody>
@foreach ($rangeModels as $rangeModel)
<tr class="border-bottom list-item">
<td class="text-center align-middle">{{ $rangeModel->title }}</td>
<td class="text-center align-middle">
<img height="50px" src="/{{ $rangeModel->picture }}">
</td>
@php
$routeName = request()
->route()
->getName();
@endphp
@if (empty(request()->search) && Session::get("$routeName.sort_col") === 'order')
@include('bo.modules.change-model-order', [
'routeName' => 'ranges',
'model' => $rangeModel,
'models' => $rangeModels,
])
@endif
@include('bo.modules.change-published-status', [
'routeName' => 'ranges',
'model' => $rangeModel,
])
<td class="text-center align-middle">
<span class="badge bg-secondary">{{ $rangeModel->updated_at->isoFormat('LLLL') }}</span>
</td>
<td class="text-end align-middle">
@canAny(['delete', 'duplicate', 'update'], $rangeModel)
<form class="btn-group confirmDeleteTS" action="{{ route('bo.ranges.destroy', $rangeModel) }}" method="POST"
novalidate>
@can('duplicate', $rangeModel)
<a class="btn btn-sm btn-secondary" data-bs-toggle="tooltip"
href="{{ route('bo.ranges.duplicate', ['range' => $rangeModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.duplicate')) }}">
<i class="fa-solid fa-copy"></i>
</a>
@endcan
@can('update', $rangeModel)
<a class="btn btn-sm btn-primary" data-bs-toggle="tooltip"
href="{{ route('bo.ranges.edit', ['range' => $rangeModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.update')) }}">
<i class="fa-solid fa-pencil"></i>
</a>
@endcan
@can('delete', $rangeModel)
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger" data-bs-toggle="tooltip" type="submit"
title="{{ Str::ucfirst(__('crud.actions.delete')) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
@else
<span class="text-danger" data-bs-toggle="tooltip" title="{{ __('list.right') }}">
<i class="fa-solid fa-ban"></i>
</span>
@endcan
</td>
</tr>
@endforeach
</tbody>
@else
<tr>
<td class="border-0">{{ __('crud.other.no_model_found', ['model' => __('models.classes.range')]) }}</td>
</tr>
@endif
</table>

View file

@ -0,0 +1,21 @@
@extends('bo.layout')
@section('title', Str::ucfirst(__('models.classes.range')))
@section('description', __('Liste de tous les :model', ['model' => Str::plural(__('models.classes.range'))]))
@section('content')
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
@include('modules.breadcrumbs.breadcrumb-body')
@can('create', \App\Models\Range::class)
<a class="btn btn-primary float-right" data-bs-toggle="tooltip" href="{{ route('bo.ranges.create') }}"
title="{{ __('crud.helpers.create_model', ['model' => __('models.classes.range')]) }}">
<i class="fa-solid fa-plus"></i>
</a>
@endcan
</div>
@include('bo.modules.search-bar')
<div class="table-responsive mb-3">
@include('bo.pages.ranges.index-list')
</div>
{{ $rangeModels->links() }}
@endsection

View file

@ -0,0 +1,36 @@
@extends('bo.layout', ['brParam' => $seasonalSectionModel])
@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.seasonal_section', 1)]))
@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.seasonal_section', 1)]))
@section('breadcrumb',
request()->route()->getName())
@section('content')
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3">
<div class="d-flex align-items-start flex-row">
<a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.seasonalsections.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.seasonal_section', '*')]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $seasonalSectionModel])
</div>
<div class="mb-md-0 mb-2">
<button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => trans_choice('models.classes.seasonal_section', 1)]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
</div>
</div>
<form action="{{ route('bo.seasonalsections.store') }}" method="POST" enctype="multipart/form-data">
@csrf
@include('bo.pages.seasonal_sections.form')
<div class="row mt-3">
<div class="col text-center">
<button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => trans_choice('models.classes.seasonal_section', 1)]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
</div>
</div>
</form>
@endsection

View file

@ -0,0 +1,52 @@
@extends('bo.layout', ['brParam' => $seasonalSectionModel])
@section('title', __('Édition d\'un :model', ['model' => __('models.classes.seasonal_section')]))
@section('description', __('Édition d\'un :model déjà existant', ['model' => __('models.classes.seasonal_section')]))
@section('breadcrumb',
request()->route()->getName())
@section('content')
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3">
<div class="d-flex align-items-start flex-row">
<a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.seasonalsections.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.seasonal_section'))]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $seasonalSectionModel])
</div>
<div class="mb-md-0 mb-2">
<form class="btn-group confirmDeleteTS" action="{{ route('bo.seasonalsections.destroy', $seasonalSectionModel) }}" method="POST" novalidate>
@can('duplicate', $seasonalSectionModel)
<a class="btn btn-secondary" data-bs-toggle="tooltip" href="{{ route('bo.seasonalsections.duplicate', ['seasonal_section' => $seasonalSectionModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.duplicate')) }}">
<i class="fa-solid fa-copy"></i>
</a>
@endcan
<button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.seasonal_section')]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
@can('delete', $seasonalSectionModel)
@csrf
@method('DELETE')
<button class="btn btn-danger" data-bs-toggle="tooltip" type="submit" title="{{ Str::ucfirst(__('crud.actions.delete')) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
</div>
</div>
<form action="{{ route('bo.seasonalsections.update', $seasonalSectionModel) }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
@include('bo.pages.seasonal_sections.form')
<div class="row">
<div class="col text-center">
<button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit"
title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.seasonal_section')]) }}">
{{ Str::ucfirst(__('crud.actions.save')) }}
</button>
</div>
</div>
</form>
@endsection

View file

@ -0,0 +1,220 @@
<div class="row">
{{-- TITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.title')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.varchar', [
'id' => 'seasonalSectionTitle',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.attributes.title')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
'hasWordCounter' => true,
'name' => 'title',
'required' => true,
'model' => $seasonalSectionModel ?? null,
'helper' => __('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => __('validation.attributes.title'),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
'min' => 3,
'max' => 100,
]),
'placeholder' => __('Un titre clair et concis'),
])
</div>
</div>
</fieldset>
</div>
{{-- BACKGROUND --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.background')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.tinyint-enum', [
'id' => 'seasonalSectionBackground',
'label' => __('Associer un fond'),
'name' => 'background',
'model' => $seasonalSectionModel ?? null,
'required' => true,
'associatedModels' => \App\Enums\SeasonalSections\BackgroundEnum::toArray(),
'helper' => __('Sélectionnez un fond dans la liste déroulante.'),
])
</div>
</div>
</fieldset>
</div>
{{-- TEXT --}}
<div class="col-12 mb-3">
<fieldset class="border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.content')) }}</legend>
<div class="row mb-3">
<div class="col-12">
@include('bo.partials.inputs.text-html', [
'id' => 'seasonalSectionText',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.attributes.text')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
'name' => 'text',
'model' => $seasonalSectionModel ?? null,
'required' => true,
'helper' => __('crud.minicrud.text_warning'),
])
</div>
</div>
</fieldset>
</div>
{{-- PICTURE --}}
<div class="col-12 pb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.image')) }}</legend>
<div class="row mb-3">
{{-- PICTURE_ALT --}}
<div class="col-12 col-md-6 m-md-0 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'seasonalSectionPictureAlt',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
'hasWordCounter' => true,
'name' => 'picture_alt',
'required' => true,
'model' => $seasonalSectionModel ?? null,
'helper' => __('crud.minicrud.picture_alt_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_alt')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
])
</div>
{{-- PICTURE_TITLE --}}
<div class="col-12 col-md-6 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'seasonalSectionPictureTitle',
'label' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
'hasWordCounter' => true,
'name' => 'picture_title',
'required' => true,
'model' => $seasonalSectionModel ?? null,
'helper' => __('crud.minicrud.picture_title_helper'),
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
'field1' => Str::ucfirst(__('validation.custom.attribute_title')),
'inter1' => __('validation.custom.of_the.vowel'),
'field2' => __('validation.attributes.image'),
'inter2' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
])
</div>
{{-- PICTURE --}}
<div class="col-12">
@include('bo.partials.inputs.varchar-picture', [
'id' => 'seasonalSectionPicture',
'name' => 'picture',
'width' => 362,
'height' => 542,
'model' => $seasonalSectionModel ?? null,
'helper' => __('crud.minicrud.dimensions_must_be', [
'widthpx' => '362px',
'heightpx' => '542px',
]),
'required' => true,
'preview' => true,
])
</div>
</div>
</fieldset>
</div>
{{-- PUBLISHED --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ __('crud.minicrud.visibility_label') }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.tinyint-boolean', [
'id' => 'seasonalSectionPublished',
'name' => 'published',
'model' => $seasonalSectionModel ?? null,
'label' => __('crud.minicrud.visibility_label'),
'helper' => sprintf('%s %s', __('crud.minicrud.visibility_helper'), __('crud.helpers.visibility_with_dates')),
])
</div>
</div>
</fieldset>
</div>
{{-- PUBLICATION --}}
<div class="col-12 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ __('Publication') }}</legend>
<div class="row mb-3">
<div class="col">
<div class="form-group">
@include('bo.partials.inputs.timestamp-datetime', [
'label' => Str::ucfirst(__('validation.custom.publish_at')) . __(' (Europe/Paris)'),
'id' => 'seasonalSectionPublishedAt',
'name' => 'publish_at',
'model' => $seasonalSectionModel ?? null,
'helper' => __('crud.helpers.publish_at', [
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
])
</div>
</div>
<div class="col">
<div class="form-group">
@include('bo.partials.inputs.timestamp-datetime', [
'label' => Str::ucfirst(__('validation.custom.unpublish_at')) . __(' (Europe/Paris)'),
'id' => 'seasonalSectionUnPublishedAt',
'name' => 'unpublish_at',
'model' => $seasonalSectionModel ?? null,
'helper' => __('crud.helpers.unpublish_at', [
'model' => trans_choice('models.classes.seasonal_section', 1),
]),
])
</div>
</div>
</div>
</fieldset>
</div>
</div>
<div class="row">
<div class="col text-center">
<p><b>{{ __('* Champs obligatoires') }}</b></p>
</div>
</div>
@push('scripts')
<script nonce="{{ $nonce }}">
document.addEventListener("DOMContentLoaded", () => {
// Submit button clone.
const submit = document.getElementById('formSubmit')
submitClone = document.getElementById('formSubmitClone');
submitClone.addEventListener('click', (event) => {
event.preventDefault();
submit.click('');
})
});
</script>
@endpush

View file

@ -0,0 +1,70 @@
<table class="table-hover table-fix-action m-0 table">
@if (count($seasonalSectionModels) > 0)
<thead>
@include('bo.modules.table-col-sorter', [
'cols' => [
'title' => Str::ucfirst(__('validation.attributes.title')),
'background' => Str::ucfirst(__('validation.custom.background')),
'picture' => Str::ucfirst(__('validation.attributes.image')),
'published' => Str::ucfirst(__('validation.custom.activated')),
'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')),
],
])
</thead>
<tbody>
@foreach ($seasonalSectionModels as $seasonalSectionModel)
<tr class="border-bottom list-item">
<td class="text-center align-middle">{{ $seasonalSectionModel->title }}</td>
<td class="text-center align-middle">{{ $seasonalSectionModel->background->label() }}</td>
<td class="text-center align-middle">
<img height="50px" src="/{{ $seasonalSectionModel->picture }}">
</td>
@include('bo.modules.change-published-status', [
'routeName' => 'seasonalsections',
'model' => $seasonalSectionModel,
])
<td class="text-center align-middle">
<span class="badge bg-secondary">{{ $seasonalSectionModel->updated_at->isoFormat('LLLL') }}</span>
</td>
<td class="text-end align-middle">
@canAny(['delete', 'duplicate', 'update'], $seasonalSectionModel)
<form class="btn-group confirmDeleteTS" action="{{ route('bo.seasonalsections.destroy', $seasonalSectionModel) }}" method="POST"
novalidate>
@can('duplicate', $seasonalSectionModel)
<a class="btn btn-sm btn-secondary" data-bs-toggle="tooltip"
href="{{ route('bo.seasonalsections.duplicate', ['seasonal_section' => $seasonalSectionModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.duplicate')) }}">
<i class="fa-solid fa-copy"></i>
</a>
@endcan
@can('update', $seasonalSectionModel)
<a class="btn btn-sm btn-primary" data-bs-toggle="tooltip"
href="{{ route('bo.seasonalsections.edit', ['seasonal_section' => $seasonalSectionModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.update')) }}">
<i class="fa-solid fa-pencil"></i>
</a>
@endcan
@can('delete', $seasonalSectionModel)
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger" data-bs-toggle="tooltip" type="submit"
title="{{ Str::ucfirst(__('crud.actions.delete')) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
@else
<span class="text-danger" data-bs-toggle="tooltip" title="{{ __('list.right') }}">
<i class="fa-solid fa-ban"></i>
</span>
@endcan
</td>
</tr>
@endforeach
</tbody>
@else
<tr>
<td class="border-0">{{ __('crud.other.no_model_found', ['model' => __('models.classes.seasonal_section')]) }}</td>
</tr>
@endif
</table>

View file

@ -0,0 +1,21 @@
@extends('bo.layout')
@section('title', Str::ucfirst(trans_choice('models.classes.seasonal_section', '*')))
@section('description', __('Liste de tous les :model', ['model' => trans_choice('models.classes.seasonal_section', '*')]))
@section('content')
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
@include('modules.breadcrumbs.breadcrumb-body')
@can('create', \App\Models\Range::class)
<a class="btn btn-primary float-right" data-bs-toggle="tooltip" href="{{ route('bo.seasonalsections.create') }}"
title="{{ __('crud.helpers.create_model', ['model' => trans_choice('models.classes.seasonal_section', 1)]) }}">
<i class="fa-solid fa-plus"></i>
</a>
@endcan
</div>
@include('bo.modules.search-bar')
<div class="table-responsive mb-3">
@include('bo.pages.seasonal_sections.index-list')
</div>
{{ $seasonalSectionModels->links() }}
@endsection

View file

@ -6,6 +6,7 @@
</head>
<body>
@include('fo.layouts.header')
<main class="container-fluid @yield('bg-color') pt-2">
<div class="row justify-content-center">
<div class="col col-md-6">

View file

@ -0,0 +1,19 @@
<nav class="main-menu navbar">
<div class="container-fluid">
<a class="navbar-brand" data-bs-toggle="tooltip" data-bs-placement="bottom" href="{{ route('fo.homepage') }}"
title="{{ __('Accéder au front du projet') }}" target="_blank">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/layout/logo.svg', 'build') }}" alt="{{ config('app.name') }}"
width="200">
</a>
<span class="center-main-menu-text h6 text-uppercase d-none d-sm-flex">{{ __('Crée & préparé avec passion') }}</span>
<button class="navbar-toggler border-0" data-bs-toggle="offcanvas" data-bs-target="#offcanvas-nav-menu" type="button"
aria-controls="offcanvas-nav-menu">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/layout/hamburger-menu.svg', 'build') }}"
alt="{{ config('app.name') }}" width="30">
</button>
@include('fo.layouts.nav-offcanvas')
</div>
</nav>

View file

@ -0,0 +1,32 @@
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('fo.homepage')) active @endif" data-bs-toggle="tooltip"
href="{{ route('fo.homepage') }}" title="{{ __('Revenir à l\'accueil') }}">
{{ __('Accueil') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('fo.bs-demo')) active @endif" data-bs-toggle="tooltip"
href="{{ route('fo.bs-demo') }}" title="{{ __('L\'explorateur & Gastronome') }}">
{{ __('L\'explorateur & Gastronome') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('CHANGEME')) active @endif" data-bs-toggle="tooltip"
href="#" title="{{ __('Nos gammes') }}">
{{ __('Nos gammes') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('CHANGEME')) active @endif" data-bs-toggle="tooltip"
href="#" title="{{ __('Nous connaitre') }}">
{{ __('Nous connaitre') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('CHANGEME')) active @endif" data-bs-toggle="tooltip"
href="#" title="{{ __('Nos actualités') }}">
{{ __('Nos actualités') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('CHANGEME')) active @endif" data-bs-toggle="tooltip"
href="#" title="{{ __('Rejoignez-nous') }}">
{{ __('Rejoignez-nous') }}
</a>
<a class="nav-link display-5 fw-bold text-uppercase @if (request()->routeIs('CHANGEME')) active @endif" data-bs-toggle="tooltip"
href="#" title="{{ __('Contact') }}">
{{ __('Contact') }}
</a>
</li>
</ul>

View file

@ -0,0 +1,12 @@
<div class="offcanvas offcanvas-top offcanvas-main-menu" id="offcanvas-nav-menu" aria-labelledby="offcanvas-nav-menu-label" tabindex="-1">
<div class="offcanvas-header px-4 pt-4">
<hr>
<button class="btn-close fs-3 pe-4" data-bs-dismiss="offcanvas" type="button" aria-label="Close"></button>
</div>
<div class="offcanvas-body px-4 pb-4">
@include('fo.layouts.nav-list')
</div>
<div class="offcanvas-header px-4 pb-4">
<hr>
</div>
</div>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -8,6 +8,5 @@
@section('button', true)
@section('image')
{{-- FIXME: Personaliser ca --}}
<img src="{{ Vite::asset('resources/assets/images/logo.png') }}" class="logo img-fluid" alt="{{ config('app.name') }}">
<img class="logo img-fluid" src="{{ Vite::asset('resources/assets/images/logo.png') }}" alt="{{ config('app.name') }}">
@endsection

View file

@ -8,6 +8,5 @@
@section('button', true)
@section('image')
{{-- FIXME: Personaliser ca --}}
<img src="{{ Vite::asset('resources/assets/images/logo.png') }}" class="logo img-fluid" alt="{{ config('app.name') }}">
<img class="logo img-fluid" src="{{ Vite::asset('resources/assets/images/logo.png') }}" alt="{{ config('app.name') }}">
@endsection

View file

@ -6,6 +6,5 @@
@section('submessage', __('Le site est en maintenance, nous reviendrons...'))
@section('image')
{{-- FIXME: Personaliser ca --}}
<img src="{{ Vite::asset('resources/assets/images/logo.png') }}" class="logo img-fluid" alt="{{ config('app.name') }}">
<img class="logo img-fluid" src="{{ Vite::asset('resources/assets/images/logo.png') }}" alt="{{ config('app.name') }}">
@endsection

View file

@ -12,7 +12,7 @@
</head>
<body>
<div class="row bg-primary text-primary bg-gradient d-md-flex min-vh-100 h-100 m-0 bg-opacity-25">
<div class="row bg-gradient d-md-flex min-vh-100 h-100 m-0 bg-opacity-25">
<div class="col-12 col-md-6 d-flex align-items-center justify-content-center">
<div class="w-md-50 m-5">
<div class="display-1">

View file

@ -1,7 +1,8 @@
<?php
use App\Models\ActivityLog;
use App\Models\Commitment;
use App\Models\Range;
use App\Models\SeasonalSection;
use App\Models\StaticPage;
use App\Models\User;
use Diglactic\Breadcrumbs\Breadcrumbs;
@ -23,9 +24,9 @@ Breadcrumbs::for('bo.users.edit', function (Generator $trail, User $user) {
$trail->parent('bo.users.index');
$trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.users.edit', $user));
});
Breadcrumbs::for('bo.users.duplicate', function (Generator $trail, User $user) {
Breadcrumbs::for('bo.users.duplicate', function (Generator $trail) {
$trail->parent('bo.users.index');
$trail->push(Str::ucfirst(trans('crud.actions.duplicate')), route('bo.users.duplicate', $user));
$trail->push(Str::ucfirst(trans('crud.actions.duplicate')));
});
// * COMMITMENTS
@ -71,3 +72,43 @@ Breadcrumbs::for('bo.static_pages.edit', function (Generator $trail, StaticPage
$trail->parent('bo.static_pages.index');
$trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.static_pages.edit', $static_page));
});
// * RANGES
Breadcrumbs::for('bo.ranges.index', function (Generator $trail) {
$trail->push(
Str::of(trans('models.classes.range'))->plural()->ucfirst(),
route('bo.ranges.index', ['sort_col' => 'updated_at', 'sort_way' => 'desc'])
);
});
Breadcrumbs::for('bo.ranges.create', function (Generator $trail) {
$trail->parent('bo.ranges.index');
$trail->push(Str::ucfirst(trans('crud.actions.create')), route('bo.ranges.create'));
});
Breadcrumbs::for('bo.ranges.edit', function (Generator $trail, Range $range) {
$trail->parent('bo.ranges.index');
$trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.ranges.edit', $range));
});
Breadcrumbs::for('bo.ranges.duplicate', function (Generator $trail) {
$trail->parent('bo.ranges.index');
$trail->push(Str::ucfirst(trans('crud.actions.duplicate')));
});
// * SEASONAL SECTIONS
Breadcrumbs::for('bo.seasonalsections.index', function (Generator $trail) {
$trail->push(
Str::ucfirst(trans_choice('models.classes.seasonal_section', '*')),
route('bo.seasonalsections.index', ['sort_col' => 'updated_at', 'sort_way' => 'desc'])
);
});
Breadcrumbs::for('bo.seasonalsections.create', function (Generator $trail) {
$trail->parent('bo.seasonalsections.index');
$trail->push(Str::ucfirst(trans('crud.actions.create')), route('bo.seasonalsections.create'));
});
Breadcrumbs::for('bo.seasonalsections.edit', function (Generator $trail, SeasonalSection $seasonal_section) {
$trail->parent('bo.seasonalsections.index');
$trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.seasonalsections.edit', $seasonal_section));
});
Breadcrumbs::for('bo.seasonalsections.duplicate', function (Generator $trail) {
$trail->parent('bo.seasonalsections.index');
$trail->push(Str::ucfirst(trans('crud.actions.duplicate')));
});

View file

@ -4,6 +4,8 @@ use App\Http\Controllers\Bo\ActivityLogsController;
use App\Http\Controllers\Bo\CommitmentController;
use App\Http\Controllers\Bo\DashboardController;
use App\Http\Controllers\Bo\StaticPageController;
use App\Http\Controllers\Bo\RangeController;
use App\Http\Controllers\Bo\SeasonalSectionController;
use App\Http\Controllers\Bo\UsersController;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
@ -62,6 +64,30 @@ Route::prefix('bo')
->withoutMiddleware('htmlsanitize')
->middleware('htmlsanitize:content');
// * RANGES.
Route::resource('ranges', RangeController::class)->except('show');
Route::patch('/ranges/{range}/change-published', [
RangeController::class, 'changePublished'
])->name('ranges.change-published');
Route::patch('/ranges/{range}/change-order/{direction}', [
RangeController::class, 'changeOrder'
])->where('direction', 'up|down')->name('ranges.change-order');
Route::get('/ranges/{range}/duplicate', [
RangeController::class, 'duplicate'
])->name('ranges.duplicate');
// * SEASONAL SECTIONS.
Route::resource('seasonalsections', SeasonalSectionController::class)->except('show')
->parameters(['seasonalsections' => 'seasonal_section'])
->withoutMiddleware('htmlsanitize')
->middleware('htmlsanitize:text');
Route::patch('/seasonalsections/{seasonal_section}/change-published', [
SeasonalSectionController::class, 'changePublished'
])->name('seasonalsections.change-published');
Route::get('/seasonalsections/{seasonal_section}/duplicate', [
SeasonalSectionController::class, 'duplicate'
])->name('seasonalsections.duplicate');
Route::middleware('can:isConceptor')->group(function () {
// * ACTIVITY LOGS.
Route::resource('activity_logs', ActivityLogsController::class)->only(['index', 'show']);

View file

@ -7,4 +7,5 @@ Route::middleware(['throttle:credentials'])
->name('fo.')
->group(function () {
Route::get('/', [HomeController::class, 'index'])->name('homepage');
Route::view('/bs-demo', 'fo.pages.bs-demo')->name('bs-demo');
});

View file

@ -1,8 +1,9 @@
import legacy from "@vitejs/plugin-legacy";
import basicSsl from "@vitejs/plugin-basic-ssl";
import vue from "@vitejs/plugin-vue";
import laravel from "laravel-vite-plugin";
import path from "path";
import postcssDiscard from "postcss-discard-comments";
import { defineConfig } from "vite";
import babel from "vite-plugin-babel";
import checker from "vite-plugin-checker";
import eslint from "vite-plugin-eslint";
import stylelint from "vite-plugin-stylelint";
@ -32,13 +33,14 @@ export default defineConfig({
inline: true,
},
plugins: [
require("postcss-discard-comments")({
postcssDiscard({
removeAll: true,
}),
],
},
},
plugins: [
basicSsl(),
checker({
enableBuild: true,
vueTsc: {
@ -51,11 +53,11 @@ export default defineConfig({
},
eslint: {
lintCommand:
"eslint --fix --quiet -c .eslintrc.json \"./resources\"",
"eslint --quiet -c .eslintrc.json \"./resources\"",
},
stylelint: {
lintCommand:
"stylelint -q --config \"./.stylelintrc.json\" --fix \"**/resources/**/*.scss\"",
"stylelint --quiet, -c .stylelintrc.json --fix **/resources/**/*.scss",
},
}),
laravel({
@ -65,13 +67,13 @@ export default defineConfig({
"resources/sass/fo/fo.scss",
"resources/ts/fo/fo.ts",
],
refresh: true,
}),
stylelint({
dev: false,
build: true,
cache: false,
chokidar: true,
quiet: false,
include: ["**/resources/**/*.scss", "**/resources/**/*.css"],
exclude: ["node_modules", "vendor"],
lintOnStart: false,
@ -91,15 +93,21 @@ export default defineConfig({
failOnWarning: false,
failOnError: false,
}),
babel({
babelConfig: {
targets: "last 3 version, not dead, >0.3%"
}
}),
vue({
isProduction: process.env.NODE_ENV !== "local" ? true : false,
exclude: ["node_modules", "vendor"],
}),
legacy({
targets: "last 3 version, not dead, >0.3%",
renderLegacyChunks: false,
}),
})
],
server: {
watch: {
usePolling: true,
},
},
resolve: {
extensions: ["*", ".js", ".ts", ".vue"],
alias: [
@ -110,11 +118,7 @@ export default defineConfig({
{
find: "@",
replacement: "/resources/assets",
},
{
find: "~",
replacement: path.resolve(__dirname, "./node_modules"),
},
}
],
},
});