diff --git a/.gitignore b/.gitignore index f862d9be3..ccba7839a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ Thumbs.db composer.lock .codex/config.toml /public/vendor/ +package-lock.json diff --git a/Modules/Category/Database/Seeders/CategorySeeder.php b/Modules/Category/Database/Seeders/CategorySeeder.php index c2471eb18..f81af9e90 100644 --- a/Modules/Category/Database/Seeders/CategorySeeder.php +++ b/Modules/Category/Database/Seeders/CategorySeeder.php @@ -9,25 +9,25 @@ class CategorySeeder extends Seeder public function run(): void { $categories = [ - ['name' => 'Electronics', 'slug' => 'electronics', 'icon' => 'laptop', 'children' => ['Phones', 'Computers', 'Tablets', 'TVs']], - ['name' => 'Vehicles', 'slug' => 'vehicles', 'icon' => 'car', 'children' => ['Cars', 'Motorcycles', 'Trucks', 'Boats']], - ['name' => 'Real Estate', 'slug' => 'real-estate', 'icon' => 'home', 'children' => ['For Sale', 'For Rent', 'Commercial']], - ['name' => 'Fashion', 'slug' => 'fashion', 'icon' => 'shirt', 'children' => ['Men', 'Women', 'Kids', 'Shoes']], - ['name' => 'Home & Garden', 'slug' => 'home-garden', 'icon' => 'sofa', 'children' => ['Furniture', 'Garden', 'Appliances']], - ['name' => 'Sports', 'slug' => 'sports', 'icon' => 'football', 'children' => ['Outdoor', 'Fitness', 'Team Sports']], - ['name' => 'Jobs', 'slug' => 'jobs', 'icon' => 'briefcase', 'children' => ['Full Time', 'Part Time', 'Freelance']], - ['name' => 'Services', 'slug' => 'services', 'icon' => 'wrench', 'children' => ['Cleaning', 'Repair', 'Education']], + ['name' => 'Electronics', 'slug' => 'electronics', 'icon' => 'img/category/electronics.png', 'children' => ['Phones', 'Computers', 'Tablets', 'TVs']], + ['name' => 'Vehicles', 'slug' => 'vehicles', 'icon' => 'img/category/car.png', 'children' => ['Cars', 'Motorcycles', 'Trucks', 'Boats']], + ['name' => 'Real Estate', 'slug' => 'real-estate', 'icon' => 'img/category/home_garden.png', 'children' => ['For Sale', 'For Rent', 'Commercial']], + ['name' => 'Fashion', 'slug' => 'fashion', 'icon' => 'img/category/phone.png', 'children' => ['Men', 'Women', 'Kids', 'Shoes']], + ['name' => 'Home & Garden', 'slug' => 'home-garden', 'icon' => 'img/category/home_tools.png', 'children' => ['Furniture', 'Garden', 'Appliances']], + ['name' => 'Sports', 'slug' => 'sports', 'icon' => 'img/category/sports.png', 'children' => ['Outdoor', 'Fitness', 'Team Sports']], + ['name' => 'Jobs', 'slug' => 'jobs', 'icon' => 'img/category/education.png', 'children' => ['Full Time', 'Part Time', 'Freelance']], + ['name' => 'Services', 'slug' => 'services', 'icon' => 'img/category/home_tools.png', 'children' => ['Cleaning', 'Repair', 'Education']], ]; foreach ($categories as $index => $data) { - $parent = Category::firstOrCreate( + $parent = Category::updateOrCreate( ['slug' => $data['slug']], ['name' => $data['name'], 'slug' => $data['slug'], 'icon' => $data['icon'], 'level' => 0, 'sort_order' => $index, 'is_active' => true] ); foreach ($data['children'] as $i => $childName) { $childSlug = $data['slug'] . '-' . \Illuminate\Support\Str::slug($childName); - Category::firstOrCreate( + Category::updateOrCreate( ['slug' => $childSlug], ['name' => $childName, 'slug' => $childSlug, 'parent_id' => $parent->id, 'level' => 1, 'sort_order' => $i, 'is_active' => true] ); diff --git a/Modules/Category/Models/Category.php b/Modules/Category/Models/Category.php index 24d3e9337..f2725131c 100644 --- a/Modules/Category/Models/Category.php +++ b/Modules/Category/Models/Category.php @@ -14,6 +14,23 @@ class Category extends Model { use LogsActivity; + private const ICON_PATHS = [ + 'car' => 'img/category/car.png', + 'education' => 'img/category/education.png', + 'electronics' => 'img/category/electronics.png', + 'football' => 'img/category/sports.png', + 'home' => 'img/category/home_garden.png', + 'home-garden' => 'img/category/home_garden.png', + 'home_garden' => 'img/category/home_garden.png', + 'home-tools' => 'img/category/home_tools.png', + 'home_tools' => 'img/category/home_tools.png', + 'laptop' => 'img/category/laptop.png', + 'mobile' => 'img/category/phone.png', + 'pet' => 'img/category/pet.png', + 'phone' => 'img/category/phone.png', + 'sports' => 'img/category/sports.png', + ]; + protected $fillable = ['name', 'slug', 'description', 'icon', 'parent_id', 'level', 'sort_order', 'is_active']; protected $casts = ['is_active' => 'boolean']; @@ -219,6 +236,32 @@ class Category extends Model return $this->hasMany(\Modules\Listing\Models\Listing::class)->where('status', 'active'); } + public function resolvedIconPath(): ?string + { + $icon = trim((string) $this->icon); + + if ($icon === '') { + return null; + } + + if (isset(self::ICON_PATHS[$icon])) { + return self::ICON_PATHS[$icon]; + } + + if (preg_match('/\.(png|jpg|jpeg|webp|svg)$/i', $icon) === 1) { + return ltrim($icon, '/'); + } + + return null; + } + + public function iconUrl(): ?string + { + $path = $this->resolvedIconPath(); + + return $path ? asset($path) : null; + } + private static function buildListingDirectoryTree(Collection $categories, Collection $activeListingCounts, ?int $parentId = null): Collection { return $categories diff --git a/Modules/Category/database/seeders/CategorySeeder.php b/Modules/Category/database/seeders/CategorySeeder.php deleted file mode 100644 index c2471eb18..000000000 --- a/Modules/Category/database/seeders/CategorySeeder.php +++ /dev/null @@ -1,37 +0,0 @@ - 'Electronics', 'slug' => 'electronics', 'icon' => 'laptop', 'children' => ['Phones', 'Computers', 'Tablets', 'TVs']], - ['name' => 'Vehicles', 'slug' => 'vehicles', 'icon' => 'car', 'children' => ['Cars', 'Motorcycles', 'Trucks', 'Boats']], - ['name' => 'Real Estate', 'slug' => 'real-estate', 'icon' => 'home', 'children' => ['For Sale', 'For Rent', 'Commercial']], - ['name' => 'Fashion', 'slug' => 'fashion', 'icon' => 'shirt', 'children' => ['Men', 'Women', 'Kids', 'Shoes']], - ['name' => 'Home & Garden', 'slug' => 'home-garden', 'icon' => 'sofa', 'children' => ['Furniture', 'Garden', 'Appliances']], - ['name' => 'Sports', 'slug' => 'sports', 'icon' => 'football', 'children' => ['Outdoor', 'Fitness', 'Team Sports']], - ['name' => 'Jobs', 'slug' => 'jobs', 'icon' => 'briefcase', 'children' => ['Full Time', 'Part Time', 'Freelance']], - ['name' => 'Services', 'slug' => 'services', 'icon' => 'wrench', 'children' => ['Cleaning', 'Repair', 'Education']], - ]; - - foreach ($categories as $index => $data) { - $parent = Category::firstOrCreate( - ['slug' => $data['slug']], - ['name' => $data['name'], 'slug' => $data['slug'], 'icon' => $data['icon'], 'level' => 0, 'sort_order' => $index, 'is_active' => true] - ); - - foreach ($data['children'] as $i => $childName) { - $childSlug = $data['slug'] . '-' . \Illuminate\Support\Str::slug($childName); - Category::firstOrCreate( - ['slug' => $childSlug], - ['name' => $childName, 'slug' => $childSlug, 'parent_id' => $parent->id, 'level' => 1, 'sort_order' => $i, 'is_active' => true] - ); - } - } - } -} diff --git a/Modules/Category/resources/views/partials/index-content.blade.php b/Modules/Category/resources/views/partials/index-content.blade.php index d69e1988a..97d428b77 100644 --- a/Modules/Category/resources/views/partials/index-content.blade.php +++ b/Modules/Category/resources/views/partials/index-content.blade.php @@ -21,17 +21,7 @@ ->filter() ->implode(' ยท '); $extraChildCount = max($category->children->count() - 3, 0); - $icon = match (trim((string) ($category->icon ?? ''))) { - 'laptop' => 'heroicon-o-computer-desktop', - 'car' => 'heroicon-o-truck', - 'home' => 'heroicon-o-home', - 'shirt' => 'heroicon-o-shopping-bag', - 'sofa' => 'heroicon-o-home-modern', - 'football' => 'heroicon-o-trophy', - 'briefcase' => 'heroicon-o-briefcase', - 'wrench' => 'heroicon-o-wrench-screwdriver', - default => null, - }; + $iconUrl = $category->iconUrl(); $iconLabel = strtoupper(\Illuminate\Support\Str::substr($category->name, 0, 1)); @endphp
- - @if($icon) - + + @if($iconUrl) + {{ $category->name }} @else - {{ $iconLabel }} + {{ $iconLabel }} @endif diff --git a/app/Livewire/PanelQuickListingForm.php b/app/Livewire/PanelQuickListingForm.php index a545e9fbb..ad7447ed1 100644 --- a/app/Livewire/PanelQuickListingForm.php +++ b/app/Livewire/PanelQuickListingForm.php @@ -7,6 +7,7 @@ use Illuminate\Support\Collection; use Illuminate\Support\Facades\Route; use Illuminate\Support\Str; use Illuminate\Validation\Rule; +use Illuminate\Validation\ValidationException; use Livewire\Component; use Livewire\Features\SupportFileUploads\TemporaryUploadedFile; use Livewire\Features\SupportFileUploads\WithFileUploads; @@ -27,6 +28,7 @@ class PanelQuickListingForm extends Component use WithFileUploads; private const TOTAL_STEPS = 5; + private const DRAFT_SESSION_KEY = 'panel_quick_listing_draft'; public array $photos = []; public array $videos = []; @@ -54,12 +56,14 @@ class PanelQuickListingForm extends Component public ?int $selectedCountryId = null; public ?int $selectedCityId = null; public bool $isPublishing = false; + public bool $shouldPersistDraft = true; public function mount(): void { $this->loadCategories(); $this->loadLocations(); $this->hydrateLocationDefaultsFromProfile(); + $this->restoreDraft(); } public function render() @@ -67,6 +71,15 @@ class PanelQuickListingForm extends Component return view('panel.quick-create'); } + public function dehydrate(): void + { + if (! $this->shouldPersistDraft) { + return; + } + + $this->persistDraft(); + } + public function updatedPhotos(): void { $this->validatePhotos(); @@ -198,14 +211,18 @@ class PanelQuickListingForm extends Component $this->isPublishing = true; - $this->validatePhotos(); - $this->validateVideos(); - $this->validateCategoryStep(); - $this->validateDetailsStep(); - $this->validateCustomFieldsStep(); - try { + $this->validatePhotos(); + $this->validateVideos(); + $this->validateCategoryStep(); + $this->validateDetailsStep(); + $this->validateCustomFieldsStep(); + $listing = $this->createListing(); + } catch (ValidationException $exception) { + $this->isPublishing = false; + + throw $exception; } catch (Throwable $exception) { report($exception); $this->isPublishing = false; @@ -216,9 +233,10 @@ class PanelQuickListingForm extends Component $this->isPublishing = false; session()->flash('success', 'Your listing has been created successfully.'); + $this->clearDraft(); if (Route::has('panel.listings.edit')) { - $this->redirect(route('panel.listings.edit', $listing), navigate: true); + $this->redirectRoute('panel.listings.edit', ['listing' => $listing->getKey()]); return; } @@ -754,6 +772,69 @@ class PanelQuickListingForm extends Component return (string) config('media_storage.local_disk', MediaStorage::diskFromDriver(MediaStorage::DRIVER_LOCAL)); } + private function restoreDraft(): void + { + $draft = session()->get($this->draftSessionKey(), []); + + if (! is_array($draft) || $draft === []) { + return; + } + + $this->currentStep = max(1, min(self::TOTAL_STEPS, (int) ($draft['currentStep'] ?? 1))); + $this->categorySearch = (string) ($draft['categorySearch'] ?? ''); + $this->selectedCategoryId = isset($draft['selectedCategoryId']) ? (int) $draft['selectedCategoryId'] : null; + $this->activeParentCategoryId = isset($draft['activeParentCategoryId']) ? (int) $draft['activeParentCategoryId'] : null; + $this->detectedCategoryId = isset($draft['detectedCategoryId']) ? (int) $draft['detectedCategoryId'] : null; + $this->detectedConfidence = isset($draft['detectedConfidence']) ? (float) $draft['detectedConfidence'] : null; + $this->detectedReason = isset($draft['detectedReason']) ? (string) $draft['detectedReason'] : null; + $this->detectedError = isset($draft['detectedError']) ? (string) $draft['detectedError'] : null; + $this->detectedAlternatives = collect($draft['detectedAlternatives'] ?? [])->filter(fn ($id) => is_numeric($id))->map(fn ($id) => (int) $id)->values()->all(); + $this->listingTitle = (string) ($draft['listingTitle'] ?? ''); + $this->price = (string) ($draft['price'] ?? ''); + $this->description = (string) ($draft['description'] ?? ''); + $this->selectedCountryId = isset($draft['selectedCountryId']) ? (int) $draft['selectedCountryId'] : $this->selectedCountryId; + $this->selectedCityId = isset($draft['selectedCityId']) ? (int) $draft['selectedCityId'] : null; + $this->customFieldValues = is_array($draft['customFieldValues'] ?? null) ? $draft['customFieldValues'] : []; + + if ($this->selectedCategoryId) { + $this->loadListingCustomFields(); + } + } + + private function persistDraft(): void + { + session()->put($this->draftSessionKey(), [ + 'currentStep' => $this->currentStep, + 'categorySearch' => $this->categorySearch, + 'selectedCategoryId' => $this->selectedCategoryId, + 'activeParentCategoryId' => $this->activeParentCategoryId, + 'detectedCategoryId' => $this->detectedCategoryId, + 'detectedConfidence' => $this->detectedConfidence, + 'detectedReason' => $this->detectedReason, + 'detectedError' => $this->detectedError, + 'detectedAlternatives' => $this->detectedAlternatives, + 'listingTitle' => $this->listingTitle, + 'price' => $this->price, + 'description' => $this->description, + 'selectedCountryId' => $this->selectedCountryId, + 'selectedCityId' => $this->selectedCityId, + 'customFieldValues' => $this->customFieldValues, + ]); + } + + private function clearDraft(): void + { + $this->shouldPersistDraft = false; + session()->forget($this->draftSessionKey()); + } + + private function draftSessionKey(): string + { + $userId = auth()->id() ?: 'guest'; + + return self::DRAFT_SESSION_KEY.'.'.$userId; + } + private function categoryPathParts(int $categoryId): array { $byId = collect($this->categories)->keyBy('id'); diff --git a/app/Support/RequestAppData.php b/app/Support/RequestAppData.php index e0bfedc8c..371aedf51 100644 --- a/app/Support/RequestAppData.php +++ b/app/Support/RequestAppData.php @@ -201,10 +201,11 @@ final class RequestAppData ->orderBy('sort_order') ->orderBy('name') ->limit(8) - ->get(['id', 'name']) + ->get(['id', 'name', 'icon']) ->map(fn (Category $category): array => [ 'id' => (int) $category->id, 'name' => (string) $category->name, + 'icon_url' => $category->iconUrl(), ]) ->values() ->all(); diff --git a/package.json b/package.json index 2ea7e1db4..6218e1029 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "postcss": "^8.4.31", "tailwindcss": "^3.1.0", "vite": "^7.0.7" + }, + "dependencies": { + "animejs": "^4.3.6" } } diff --git a/public/img/category/car.png b/public/img/category/car.png new file mode 100644 index 000000000..c03eb2e83 Binary files /dev/null and b/public/img/category/car.png differ diff --git a/public/img/category/education.png b/public/img/category/education.png new file mode 100644 index 000000000..1ab3184e9 Binary files /dev/null and b/public/img/category/education.png differ diff --git a/public/img/category/electronics.png b/public/img/category/electronics.png new file mode 100644 index 000000000..65482ec32 Binary files /dev/null and b/public/img/category/electronics.png differ diff --git a/public/img/category/home_garden.png b/public/img/category/home_garden.png new file mode 100644 index 000000000..f4237303e Binary files /dev/null and b/public/img/category/home_garden.png differ diff --git a/public/img/category/home_tools.png b/public/img/category/home_tools.png new file mode 100644 index 000000000..9404260da Binary files /dev/null and b/public/img/category/home_tools.png differ diff --git a/public/img/category/laptop.png b/public/img/category/laptop.png new file mode 100644 index 000000000..7c8e0089f Binary files /dev/null and b/public/img/category/laptop.png differ diff --git a/public/img/category/pet.png b/public/img/category/pet.png new file mode 100644 index 000000000..2aa1e55c3 Binary files /dev/null and b/public/img/category/pet.png differ diff --git a/public/img/category/phone.png b/public/img/category/phone.png new file mode 100644 index 000000000..ccf32b651 Binary files /dev/null and b/public/img/category/phone.png differ diff --git a/public/img/category/sports.png b/public/img/category/sports.png new file mode 100644 index 000000000..255a94fde Binary files /dev/null and b/public/img/category/sports.png differ diff --git a/resources/css/app.css b/resources/css/app.css index 954815e5a..d7ccdf609 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -86,12 +86,14 @@ h6 { background: rgba(251, 251, 253, 0.88); backdrop-filter: saturate(180%) blur(18px); border-bottom: 1px solid var(--oc-border); + overflow-x: clip; } .oc-nav-wrap { max-width: 1320px; margin: 0 auto; padding: 10px 16px 12px; + overflow-x: clip; } .oc-nav-main { @@ -454,6 +456,7 @@ h6 { .oc-category-link { display: inline-flex; align-items: center; + gap: 10px; min-height: 46px; padding: 0 18px; border-radius: 999px; @@ -464,6 +467,21 @@ h6 { transition: background 0.2s ease, color 0.2s ease; } +.oc-category-link-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + flex-shrink: 0; +} + +.oc-category-link-icon img { + width: 100%; + height: 100%; + object-fit: contain; +} + .oc-category-link:hover, .oc-category-pill:hover, .oc-pill:hover { diff --git a/resources/js/app.js b/resources/js/app.js index e59d6a0ad..7ffb99beb 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,176 @@ import './bootstrap'; +import { animate, createTimeline, stagger } from 'animejs'; + +const prefersReducedMotion = () => window.matchMedia('(prefers-reduced-motion: reduce)').matches; + +const onReady = (callback) => { + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', callback, { once: true }); + return; + } + + callback(); +}; + +const animateHeader = () => { + const nav = document.querySelector('[data-anim-nav]'); + const categoryRow = document.querySelector('[data-anim-header-row]'); + + if (nav) { + animate(nav, { + opacity: [0, 1], + translateY: [-18, 0], + duration: 700, + ease: 'outExpo', + }); + } + + if (categoryRow) { + animate(categoryRow.querySelectorAll('.oc-category-pill, .oc-category-link'), { + opacity: [0, 1], + translateY: [-10, 0], + delay: stagger(45, { start: 140 }), + duration: 520, + ease: 'outQuad', + }); + } +}; + +const animateHomeHero = () => { + const hero = document.querySelector('[data-home-hero]'); + + if (!hero) { + return; + } + + const copy = hero.querySelector('[data-home-hero-copy]'); + const visual = hero.querySelector('[data-home-hero-visual]'); + const timeline = createTimeline({ + defaults: { + duration: 720, + ease: 'outExpo', + }, + }); + + if (copy) { + timeline.add(copy.querySelectorAll('[data-home-slide] > *'), { + opacity: [0, 1], + translateY: [28, 0], + delay: stagger(80), + }); + } + + if (visual) { + timeline.add(visual, { + opacity: [0, 1], + translateX: [36, 0], + scale: [0.96, 1], + }, '<+=120'); + + animate(visual, { + translateY: [ + { to: -8, duration: 2800, ease: 'inOutSine' }, + { to: 0, duration: 2800, ease: 'inOutSine' }, + ], + loop: true, + alternate: true, + }); + } +}; + +const animateOnView = (selector, itemSelector, options = {}) => { + const sections = document.querySelectorAll(selector); + + if (!sections.length) { + return; + } + + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) { + return; + } + + const section = entry.target; + const items = itemSelector ? section.querySelectorAll(itemSelector) : [section]; + + animate(items, { + opacity: [0, 1], + translateY: [24, 0], + delay: stagger(options.stagger ?? 70), + duration: options.duration ?? 650, + ease: options.ease ?? 'outExpo', + }); + + observer.unobserve(section); + }); + }, { + threshold: 0.18, + rootMargin: '0px 0px -8% 0px', + }); + + sections.forEach((section) => observer.observe(section)); +}; + +const bindHoverLift = (selector, distance = 6) => { + document.querySelectorAll(selector).forEach((element) => { + element.addEventListener('mouseenter', () => { + animate(element, { + translateY: -distance, + scale: 1.015, + duration: 260, + ease: 'outQuad', + }); + }); + + element.addEventListener('mouseleave', () => { + animate(element, { + translateY: 0, + scale: 1, + duration: 320, + ease: 'outExpo', + }); + }); + }); +}; + +const animateFooter = () => { + const footer = document.querySelector('[data-anim-footer]'); + + if (!footer) { + return; + } + + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) { + return; + } + + animate(footer.querySelectorAll('[data-anim-footer-item]'), { + opacity: [0, 1], + translateY: [26, 0], + delay: stagger(90), + duration: 620, + ease: 'outExpo', + }); + + observer.disconnect(); + }); + }, { threshold: 0.2 }); + + observer.observe(footer); +}; + +onReady(() => { + if (prefersReducedMotion()) { + return; + } + + animateHeader(); + animateHomeHero(); + animateOnView('[data-home-section]', '[data-home-category-card], [data-home-listing-card], h2, a, article, section > div'); + animateFooter(); + bindHoverLift('[data-home-category-card]', 5); + bindHoverLift('[data-home-listing-card]', 4); +}); diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 8bb2fc8d0..3897664c2 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -58,26 +58,6 @@ ]); } - $trendSkins = [ - ['gradient' => 'from-emerald-800 via-emerald-700 to-emerald-600', 'glow' => 'bg-emerald-200/45'], - ['gradient' => 'from-rose-700 via-rose-600 to-pink-500', 'glow' => 'bg-rose-200/40'], - ['gradient' => 'from-rose-700 via-pink-600 to-fuchsia-500', 'glow' => 'bg-pink-200/40'], - ['gradient' => 'from-rose-700 via-rose-600 to-orange-500', 'glow' => 'bg-orange-200/40'], - ['gradient' => 'from-rose-700 via-pink-600 to-red-500', 'glow' => 'bg-rose-200/40'], - ['gradient' => 'from-fuchsia-700 via-pink-600 to-rose-500', 'glow' => 'bg-fuchsia-200/40'], - ['gradient' => 'from-rose-700 via-rose-600 to-pink-500', 'glow' => 'bg-rose-200/40'], - ['gradient' => 'from-red-700 via-rose-600 to-pink-500', 'glow' => 'bg-red-200/40'], - ]; - $trendIcons = [ - 'gift', - 'computer', - 'bike', - 'sparkles', - 'coffee', - 'laptop', - 'fitness', - 'game', - ]; @endphp @if($demoLandingMode && $prepareDemoRoute) @@ -99,11 +79,11 @@
@else
-
+
-
+
@foreach($homeSlides as $index => $slide)
@endif
-
+
@@ -214,7 +194,7 @@
-
+
-
+

Popular Listings

-
+

{{ __('messages.sell_something') }}

diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index b41b1f01e..0a0f7fb4c 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -103,7 +103,7 @@
@else -