Unify fonts and fix category seed

This commit is contained in:
fatihalp 2026-03-06 02:15:13 +03:00
parent 165585cdc4
commit aa7d2e27c0
11 changed files with 1272 additions and 832 deletions

View File

@ -72,7 +72,7 @@ class Category extends Model
->active() ->active()
->whereNull('parent_id') ->whereNull('parent_id')
->with([ ->with([
'children' => fn (Builder $query) => $query->active()->ordered(), 'children' => fn ($query) => $query->active()->ordered(),
]) ])
->ordered() ->ordered()
->get(); ->get();

View File

@ -23,13 +23,13 @@
@endphp @endphp
<div class="max-w-[1320px] mx-auto px-4 py-7 lg:py-8"> <div class="max-w-[1320px] mx-auto px-4 py-7 lg:py-8">
<h1 class="text-[30px] leading-tight font-extrabold text-slate-900 mb-6">{{ $pageTitle }}</h1> <h1 class="text-3xl md:text-4xl leading-tight font-bold text-slate-900 mb-6">{{ $pageTitle }}</h1>
<div class="grid grid-cols-1 lg:grid-cols-[260px,1fr] gap-4 lg:gap-5"> <div class="grid grid-cols-1 lg:grid-cols-[260px,1fr] gap-4 lg:gap-5">
<aside class="space-y-4"> <aside class="space-y-4">
<section class="listing-filter-card p-4"> <section class="listing-filter-card p-4">
<div class="flex items-center justify-between gap-3 mb-3"> <div class="flex items-center justify-between gap-3 mb-3">
<h2 class="text-[26px] font-extrabold text-slate-900 leading-none">Kategoriler</h2> <h2 class="text-2xl font-bold text-slate-900 leading-none">Kategoriler</h2>
</div> </div>
<div class="space-y-1 max-h-[330px] overflow-y-auto pr-1"> <div class="space-y-1 max-h-[330px] overflow-y-auto pr-1">
@ -273,7 +273,7 @@
<div class="px-3.5 py-3"> <div class="px-3.5 py-3">
<a href="{{ route('listings.show', $listing) }}" class="block"> <a href="{{ route('listings.show', $listing) }}" class="block">
<p class="text-[29px] leading-none font-extrabold text-slate-900"> <p class="text-3xl leading-none font-bold text-slate-900">
@if(!is_null($priceValue) && $priceValue > 0) @if(!is_null($priceValue) && $priceValue > 0)
{{ number_format($priceValue, 0, ',', '.') }} {{ $listing->currency }} {{ number_format($priceValue, 0, ',', '.') }} {{ $listing->currency }}
@else @else

View File

@ -23,13 +23,13 @@
@endphp @endphp
<div class="max-w-[1320px] mx-auto px-4 py-7 lg:py-8"> <div class="max-w-[1320px] mx-auto px-4 py-7 lg:py-8">
<h1 class="text-[30px] leading-tight font-extrabold text-slate-900 mb-6">{{ $pageTitle }}</h1> <h1 class="text-3xl md:text-4xl leading-tight font-bold text-slate-900 mb-6">{{ $pageTitle }}</h1>
<div class="grid grid-cols-1 lg:grid-cols-[260px,1fr] gap-4 lg:gap-5"> <div class="grid grid-cols-1 lg:grid-cols-[260px,1fr] gap-4 lg:gap-5">
<aside class="space-y-4"> <aside class="space-y-4">
<section class="listing-filter-card p-4"> <section class="listing-filter-card p-4">
<div class="flex items-center justify-between gap-3 mb-3"> <div class="flex items-center justify-between gap-3 mb-3">
<h2 class="text-[26px] font-extrabold text-slate-900 leading-none">Kategoriler</h2> <h2 class="text-2xl font-bold text-slate-900 leading-none">Kategoriler</h2>
</div> </div>
<div class="space-y-1 max-h-[330px] overflow-y-auto pr-1"> <div class="space-y-1 max-h-[330px] overflow-y-auto pr-1">
@ -273,7 +273,7 @@
<div class="px-3.5 py-3"> <div class="px-3.5 py-3">
<a href="{{ route('listings.show', $listing) }}" class="block"> <a href="{{ route('listings.show', $listing) }}" class="block">
<p class="text-[29px] leading-none font-extrabold text-slate-900"> <p class="text-3xl leading-none font-bold text-slate-900">
@if(!is_null($priceValue) && $priceValue > 0) @if(!is_null($priceValue) && $priceValue > 0)
{{ number_format($priceValue, 0, ',', '.') }} {{ $listing->currency }} {{ number_format($priceValue, 0, ',', '.') }} {{ $listing->currency }}
@else @else

