contact page, legal pages and category page

This commit is contained in:
elvira
2026-08-26 13:43:30 +03:00
parent 45057f9083
commit fab9cc08a8
38 changed files with 1726 additions and 182 deletions
+6 -5
View File
@@ -10,9 +10,8 @@
{{-- Links --}}
<nav aria-label="Footer navigation">
<ul class="flex flex-wrap justify-center items-center gap-x-8 gap-y-3 font-semibold uppercase">
<li><a href="/contact" class="underline-slide [--slide-h:5px] font-extrabold italic">Επικοινωνία</a></li>
<li><a href="/shipping" class="underline-slide [--slide-h:5px] font-extrabold italic">Πληροφορίες αποστολών</a></li>
<li><a href="/returns" class="underline-slide [--slide-h:5px] font-extrabold italic">Πολιτική επιστροφών</a></li>
<li><a href="{{ route('contact') }}" class="underline-slide [--slide-h:5px] font-extrabold italic">Επικοινωνία</a></li>
<li><a href="{{ route('legal.shipping-returns') }}" class="underline-slide [--slide-h:5px] font-extrabold italic">Αποστολές & Επιστροφές</a></li>
</ul>
</nav>
@@ -57,9 +56,11 @@
&copy; {{ date('Y') }} {{ config('app.name') }}. Με επιφύλαξη παντός δικαιώματος.
</p>
<a href="/terms" class="underline-slide [--slide-h:1px] pb-0">Όροι χρήσης</a>
<a href="{{ route('legal.terms') }}" class="underline-slide [--slide-h:1px] pb-0">Όροι & Προϋποθέσεις</a>
<span>|</span>
<a href="/privacy" class="underline-slide [--slide-h:1px] pb-0 ">Πολιτική απορρήτου</a>
<a href="{{ route('legal.privacy') }}" class="underline-slide [--slide-h:1px] pb-0">Πολιτική Απορρήτου</a>
<span>|</span>
<a href="{{ route('legal.cookies') }}" class="underline-slide [--slide-h:1px] pb-0">Πολιτική Cookies</a>
</div>
</div>
+1 -1
View File
@@ -27,7 +27,7 @@
</div>
{{-- Contact --}}
<a href="{{ url('/'.app()->getLocale().'/contact') }}" class="nav-link uppercase inline-flex items-center gap-1 relative font-display font-extrabold italic text-black no-underline"><span>{{ __('general.nav.contact') }}</span></a>
<a href="{{ route('contact') }}" class="nav-link uppercase inline-flex items-center gap-1 relative font-display font-extrabold italic text-black no-underline"><span>{{ __('general.nav.contact') }}</span></a>
</nav>
@@ -49,14 +49,15 @@ class="absolute right-0 bottom-2 cursor-pointer"
</form>
</div>
<div class="relative bg-neutral-300 min-h-[320px] lg:min-h-full border-t border-black lg:border-t-0 lg:border-l">
@if($image)
<img src="{{ $image }}" alt="" aria-hidden="true" loading="lazy" width="800" height="800" class="w-full h-full object-cover">
@else
<div class="absolute inset-0 flex items-center justify-center text-neutral-500 text-sm">
Χωρίς εικόνα
</div>
@endif
<div class=" min-h-[320px] lg:min-h-full border-t border-black lg:border-t-0 lg:border-l flex items-center justify-center">
<x-ui.stoic-image
src="middle-fingers2.png"
preset="medium"
alt=""
aria-hidden="true"
loading="lazy"
class="mix-blend-darken max-w-md"
/>
</div>
</div>
</section>
@@ -1,14 +1,23 @@
@props([
'title' => null,
'products' => [],
'cols' => 4,
])
@php
$gridCols = match((int) $cols) {
3 => 'grid-cols-2 md:grid-cols-3',
2 => 'grid-cols-1 md:grid-cols-2',
default => 'grid-cols-2 md:grid-cols-4',
};
@endphp
<section {{ $attributes }}>
@if($title)
<h2 class="font-display font-extrabold text-h2 mb-10">{{ $title }}</h2>
@endif
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
<div class="grid {{ $gridCols }} gap-6">
@foreach($products as $product)
<x-ui.product-card
:name="$product['name']"
@@ -0,0 +1,31 @@
@props(['paginator'])
{{--
Numbered pager (01 02 03 …) matching the site's underline-slide convention,
plus a trailing arrow to the next page. Real pagination — takes any
Illuminate\Contracts\Pagination\LengthAwarePaginator.
Usage: <x-ui.pagination :paginator="$products" />
--}}
@if($paginator->hasPages())
<nav aria-label="{{ __('general.pagination.nav_label') }}" {{ $attributes->merge(['class' => 'flex items-center gap-6 font-display font-bold']) }}>
<ol class="flex items-center gap-6">
@foreach($paginator->getUrlRange(1, $paginator->lastPage()) as $page => $url)
<li>
@if($page === $paginator->currentPage())
<span class="underline-slide is-active" aria-current="page">{{ str_pad((string) $page, 2, '0', STR_PAD_LEFT) }}</span>
@else
<a href="{{ $url }}" class="underline-slide" aria-label="{{ __('general.pagination.page', ['page' => $page]) }}">{{ str_pad((string) $page, 2, '0', STR_PAD_LEFT) }}</a>
@endif
</li>
@endforeach
</ol>
@if($paginator->hasMorePages())
<a href="{{ $paginator->nextPageUrl() }}" aria-label="{{ __('general.pagination.next') }}">
<x-ui.icon name="arrow-right" :size="24" />
</a>
@endif
</nav>
@endif
@@ -7,7 +7,7 @@
<div class="group">
<div class="relative flex items-center justify-center mb-4">
<a href="{{ $href }}" class="block w-full border border-black overflow-hidden bg-white">
<a href="{{ $href }}" class="block w-full border border-black overflow-hidden bg-white aspect-[251/335] flex items-center justify-center">
@if($image)
<img
src="{{ $image }}"
@@ -0,0 +1,30 @@
@props([
'options' => [],
'value' => null,
'name' => null,
'ariaLabel' => null,
])
{{--
Native <select>, styled to match the site's bordered/uppercase look.
Usage:
<x-ui.select
:options="[['value' => 'a', 'label' => 'Option A'], ...]"
value="a"
ariaLabel="Sort products"
/>
--}}
<div class="relative inline-flex items-center">
<select
@if($name) name="{{ $name }}" @endif
@if($ariaLabel) aria-label="{{ $ariaLabel }}" @endif
{{ $attributes->merge(['class' => 'appearance-none bg-transparent border border-black pl-4 pr-10 py-2.5 font-display font-bold cursor-pointer focus:outline-none']) }}
>
@foreach($options as $option)
<option value="{{ $option['value'] }}" @selected($value === $option['value'])>{{ $option['label'] }}</option>
@endforeach
</select>
<x-ui.icon name="arrow-down" :size="16" class="pointer-events-none absolute right-4" />
</div>
@@ -0,0 +1,45 @@
@props([
'src', // Stoic filename string e.g. "hero.png"
'preset' => 'medium', // which preset sets the src + default sizes hint
'alt' => '',
'loading' => 'lazy',
'fetchpriority' => 'auto',
'sizes' => null, // override when you know the render context
'width' => null,
'height' => null,
'preload' => false, // push a <link rel=preload> into <head> for LCP images
])
@php
$ext = strtolower(pathinfo($src, PATHINFO_EXTENSION));
$imageSrc = \App\Services\Stoic::image($src, $preset);
$srcset = \App\Services\Stoic::srcset($src);
$presetW = collect(\App\Services\Stoic::presets())->firstWhere('code', $preset)['width'] ?? 800;
$sizesAttr = $sizes ?? "(min-width: 1024px) {$presetW}px, 100vw";
[$width, $height] = $width !== null && $height !== null
? [$width, $height]
: \App\Services\Stoic::dimensions($src, $preset);
@endphp
@if($preload)
@push('seo')
<link rel="preload" as="image" href="{{ $imageSrc }}"
@if($srcset) imagesrcset="{{ $srcset }}" imagesizes="{{ $sizesAttr }}" @endif
@if($ext !== 'svg') type="image/webp" @endif
fetchpriority="high" />
@endpush
@endif
<img
src="{{ $imageSrc }}"
@if($srcset)
srcset="{{ $srcset }}"
sizes="{{ $sizesAttr }}"
@endif
@if($width !== null) width="{{ $width }}" @endif
@if($height !== null) height="{{ $height }}" @endif
alt="{{ $alt }}"
loading="{{ $loading }}"
fetchpriority="{{ $fetchpriority }}"
{{ $attributes }}
/>