View File

@ -23,13 +23,13 @@
@endphp @endphp
<div class="max-w-[1320px] mx-auto px-4 py-7 lg:py-8"> <div class="max-w-[1320px] mx-auto px-4 py-7 lg:py-8">
<h1 class="text-[30px] leading-tight font-extrabold text-slate-900 mb-6">{{ $pageTitle }}</h1> <h1 class="text-3xl md:text-4xl leading-tight font-bold text-slate-900 mb-6">{{ $pageTitle }}</h1>
<div class="grid grid-cols-1 lg:grid-cols-[260px,1fr] gap-4 lg:gap-5"> <div class="grid grid-cols-1 lg:grid-cols-[260px,1fr] gap-4 lg:gap-5">
<aside class="space-y-4"> <aside class="space-y-4">
<section class="listing-filter-card p-4"> <section class="listing-filter-card p-4">
<div class="flex items-center justify-between gap-3 mb-3"> <div class="flex items-center justify-between gap-3 mb-3">
<h2 class="text-[26px] font-extrabold text-slate-900 leading-none">Kategoriler</h2> <h2 class="text-2xl font-bold text-slate-900 leading-none">Kategoriler</h2>
</div> </div>
<div class="space-y-1 max-h-[330px] overflow-y-auto pr-1"> <div class="space-y-1 max-h-[330px] overflow-y-auto pr-1">
@ -273,7 +273,7 @@
<div class="px-3.5 py-3"> <div class="px-3.5 py-3">
<a href="{{ route('listings.show', $listing) }}" class="block"> <a href="{{ route('listings.show', $listing) }}" class="block">
<p class="text-[29px] leading-none font-extrabold text-slate-900"> <p class="text-3xl leading-none font-bold text-slate-900">
@if(!is_null($priceValue) && $priceValue > 0) @if(!is_null($priceValue) && $priceValue > 0)
{{ number_format($priceValue, 0, ',', '.') }} {{ $listing->currency }} {{ number_format($priceValue, 0, ',', '.') }} {{ $listing->currency }}
@else @else

View File

@ -1,781 +0,0 @@
:root {
--oc-bg: #f5f5f7;
--oc-surface: #ffffff;
--oc-border: #d2d2d7;
--oc-text: #1d1d1f;
--oc-muted: #6e6e73;
--oc-primary: #0071e3;
--oc-primary-strong: #0066cc;
--oc-primary-soft: #e8f3ff;
--oc-primary-soft-border: #bfdcff;
--oc-chip: #f5f5f7;
}
html,
body {
min-height: 100%;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Helvetica Neue", Helvetica, Arial, sans-serif;
background: radial-gradient(circle at top right, #eef5ff 0%, var(--oc-bg) 30%);
color: var(--oc-text);
}
h1,
h2,
h3,
h4,
h5,
h6 {
letter-spacing: -0.01em;
}
.brand-logo {
position: relative;
width: 1.45rem;
height: 1.7rem;
display: inline-block;
border-radius: 60% 60% 55% 55% / 62% 62% 70% 70%;
background: var(--oc-text);
box-shadow: 0 5px 14px rgba(29, 29, 31, 0.18);
transform: translateY(1px);
}
.brand-logo::before {
content: "";
position: absolute;
top: -0.42rem;
right: 0.14rem;
width: 0.54rem;
height: 0.31rem;
border-radius: 100% 0;
background: var(--oc-text);
transform: rotate(-32deg);
}
.brand-logo::after {
content: "";
position: absolute;
top: 0.18rem;
left: 50%;
transform: translateX(-50%);
width: 0.16rem;
height: 0.2rem;
border-radius: 999px;
background: var(--oc-surface);
}
.brand-text {
font-size: 1.7rem;
font-weight: 600;
color: var(--oc-text);
letter-spacing: -0.03em;
}
.market-nav-surface {
background: rgba(251, 251, 253, 0.88);
backdrop-filter: saturate(180%) blur(18px);
border-bottom: 1px solid var(--oc-border);
}
.search-shell {
border: 1px solid var(--oc-border);
background: #ffffff;
border-radius: 999px;
}
.chip-btn {
border: 1px solid var(--oc-border);
background: var(--oc-chip);
border-radius: 999px;
}
.btn-primary {
background: linear-gradient(180deg, #0a84ff, var(--oc-primary));
color: #ffffff;
border-radius: 999px;
box-shadow: 0 6px 16px rgba(0, 113, 227, 0.24);
transition: background 0.2s ease, box-shadow 0.2s ease;
}
.btn-primary:hover {
background: linear-gradient(180deg, var(--oc-primary), var(--oc-primary-strong));
box-shadow: 0 8px 18px rgba(0, 113, 227, 0.3);
}
.header-utility {
width: 2.75rem;
height: 2.75rem;
border-radius: 999px;
border: 1px solid var(--oc-border);
background: #ffffff;
display: inline-flex;
align-items: center;
justify-content: center;
color: #4b5563;
transition: all 0.2s ease;
}
.header-utility:hover {
border-color: var(--oc-primary-soft-border);
color: var(--oc-primary);
}
.location-panel {
width: min(90vw, 360px);
}
.location-panel select {
border: 1px solid var(--oc-border);
border-radius: 0.75rem;
background: #f7f7f8;
color: #374151;
padding: 0.55rem 0.75rem;
font-size: 0.875rem;
}
summary::-webkit-details-marker {
display: none;
}
[dir="rtl"] {
text-align: right;
}
.listing-filter-card {
border: 1px solid var(--oc-border);
border-radius: 14px;
background: var(--oc-surface);
}
.listing-card {
border: 1px solid var(--oc-border);
border-radius: 12px;
overflow: hidden;
background: var(--oc-surface);
transition: box-shadow 0.2s ease, transform 0.2s ease;
}
.listing-card:hover {
box-shadow: 0 14px 28px rgba(29, 29, 31, 0.12);
transform: translateY(-2px);
}
.listing-title {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.lt-wrap {
max-width: 1320px;
margin: 0 auto;
padding: 24px 16px 46px;
}
.lt-breadcrumb {
display: flex;
flex-wrap: wrap;
gap: 8px;
font-size: 13px;
color: var(--oc-muted);
margin-bottom: 14px;
}
.lt-breadcrumb a {
color: #4b5563;
text-decoration: none;
}
.lt-breadcrumb span:last-child {
color: var(--oc-text);
font-weight: 700;
}
.lt-grid {
display: grid;
grid-template-columns: minmax(0, 1fr) 352px;
gap: 18px;
align-items: start;
}
.lt-card {
border: 1px solid var(--oc-border);
border-radius: 14px;
background: #f7f7f8;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05);
}
.lt-gallery-main {
position: relative;
border-radius: 10px;
background: #1f2937;
overflow: hidden;
min-height: 440px;
}
.lt-gallery-main img {
width: 100%;
height: 100%;
object-fit: cover;
min-height: 440px;
}
.lt-gallery-main-empty {
min-height: 440px;
display: grid;
place-items: center;
color: #cbd5e1;
font-size: 14px;
}
.lt-gallery-nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 44px;
height: 44px;
border: 0;
border-radius: 999px;
background: rgba(255, 255, 255, 0.92);
color: #111827;
display: grid;
place-items: center;
cursor: pointer;
}
.lt-gallery-nav[data-gallery-prev] {
left: 14px;
}
.lt-gallery-nav[data-gallery-next] {
right: 14px;
}
.lt-gallery-top {
position: absolute;
top: 12px;
left: 12px;
right: 12px;
display: flex;
justify-content: space-between;
align-items: center;
}
.lt-badge {
border-radius: 999px;
background: #ffd60a;
color: #111827;
font-size: 12px;
font-weight: 700;
padding: 6px 10px;
}
.lt-icon-btn {
width: 38px;
height: 38px;
border: 0;
border-radius: 999px;
background: rgba(17, 24, 39, 0.86);
color: #ffffff;
display: inline-flex;
align-items: center;
justify-content: center;
}
.lt-thumbs {
display: flex;
gap: 10px;
overflow-x: auto;
padding: 12px 0 2px;
}
.lt-thumb {
width: 86px;
min-width: 86px;
height: 64px;
border: 2px solid transparent;
border-radius: 10px;
overflow: hidden;
background: #d1d5db;
cursor: pointer;
}
.lt-thumb.is-active {
border-color: var(--oc-primary);
}
.lt-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
}
.lt-media-card {
padding: 14px;
}
.lt-detail-card {
margin-top: 14px;
padding: 18px 20px;
}
.lt-price-row {
display: flex;
flex-wrap: wrap;
gap: 12px;
justify-content: space-between;
align-items: flex-start;
}
.lt-price {
font-size: 46px;
line-height: 1;
font-weight: 900;
color: #0f172a;
}
.lt-title {
margin-top: 8px;
font-size: 21px;
font-weight: 700;
color: #111827;
}
.lt-meta {
text-align: right;
color: #4b5563;
font-size: 14px;
}
.lt-meta strong {
color: #111827;
font-weight: 700;
}
.lt-credit {
margin-top: 14px;
border: 1px solid #e3e7ee;
border-radius: 12px;
padding: 14px;
background: #fafafb;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.lt-credit h4 {
margin: 0;
font-size: 20px;
color: #0f172a;
}
.lt-credit p {
margin: 3px 0 0;
font-size: 14px;
color: #4b5563;
}
.lt-tag {
border-radius: 999px;
background: var(--oc-primary);
color: #ffffff;
font-size: 13px;
font-weight: 700;
padding: 7px 12px;
}
.lt-section-title {
margin: 18px 0 10px;
font-size: 30px;
font-weight: 900;
color: #111827;
}
.lt-features {
border-top: 1px solid #e2e8f0;
margin-top: 12px;
}
.lt-feature-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
border-top: 1px solid #e7ebf2;
padding: 12px 0;
}
.lt-feature-row:first-child {
border-top: 0;
}
.lt-f-item {
display: flex;
justify-content: space-between;
gap: 8px;
color: #334155;
font-size: 15px;
}
.lt-f-item strong {
color: #111827;
font-weight: 800;
text-align: right;
}
.lt-side-card {
position: sticky;
top: 96px;
padding: 16px;
}
.lt-seller-head {
display: flex;
align-items: center;
gap: 10px;
}
.lt-avatar {
width: 44px;
height: 44px;
border-radius: 999px;
background: #f3f4f6;
color: #111827;
display: grid;
place-items: center;
font-weight: 800;
}
.lt-seller-name {
margin: 0;
font-size: 31px;
font-weight: 800;
color: #111827;
line-height: 1.1;
}
.lt-seller-meta {
margin-top: 2px;
font-size: 13px;
color: #6b7280;
}
.lt-actions {
margin-top: 14px;
display: grid;
gap: 10px;
}
.lt-row-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.lt-btn {
height: 46px;
border-radius: 999px;
border: 1px solid var(--oc-primary-soft-border);
background: var(--oc-primary-soft);
color: var(--oc-primary);
font-size: 20px;
font-weight: 800;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
cursor: pointer;
}
.lt-btn:disabled {
opacity: 0.45;
cursor: not-allowed;
}
.lt-btn-main {
border: 0;
background: var(--oc-primary);
color: #ffffff;
width: 100%;
}
.lt-btn-soft {
border-color: #d9e9ff;
background: #eef5ff;
}
.lt-btn-outline {
border-color: var(--oc-border);
background: #ffffff;
color: #334155;
}
.lt-report {
margin-top: 16px;
height: 54px;
border: 1px solid #dce9fa;
border-radius: 999px;
background: #f7fbff;
color: var(--oc-primary);
font-size: 16px;
font-weight: 700;
display: grid;
place-items: center;
text-decoration: none;
}
.lt-policy {
margin-top: 16px;
text-align: center;
color: #6b7280;
font-size: 13px;
}
.lt-related {
margin-top: 26px;
}
.lt-related-head {
display: flex;
justify-content: space-between;
align-items: center;
}
.lt-related-title {
font-size: 30px;
font-weight: 900;
margin: 0;
}
.lt-scroll-wrap {
position: relative;
margin-top: 14px;
}
.lt-scroll-track {
display: flex;
gap: 12px;
overflow-x: auto;
scroll-behavior: smooth;
padding: 2px 2px 8px;
}
.lt-rel-card {
min-width: 232px;
width: 232px;
border: 1px solid var(--oc-border);
border-radius: 10px;
background: #f7f7f8;
overflow: hidden;
text-decoration: none;
color: inherit;
}
.lt-rel-photo {
height: 168px;
background: #d1d5db;
}
.lt-rel-photo img {
width: 100%;
height: 100%;
object-fit: cover;
}
.lt-rel-body {
padding: 10px;
}
.lt-rel-price {
font-size: 32px;
font-weight: 900;
color: #111827;
line-height: 1.1;
}
.lt-rel-title {
margin-top: 4px;
font-size: 20px;
font-weight: 700;
color: #111827;
line-height: 1.3;
min-height: 52px;
}
.lt-rel-city {
margin-top: 6px;
font-size: 13px;
color: #6b7280;
}
.lt-scroll-btn {
position: absolute;
top: 42%;
transform: translateY(-50%);
width: 44px;
height: 44px;
border: 0;
border-radius: 999px;
background: rgba(255, 255, 255, 0.92);
box-shadow: 0 1px 4px rgba(15, 23, 42, 0.18);
display: grid;
place-items: center;
cursor: pointer;
}
.lt-scroll-btn.prev {
left: -16px;
}
.lt-scroll-btn.next {
right: -16px;
}
.lt-pill-wrap {
margin-top: 20px;
}
.lt-pill-title {
margin: 0 0 10px;
font-size: 30px;
font-weight: 900;
}
.lt-pills {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.lt-pill {
border: 1px solid var(--oc-border);
background: #f4f5f7;
border-radius: 999px;
padding: 8px 14px;
color: #374151;
text-decoration: none;
font-size: 14px;
font-weight: 600;
}
.text-rose-500,
.text-rose-600,
.text-rose-700 {
color: var(--oc-primary) !important;
}
.bg-rose-50 {
background-color: var(--oc-primary-soft) !important;
}
.bg-rose-100 {
background-color: #dcecff !important;
}
.bg-rose-500 {
background-color: var(--oc-primary) !important;
}
.bg-rose-600 {
background-color: var(--oc-primary-strong) !important;
}
.border-rose-200,
.border-rose-300 {
border-color: var(--oc-primary-soft-border) !important;
}
.hover\:text-rose-500:hover,
.hover\:text-rose-600:hover,
.hover\:text-rose-700:hover {
color: var(--oc-primary) !important;
}
.hover\:bg-rose-50:hover {
background-color: var(--oc-primary-soft) !important;
}
.hover\:bg-rose-100:hover {
background-color: #dcecff !important;
}
.hover\:bg-rose-600:hover {
background-color: var(--oc-primary-strong) !important;
}
.focus\:ring-rose-200:focus {
--tw-ring-color: rgba(0, 113, 227, 0.24) !important;
}
.accent-rose-500 {
accent-color: var(--oc-primary) !important;
}
@media (max-width: 1080px) {
.lt-grid {
grid-template-columns: 1fr;
}
.lt-side-card {
position: static;
}
.lt-scroll-btn {
display: none;
}
.lt-price {
font-size: 39px;
}
.lt-seller-name,
.lt-section-title,
.lt-related-title,
.lt-pill-title {
font-size: 24px;
}
}
@media (max-width: 640px) {
.lt-wrap {
padding: 16px 10px 30px;
}
.lt-detail-card,
.lt-media-card,
.lt-side-card {
padding: 12px;
}
.lt-gallery-main,
.lt-gallery-main img,
.lt-gallery-main-empty {
min-height: 260px;
}
.lt-feature-row {
grid-template-columns: 1fr;
gap: 10px;
}
.lt-price-row {
flex-direction: column;
}
.lt-meta {
text-align: left;
}
.lt-rel-card {
min-width: 196px;
width: 196px;
}
.lt-rel-photo {
height: 140px;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<title>403 Forbidden</title> <title>403 Forbidden</title>
<script src="https://cdn.tailwindcss.com"></script> @vite(['resources/css/app.css', 'resources/js/app.js'])
</head> </head>
<body class="min-h-screen bg-gray-100 flex items-center justify-center p-6"> <body class="min-h-screen font-sans antialiased bg-gray-100 flex items-center justify-center p-6">
<div class="max-w-md w-full bg-white rounded-xl shadow p-6 text-center"> <div class="max-w-md w-full bg-white rounded-xl shadow p-6 text-center">
<h1 class="text-2xl font-bold text-gray-900">403</h1> <h1 class="text-2xl font-bold text-gray-900">403</h1>
<p class="mt-2 text-gray-700">Bu sayfaya erişim izniniz yok.</p> <p class="mt-2 text-gray-700">Bu sayfaya erişim izniniz yok.</p>

View File

@ -41,11 +41,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ $siteName }} @hasSection('title') - @yield('title') @endif</title> <title>{{ $siteName }} @hasSection('title') - @yield('title') @endif</title>
<script src="https://cdn.tailwindcss.com"></script> @vite(['resources/css/app.css', 'resources/js/app.js'])
<link rel="stylesheet" href="{{ asset('theme.css') }}">
@livewireStyles @livewireStyles
</head> </head>
<body class="min-h-screen"> <body class="min-h-screen font-sans antialiased">
<nav class="market-nav-surface sticky top-0 z-50"> <nav class="market-nav-surface sticky top-0 z-50">
<div class="max-w-[1320px] mx-auto px-4 py-4"> <div class="max-w-[1320px] mx-auto px-4 py-4">
<div class="flex items-center gap-3 md:gap-4"> <div class="flex items-center gap-3 md:gap-4">
@ -203,7 +202,7 @@
<div class="bg-rose-100 border border-rose-300 text-rose-700 px-4 py-3 rounded-xl text-sm">{{ session('error') }}</div> <div class="bg-rose-100 border border-rose-300 text-rose-700 px-4 py-3 rounded-xl text-sm">{{ session('error') }}</div>
</div> </div>
@endif @endif
<main>@yield('content')</main> <main class="site-main">@yield('content')</main>
<footer class="mt-14 bg-slate-100 text-slate-600 border-t border-slate-200"> <footer class="mt-14 bg-slate-100 text-slate-600 border-t border-slate-200">
<div class="max-w-[1320px] mx-auto px-4 py-12"> <div class="max-w-[1320px] mx-auto px-4 py-12">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8"> <div class="grid grid-cols-1 md:grid-cols-4 gap-8">

View File

@ -6,11 +6,6 @@
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title> <title>{{ config('app.name', 'Laravel') }}</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
<!-- Scripts --> <!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js']) @vite(['resources/css/app.css', 'resources/js/app.js'])
</head> </head>

View File

@ -7,30 +7,30 @@
<div class="grid grid-cols-1 lg:grid-cols-[220px,1fr] gap-4"> <div class="grid grid-cols-1 lg:grid-cols-[220px,1fr] gap-4">
@include('panel.partials.sidebar', ['activeMenu' => 'listings']) @include('panel.partials.sidebar', ['activeMenu' => 'listings'])
<section class="bg-white border border-slate-200 rounded-xl p-4 sm:p-6"> <section class="panel-surface">
<div class="flex flex-col xl:flex-row xl:items-center gap-3 xl:gap-4 mb-5"> <div class="panel-toolbar">
<form method="GET" action="{{ route('panel.listings.index') }}" class="relative flex-1 max-w-xl"> <form method="GET" action="{{ route('panel.listings.index') }}" class="panel-search">
<svg class="w-6 h-6 text-slate-400 absolute left-4 top-1/2 -translate-y-1/2" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="panel-search-icon w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M21 21l-4.35-4.35m1.6-5.05a7.25 7.25 0 11-14.5 0 7.25 7.25 0 0114.5 0z"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M21 21l-4.35-4.35m1.6-5.05a7.25 7.25 0 11-14.5 0 7.25 7.25 0 0114.5 0z"/>
</svg> </svg>
<input type="text" name="search" value="{{ $search }}" placeholder="İlan başlığına göre ara" class="w-full h-14 rounded-2xl border border-slate-300 pl-14 pr-4 text-lg font-semibold text-slate-700 placeholder:text-slate-400 focus:outline-none focus:ring-2 focus:ring-rose-200"> <input type="text" name="search" value="{{ $search }}" placeholder="İlan başlığına göre ara" class="panel-search-input focus:outline-none focus:ring-2 focus:ring-rose-200">
<input type="hidden" name="status" value="{{ $status }}"> <input type="hidden" name="status" value="{{ $status }}">
</form> </form>
<div class="flex flex-wrap items-center gap-2"> <div class="panel-filter-tabs">
<a href="{{ route('panel.listings.index', ['search' => $search, 'status' => 'all']) }}" class="inline-flex items-center h-12 px-6 rounded-full border text-xl font-semibold {{ $status === 'all' ? 'border-rose-500 text-rose-500 bg-rose-50' : 'border-slate-300 text-slate-700 hover:bg-slate-100' }}"> <a href="{{ route('panel.listings.index', ['search' => $search, 'status' => 'all']) }}" class="panel-filter-tab {{ $status === 'all' ? 'is-active' : '' }}">
Tüm İlanlar ({{ $counts['all'] }}) Tüm İlanlar ({{ $counts['all'] }})
</a> </a>
<a href="{{ route('panel.listings.index', ['search' => $search, 'status' => 'sold']) }}" class="inline-flex items-center h-12 px-6 rounded-full border text-xl font-semibold {{ $status === 'sold' ? 'border-rose-500 text-rose-500 bg-rose-50' : 'border-slate-300 text-slate-700 hover:bg-slate-100' }}"> <a href="{{ route('panel.listings.index', ['search' => $search, 'status' => 'sold']) }}" class="panel-filter-tab {{ $status === 'sold' ? 'is-active' : '' }}">
Satıldı ({{ $counts['sold'] }}) Satıldı ({{ $counts['sold'] }})
</a> </a>
<a href="{{ route('panel.listings.index', ['search' => $search, 'status' => 'expired']) }}" class="inline-flex items-center h-12 px-6 rounded-full border text-xl font-semibold {{ $status === 'expired' ? 'border-rose-500 text-rose-500 bg-rose-50' : 'border-slate-300 text-slate-700 hover:bg-slate-100' }}"> <a href="{{ route('panel.listings.index', ['search' => $search, 'status' => 'expired']) }}" class="panel-filter-tab {{ $status === 'expired' ? 'is-active' : '' }}">
Süresi Dolmuş ({{ $counts['expired'] }}) Süresi Dolmuş ({{ $counts['expired'] }})
</a> </a>
</div> </div>
</div> </div>
<div class="space-y-4"> <div class="space-y-4 panel-list-section">
@forelse($listings as $listing) @forelse($listings as $listing)
@php @php
$listingImage = $listing->getFirstMediaUrl('listing-images'); $listingImage = $listing->getFirstMediaUrl('listing-images');
@ -53,9 +53,9 @@
$viewCount = (int) ($listing->view_count ?? 0); $viewCount = (int) ($listing->view_count ?? 0);
$expiresAt = $listing->expires_at?->format('d/m/Y'); $expiresAt = $listing->expires_at?->format('d/m/Y');
@endphp @endphp
<article class="rounded-2xl border border-slate-300 bg-slate-50 p-4 sm:p-5"> <article class="panel-list-card">
<div class="flex flex-col xl:flex-row gap-4 xl:items-stretch"> <div class="panel-list-card-body">
<div class="w-full xl:w-[260px] h-[180px] bg-slate-200 rounded-xl overflow-hidden shrink-0"> <div class="panel-list-media bg-slate-200">
@if($listingImage) @if($listingImage)
<img src="{{ $listingImage }}" alt="{{ $listing->title }}" class="w-full h-full object-cover"> <img src="{{ $listingImage }}" alt="{{ $listing->title }}" class="w-full h-full object-cover">
@else @else
@ -63,17 +63,17 @@
@endif @endif
</div> </div>
<div class="flex-1 min-w-0 flex flex-col"> <div class="panel-list-main">
<div class="flex flex-wrap items-center gap-3"> <div class="panel-list-summary">
<p class="text-4xl font-black text-slate-900">{{ $priceLabel }}</p> <p class="panel-list-price text-slate-900">{{ $priceLabel }}</p>
<span class="inline-flex items-center h-10 px-4 rounded-full text-lg font-bold {{ $statusBadgeClass }}">{{ $statusLabel }}</span> <span class="panel-status-badge {{ $statusBadgeClass }}">{{ $statusLabel }}</span>
</div> </div>
<h2 class="text-2xl font-semibold text-slate-800 mt-3 leading-tight break-words">{{ $listing->title }}</h2> <h2 class="panel-list-title text-slate-800">{{ $listing->title }}</h2>
<div class="mt-auto pt-5 flex flex-wrap items-center gap-2"> <div class="panel-list-actions">
<form method="POST" action="{{ route('panel.listings.destroy', $listing) }}"> <form method="POST" action="{{ route('panel.listings.destroy', $listing) }}">
@csrf @csrf
<button type="submit" class="h-12 px-6 rounded-full border-2 border-rose-500 text-rose-500 text-2xl font-bold hover:bg-rose-50 transition"> <button type="submit" class="panel-action-btn panel-action-btn-secondary">
İlanı Kaldır İlanı Kaldır
</button> </button>
</form> </form>
@ -81,7 +81,7 @@
@if((string) $listing->status !== 'sold') @if((string) $listing->status !== 'sold')
<form method="POST" action="{{ route('panel.listings.mark-sold', $listing) }}"> <form method="POST" action="{{ route('panel.listings.mark-sold', $listing) }}">
@csrf @csrf
<button type="submit" class="h-12 px-6 rounded-full bg-rose-500 text-white text-2xl font-bold hover:bg-rose-600 transition"> <button type="submit" class="panel-action-btn panel-action-btn-primary">
Satıldı İşaretle Satıldı İşaretle
</button> </button>
</form> </form>
@ -90,7 +90,7 @@
@if((string) $listing->status === 'expired') @if((string) $listing->status === 'expired')
<form method="POST" action="{{ route('panel.listings.republish', $listing) }}"> <form method="POST" action="{{ route('panel.listings.republish', $listing) }}">
@csrf @csrf
<button type="submit" class="h-12 px-6 rounded-full border-2 border-rose-500 text-rose-500 text-2xl font-bold hover:bg-rose-50 transition"> <button type="submit" class="panel-action-btn panel-action-btn-secondary">
Yeniden Yayınla Yeniden Yayınla
</button> </button>
</form> </form>
@ -98,19 +98,19 @@
</div> </div>
</div> </div>
<div class="xl:w-[260px] flex xl:flex-col items-start xl:items-end justify-between gap-3"> <div class="panel-list-aside">
<div class="flex items-center gap-3"> <div class="panel-stats">
<div class="h-12 min-w-24 px-4 rounded-2xl bg-slate-200 text-slate-500 text-xl font-bold inline-flex items-center justify-center gap-2"> <div class="panel-stat-box">
<span>👁</span> <span>👁</span>
<span>{{ $viewCount }}</span> <span>{{ $viewCount }}</span>
</div> </div>
<div class="h-12 min-w-24 px-4 rounded-2xl bg-slate-200 text-slate-500 text-xl font-bold inline-flex items-center justify-center gap-2"> <div class="panel-stat-box">
<span></span> <span></span>
<span>{{ $favoriteCount }}</span> <span>{{ $favoriteCount }}</span>
</div> </div>
</div> </div>
<p class="text-lg text-slate-500 text-left xl:text-right"> <p class="panel-list-dates">
Yayın Tarihi & Bitiş Tarihi: Yayın Tarihi & Bitiş Tarihi:
<strong class="text-slate-700"> <strong class="text-slate-700">
{{ $listing->created_at?->format('d/m/Y') ?? '-' }} - {{ $expiresAt ?: '-' }} {{ $listing->created_at?->format('d/m/Y') ?? '-' }} - {{ $expiresAt ?: '-' }}
@ -120,13 +120,13 @@
</div> </div>
@if((string) $listing->status === 'expired') @if((string) $listing->status === 'expired')
<div class="mt-4 rounded-xl bg-sky-100 px-4 py-3 text-base text-slate-700"> <div class="panel-inline-note">
<strong>Bu ilanın süresi doldu.</strong> Eğer sattıysan, lütfen satıldı olarak işaretle. <strong>Bu ilanın süresi doldu.</strong> Eğer sattıysan, lütfen satıldı olarak işaretle.
</div> </div>
@endif @endif
</article> </article>
@empty @empty
<div class="rounded-xl border border-dashed border-slate-300 py-16 text-center text-slate-500"> <div class="panel-empty-state">
Bu filtreye uygun ilan bulunamadı. Bu filtreye uygun ilan bulunamadı.
</div> </div>
@endforelse @endforelse

View File

@ -4,6 +4,9 @@ import forms from '@tailwindcss/forms';
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
export default { export default {
content: [ content: [
'./app/**/*.php',
'./Modules/**/*.php',
'./Modules/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
'./storage/framework/views/*.php', './storage/framework/views/*.php',
'./resources/views/**/*.blade.php', './resources/views/**/*.blade.php',
@ -12,7 +15,28 @@ export default {
theme: { theme: {
extend: { extend: {
fontFamily: { fontFamily: {
sans: ['Figtree', ...defaultTheme.fontFamily.sans], sans: [
'-apple-system',
'BlinkMacSystemFont',
'SF Pro Text',
'SF Pro Display',
'Helvetica Neue',
'Helvetica',
'Arial',
...defaultTheme.fontFamily.sans,
],
},
fontSize: {
xs: ['0.75rem', { lineHeight: '1rem' }],
sm: ['0.875rem', { lineHeight: '1.25rem' }],
base: ['1rem', { lineHeight: '1.55rem' }],
lg: ['1.0625rem', { lineHeight: '1.6rem' }],
xl: ['1.125rem', { lineHeight: '1.65rem' }],
'2xl': ['1.35rem', { lineHeight: '1.4' }],
'3xl': ['1.65rem', { lineHeight: '1.2' }],
'4xl': ['1.95rem', { lineHeight: '1.1' }],
'5xl': ['2.45rem', { lineHeight: '1.05' }],
'6xl': ['3.1rem', { lineHeight: '1' }],
}, },
}, },
}, },