Compare commits

..

8 Commits

Author SHA1 Message Date
Bayu Lukman Yusuf 7173d2c117 change price, image if variant click and show description 2026-01-02 15:01:00 +07:00
Bayu Lukman Yusuf c8c96556c0 product description + variant 2026-01-02 11:07:44 +07:00
bayu 7b38c511ce init language 2025-12-31 13:49:49 +07:00
bayu 2ab0549f02 add new arrivals 2025-12-31 13:14:30 +07:00
bayu a3675b87c9 location & language 2025-12-31 11:04:13 +07:00
bayu 496f7a9179 setup language switch 2025-12-31 09:55:38 +07:00
bayu b00378ba8f product grid 2025-12-30 16:08:16 +07:00
bayu c384576119 init brand 2025-12-30 11:18:57 +07:00
67 changed files with 4012 additions and 1441 deletions

View File

@ -27,7 +27,7 @@ DB_CONNECTION=sqlite
# DB_USERNAME=root # DB_USERNAME=root
# DB_PASSWORD= # DB_PASSWORD=
SESSION_DRIVER=database SESSION_DRIVER=file
SESSION_LIFETIME=120 SESSION_LIFETIME=120
SESSION_ENCRYPT=false SESSION_ENCRYPT=false
SESSION_PATH=/ SESSION_PATH=/
@ -63,3 +63,6 @@ AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}" VITE_APP_NAME="${APP_NAME}"
WMS_ASSET_URL="https://dev.smgdev.top/api/storage"

1
.php-version Normal file
View File

@ -0,0 +1 @@
8.4

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function index(Request $request)
{
return view('home.fashion-v1');
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class LocaleController extends Controller
{
/**
* Handle language switching request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function switch(Request $request): JsonResponse
{
$locale = $request->input('locale');
// Validate locale
if (in_array($locale, ['en', 'id'])) {
App::setLocale($locale);
Session::put('locale', $locale);
}
return response()->json(['success' => true]);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class LocationController extends Controller
{
/**
* Handle location selection request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function select(Request $request): JsonResponse
{
$locationId = $request->input('location_id');
// Store location ID in session
session(['location_id' => $locationId]);
return response()->json(['success' => true]);
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers;
use App\Models\Items;
use App\Repositories\Catalog\ProductRepository;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function detail($slug, Request $request, ProductRepository $productRepository)
{
$product = Items::where('slug', $slug)->first();
if ($product == null) {
abort(404);
}
$complete_look_products_data = $productRepository->getList([
'category_id' => $product->category1_id,
'limit' => 4,
]);
$complete_look_products = collect($complete_look_products_data->items())->chunk(2);
return view('shop.product-fashion',[
'product' => $product,
'complete_look_products' => $complete_look_products
]);
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class SetLocale
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
// Check if locale is in request
if ($request->has('locale')) {
$locale = $request->get('locale');
// Validate locale
if (in_array($locale, ['en', 'id'])) {
App::setLocale($locale);
Session::put('locale', $locale);
}
}
// Check if locale is in session
elseif (Session::has('locale')) {
$locale = Session::get('locale');
if (in_array($locale, ['en', 'id'])) {
App::setLocale($locale);
}
}
return $next($request);
}
}

48
app/Models/Brand.php Normal file
View File

@ -0,0 +1,48 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Storage;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
class Brand extends Model
{
use HasFactory, SoftDeletes;
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults();
}
protected $table = 'brands';
protected $primaryKey = 'id';
protected $fillable = [
'name',
'code',
'image',
'hide_point',
'priority'
];
public function items()
{
return $this->hasMany(Items::class, 'brand_id', 'id');
}
public function getImageUrlAttribute()
{
return $this->image ? Storage::disk('wms')->url($this->image) : null;
}
public function getImageDarkUrlAttribute()
{
return $this->image ? Storage::disk('wms')->url($this->image) : null;
}
}

33
app/Models/Discount.php Normal file
View File

@ -0,0 +1,33 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
class Discount extends Model
{
use HasFactory;
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults();
}
protected $fillable = ['name', 'valid_at', 'expired_at', 'customer_group_id', 'discount_percent','location_id', 'type', 'apply_point', 'apply_incentive'];
public function discountItems() {
return $this->hasMany(DiscountItem::class);
}
public function customerGroup() {
return $this->belongsTo(CustomerGroup::class);
}
public function location() {
return $this->belongsTo(Location::class);
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DiscountItem extends Model
{
use HasFactory;
protected $fillable = ['item_reference_id', 'price', 'discount_id', 'percent', 'original_price'];
public function itemReference()
{
return $this->belongsTo(ItemReference::class);
}
public function discount()
{
return $this->belongsTo(Discount::class);
}
}

13
app/Models/ItemImage.php Normal file
View File

@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ItemImage extends Model
{
use HasFactory;
protected $fillable = ["filename", "item_id", "item_reference_id", "item_variant_id", "is_main"];
}

View File

@ -0,0 +1,203 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Awobaz\Compoships\Compoships;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Cache;
class ItemReference extends Model
{
use HasFactory, Compoships;
protected $table = 'item_reference';
protected $primaryKey = 'id';
protected $fillable = ['item_id','item_variant_id','number','unit'];
public function images()
{
return $this->hasMany(ItemImage::class, 'item_id', 'item_id');
}
public function item()
{
return $this->belongsTo(Items::class)->with("brand", "gender", "category");
}
public function itemVariant()
{
return $this->belongsTo(ItemVariant::class);
}
public function variants()
{
$model = ItemVariant::where('item_id', $this->item_id)->get();
return $model;
}
public function location()
{
return $this->belongsTo(Location::class, "location_id");
}
public function stocks()
{
return $this->hasMany(Stock::class, ["item_id", "item_variant_id"], ["item_id", "item_variant_id"])
->with("location");
}
public function bucketStocks()
{
return $this->hasMany(BucketStock::class)->with("bucket");
// ->where("quantity",">",0);
}
public function promotion()
{
return $this->belongsToMany(Promotion::class, "promotion_item", "item_id", "promotion_id");
}
public function price()
{
$user = auth()->user();
[$location_id, $is_consignment] = Cache::remember(
"employee_user_" . optional($user)->id,
60,
function () use ($user) {
if (!$user) {
return [10, false];
}
$employee = $user->employee;
$location_id = $employee->location_id ?? 10;
$location = $employee->location;
$is_consignment = (bool) optional($location)->is_consignment
&& optional($location)->id != 9;
return [$location_id, $is_consignment];
}
);
return $this->hasOne(Discount::class, 'id', 'item_reference_id')
->leftJoin('discount_items', 'discount_items.discount_id', '=', 'discounts.id')
->where('discounts.type', 'price')
->where(function ($query) {
$query->where('valid_at', '<=', now())
->orWhereNull('valid_at');
})
->where(function ($query) {
$query->where('expired_at', '>', now())
->orWhereNull('expired_at');
})
->where(function ($query) use ($location_id, $is_consignment) {
if (!$is_consignment) {
$query->whereNull('discounts.location_id');
}
if ($location_id) {
$query->orWhere('discounts.location_id', $location_id);
}
})
->orderByDesc('discounts.created_at')
->select([
'discount_items.item_reference_id',
'discount_items.price',
]);
}
public function discount()
{
$user = auth()->user();
list($location_id, $is_consignment) = Cache::remember("employee_user_".$user->id, 60 * 60 * 24, function(){
$employee = @$user->employee;
$location_id = @$employee->location_id ?? 10;
$location = @$employee->location;
$is_consignment = (boolean) @$location->is_consignment && $location->id != 9;
return [$location_id, $is_consignment];
});
// Log::info([$location_id, $is_consignment]);
return $this->hasOne(Discount::class,DB::raw("discount_items.item_reference_id"))
->leftJoin("discount_items","discounts.id","=","discount_id")
->where("discounts.type","discount")
->orderBy("discounts.created_at","desc")
->where(function($query){
$query->where("valid_at", "<=", Carbon::now())
->orWhereNull("valid_at");
})
->where(function($query){
$query->where("expired_at", ">", Carbon::now())
->orWhereNull("expired_at");
})
->where(function($query) use ($location_id, $is_consignment){
if (!$is_consignment)
$query->whereNull("discounts.location_id");
if ($location_id)
$query->orWhere("discounts.location_id", $location_id);
})
->select("item_reference_id","price");
}
public function point()
{
return $this->hasOne(CustomerPointRule::class);
}
public function promotion3()
{
$now = Carbon::now()->format('Y-m-d');
$promotions = "select DISTINCT ON (item_id) item_id as item_reference_id, name, note from
promotions left join promotion_item on promotions.id = promotion_id
where (valid_date is null or valid_date::date <= '$now')
and (expired_date is null or expired_date::date >= '$now')
and type <> 'POINT'";
$points = "select item_reference_id, array_agg((case when qty is null then '' else (qty || ': ') end) || point || ' Point' order by point asc) as name
from customer_point_rules
group by item_reference_id";
return $this->hasOne(ItemReference::class,"id")
->select('item_reference.id as item_reference_id',DB::raw("(case when points.name is null then promotions.name else array_to_string(points.name,', ') end) as promotion"),'promotions.note as promotion_note')
->leftJoin(DB::raw("(" . $promotions . ") as promotions"), "promotions.item_reference_id", "=", "item_reference.id")
->leftJoin(DB::raw("(" . $points . ") as points"), "points.item_reference_id", "=", "item_reference.id");
}
public function promotion2()
{
$now = Carbon::now()->format('Y-m-d');
$promotions = "select DISTINCT ON (item_id) item_id, name, note from
promotions left join promotion_item on promotions.id = promotion_id
where (valid_date is null or valid_date::date <= '$now')
and (expired_date is null or expired_date::date >= '$now')
and item_id = $this->id
and type <> 'POINT'";
$points = "select item_reference_id, array_agg((case when qty is null then '' else (qty || ': ') end) || point || ' Point' order by point asc) as name
from customer_point_rules
where item_reference_id = $this->id
group by item_reference_id";
$result = DB::table('item_reference')
->select(DB::raw("(case when points.name is null then promotions.name else array_to_string(points.name,', ') end) as promotion"),
'promotions.note as promotion_note')
->leftJoin(DB::raw("(" . $promotions . ") as promotions"), "promotions.item_id", "=", "item_reference.id")
->leftJoin(DB::raw("(" . $points . ") as points"), "points.item_reference_id", "=", "item_reference.id")
->where('item_reference.id', $this->id)
->first();
return $result;
}
}

121
app/Models/ItemVariant.php Normal file
View File

@ -0,0 +1,121 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Awobaz\Compoships\Compoships;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
class ItemVariant extends Model
{
use HasFactory;
use Compoships;
protected $table = 'item_variants';
protected $primaryKey = 'id';
protected $fillable = [
'id',
'code',
'description',
'item_id',
'display_name',
'is_publish',
'barcode',
'variant_name',
];
public function reference()
{
return $this->belongsTo(ItemReference::class, ["item_id", "id"], ["item_id", "item_variant_id"]);
}
public function variables()
{
return $this->belongsToMany(Variant::class, "variant_value")->select("id", "name", "value");
}
public function image()
{
return $this->hasOne(ItemImage::class)->where('item_id', $this->item_id);
}
public function images()
{
return $this->hasMany(ItemImage::class)->where('item_id', $this->item_id);
}
public function variantValue()
{
return $this->hasMany(\App\Models\VariantValue::class, 'item_variant_id');
}
public function getImageUrlAttribute()
{
$image = $this->images->first()->filename ?? null;
if (str_contains($image,"http")) {
return $image;
}
return $image ? Storage::disk('wms')->url($image) : null;
}
public function item()
{
return $this->belongsTo(Items::class, 'item_id');
}
public function conversion_value()
{
$item = $this->item;
$convertion = 1;
if (($item->display_unit != $item->unit) and ($item->display_unit)){
$convertions = DB::select("select to_qty / from_qty as conv
from item_convertions where from_unit = ? and to_unit = ?",
[$item->display_unit, $item->unit] );
$convertion = max((float) @$convertions[0]->conv,1);
}
return $convertion;
}
public function getDisplayPriceAttribute()
{
try {
$convertion = $this->conversion_value();
$price = $this->reference->price->price ?? null;
$price = $price ? $price : $this->item->net_price;
return (float) $price * $convertion;
} catch (\Exception $e) {
Log::info($e);
return 0;
}
}
public function getDisplayDiscountPriceAttribute()
{
try {
$convertion = $this->conversion_value();
$discountPrice = @$this->discount->price ?? 0;
return (float) $discountPrice * $convertion;
} catch (\Exception $e) {
return 0;
}
}
}

361
app/Models/Items.php Normal file
View File

@ -0,0 +1,361 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Awobaz\Compoships\Compoships;
use Spatie\Activitylog\LogOptions;
use Illuminate\Support\Facades\Storage;
class Items extends Model
{
use HasFactory, SoftDeletes;
use Compoships;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults();
}
// protected $with = ['brands', 'categories'];
protected $table = 'items';
protected $primaryKey = 'id';
protected $guarded = ['id'];
protected $fillable = [
'number',
'name',
'brand_id',
'category_id',
'image',
'description',
'weight',
'is_publish',
// BC data
'type',
'unit',
'display_unit',
'unit_cost',
'costing_method',
'last_direct_cost',
'unit_price',
'price_include_vat',
'sales_blocked',
'purchasing_blocked',
'profit_percent',
'net_weight',
'gross_weight',
'unit_volume',
'net_price',
'ref_id',
// purchase,
'alias_name',
'group_type',
'model_type',
'slug'
];
public function scopeFilter(Builder $query, array $filters)
{
$query->when($filters['search'] ?? false, function ($query, $search) {
return $query
->where('number', 'iLIKE', '%' . $search . '%')
->orWhere('name', 'iLIKE', '%' . $search . '%');
});
}
public function order()
{
return $this->hasMany(SaleOrderDetail::class, 'item_id', 'id');
}
public function dimension()
{
return $this->hasOne(ItemDimension::class,"no","number");
}
public function reference()
{
return $this->hasOne(ItemReference::class,'item_id')
->where(function($query){
$query->whereNull("item_variant_id")->orWhere("item_variant_id",0);
});
}
public function variants()
{
return $this->hasMany(ItemVariant::class,"item_id")
->leftJoin("stocks","item_variant_id","=","item_variants.id")
->select("item_variants.id","item_variants.code","item_variants.display_name","item_variants.is_publish", DB::raw("SUM(quantity) as stock"),"description","item_variants.item_id")
->groupBy("item_variants.id","item_variants.code","description","item_variants.item_id","item_variants.display_name","item_variants.is_publish");
}
public function images()
{
return $this->hasMany(ItemImage::class,'item_id')->whereNull('item_variant_id');
}
public function itemVariants()
{
return $this->hasMany(ItemVariant::class,"item_id")->with("reference");
}
public function publishedItemVariants()
{
return $this->hasMany(ItemVariant::class,"item_id")->with("reference")->where('is_publish', true);
}
public function brands()
{
return $this->belongsTo(Brand::class, 'brand_id', 'id');
}
public function categories()
{
return $this->belongsTo(Categories::class, 'categories_id', 'id');
}
public function brand()
{
return $this->belongsTo(Brand::class, 'brand_id', 'id');
}
public function gender()
{
return $this->belongsTo(Gender::class, 'gender_id', 'id');
}
public function category()
{
return $this->belongsTo(Categories::class, 'category_id', 'id');
}
public function discount()
{
$user = auth()->user();
[$location_id, $is_consignment] = Cache::remember(
'employee_user_' . optional($user)->id,
60 * 60 * 24,
function () use ($user) {
if (!$user) {
return [10, false];
}
$employee = $user->employee;
$location = $employee?->location;
return [
$employee?->location_id,
(bool) optional($location)->is_consignment,
];
}
);
// return $this->hasOne(Discount::class,DB::raw("item_reference.item_id"))
// ->leftJoin('discount_items', 'discount_items.discount_id', '=', 'discounts.id')
// ->leftJoin('item_reference', 'item_reference.id', '=', 'discount_items.item_reference_id')
// ->where('discounts.type', 'discount')
// ->where(function ($query) {
// $query->whereNull('valid_at')
// ->orWhere('valid_at', '<=', now());
// })
// ->where(function ($query) {
// $query->whereNull('expired_at')
// ->orWhere('expired_at', '>=', now());
// })
// ->where(function ($query) use ($location_id, $is_consignment) {
// if (!$is_consignment) {
// $query->whereNull('discounts.location_id');
// }
// if ($location_id) {
// $query->orWhere('discounts.location_id', $location_id);
// }
// })
// ->orderByDesc('discounts.created_at')
// ->select([
// 'item_reference.item_id',
// 'discount_items.price',
// ]);
return $this->hasOne(DiscountItem::class, 'item_reference_id', 'id')
->leftJoin('discounts', 'discounts.id', '=', 'discount_items.discount_id')
->leftJoin('item_reference', 'item_reference.id', '=', 'discount_items.item_reference_id')
->where('discounts.type', 'discount')
->where(function ($q) {
$q->whereNull('discounts.valid_at')
->orWhere('discounts.valid_at', '<=', now());
})
->where(function ($q) {
$q->whereNull('discounts.expired_at')
->orWhere('discounts.expired_at', '>=', now());
})
->where(function ($q) use ($location_id, $is_consignment) {
if (!$is_consignment) {
$q->whereNull('discounts.location_id');
}
if ($location_id) {
$q->orWhere('discounts.location_id', $location_id);
}
})
->orderByDesc('discounts.created_at')
->select([
'item_reference.item_id',
'discount_items.price',
]);
}
public function price()
{
$user = auth()->user();
$userId = $user ? $user->id : 0;
list($location_id, $is_consignment) = Cache::remember("employee_user_".$userId, 60 * 60 * 24, function() use ($user){
if ($user == null)
return [10, false];
$employee = @$user->employee;
$location_id = @$employee->location_id;
$location = @$employee->location;
$is_consignment = (boolean) @$location->is_consignment;
return [$location_id, $is_consignment];
});
return $this->hasOne(Discount::class, 'id', 'item_reference_id')
->leftJoin('discount_items', 'discount_items.discount_id', '=', 'discounts.id')
->where('discounts.type', 'price')
->where(function ($query) {
$query->where('valid_at', '<=', now())
->orWhereNull('valid_at');
})
->where(function ($query) {
$query->where('expired_at', '>', now())
->orWhereNull('expired_at');
})
->where(function ($query) use ($location_id, $is_consignment) {
if (!$is_consignment) {
$query->whereNull('discounts.location_id');
}
if ($location_id) {
$query->orWhere('discounts.location_id', $location_id);
}
})
->orderByDesc('discounts.created_at')
->select([
'discount_items.item_reference_id',
'discount_items.price',
]);
}
public function stock()
{
return $this->hasOne(Stock::class,"item_id")
->leftJoin("locations","locations.id","=","location_id")
->whereNotNull("locations.display_name")
->where("locations.display_name","<>","")
->where("quantity",">","0")
->groupBy("item_id")
->select("item_id",DB::raw("SUM(quantity) as quantity"));
}
public function attributes()
{
return $this->hasMany(ItemAttribute::class, 'item_id');
}
public function getImageUrlAttribute()
{
$image = $this->images->first()->filename ?? null;
if (str_contains($image,"http")) {
return $image;
}
return $image ? Storage::disk('wms')->url($image) : null;
}
public function getImageUrlsAttribute()
{
$images = $this->images ?? [];
$imgs = [];
foreach ($images as $img) {
$image = $img->filename;
if (str_contains($image,"http")) {
$imgs[] = $image;
} else {
$imgs[] = $image ? Storage::disk('wms')->url($image) : null;
}
}
return $imgs;
}
public function conversion_value()
{
$convertion = 1;
if (($this->display_unit != $this->unit) and ($this->display_unit)){
$convertions = DB::select("select to_qty / from_qty as conv
from item_convertions where from_unit = ? and to_unit = ?",
[$this->display_unit, $this->unit] );
$convertion = max((float) @$convertions[0]->conv,1);
}
return $convertion;
}
public function getDisplayPriceAttribute()
{
try {
$convertion = $this->conversion_value();
$price = @$this->variants->first()->reference->price->price ?? null;
$price = $price ? $price : $this->net_price;
return (float) $price * $convertion;
} catch (\Exception $e) {
return 0;
}
}
public function getDisplayDiscountPriceAttribute()
{
try {
$convertion = $this->conversion_value();
$discountPrice = @$this->discount->price ?? 0;
return (float) $discountPrice * $convertion;
} catch (\Exception $e) {
return 0;
}
}
}

88
app/Models/Location.php Normal file
View File

@ -0,0 +1,88 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
class Location extends Model
{
use HasFactory, SoftDeletes;
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults();
}
protected $table = 'locations';
protected $primaryKey = 'id';
protected $fillable = [
'code',
'name',
'address',
'city',
'phone',
'longitude',
'latitude',
'md_id',
'display_name',
'is_consignment',
'postal_code'
];
public function scopeFilter(Builder $query, array $filters)
{
$query->when($filters['search'] ?? false, function ($query, $search) {
return $query
->where('name', 'iLIKE', '%' . $search . '%')
->orWhere('code', 'LIKE', '%' . $search . '%');
});
}
public function md()
{
return $this->belongsTo(Employee::class);
}
public function storeCategory()
{
return $this->hasMany(StoreCapacity::class, "location_id", "id")
->selectRaw("
store_category.id,
store_category.name,
store_capacity.max::int,
COALESCE(b.qty, 0)::int as qty,
COALESCE(b.sku, 0)::int as sku,
(CASE WHEN COALESCE(b.qty, 0) = 0 OR store_capacity.max = 0 THEN 0 ELSE (qty / max * 100) END) as percentage
")
->leftJoin("store_category", "store_capacity.store_category_id", "store_category.id")
->leftJoin(DB::raw("(SELECT
c.store_category_id,
SUM(stocks.quantity) as qty,
count(distinct item_reference.number) as sku
FROM (SELECT item_dimension.no, store_category_map.store_category_id FROM store_category_map
LEFT JOIN item_dimension
ON (store_category_map.category1 = item_dimension.category1 OR store_category_map.category1 is null)
AND (store_category_map.category2 = item_dimension.category2 OR store_category_map.category2 is null)
AND (store_category_map.category3 = item_dimension.category3 OR store_category_map.category3 is null)
AND (store_category_map.category4 = item_dimension.category4 OR store_category_map.category4 is null)
GROUP BY item_dimension.no, store_category_map.store_category_id
) c
LEFT JOIN items
ON items.number = c.no
LEFT JOIN item_reference
ON items.id = item_reference.item_id
LEFT JOIN stocks
ON stocks.item_id = item_reference.item_id AND stocks.item_variant_id = item_reference.item_variant_id
WHERE stocks.location_id = $this->id and stocks.quantity > 0
GROUP BY c.store_category_id
) b"), "store_capacity.store_category_id", "b.store_category_id");
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class StoreCapacity extends Model
{
use HasFactory;
protected $table = 'store_capacity';
protected $fillable = ['store_category_id', 'location_id', 'max'];
public function location() {
return $this->belongsTo(Location::class);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class StoreCategory extends Model
{
use HasFactory;
protected $table = 'store_category';
protected $fillable = ['name', 'image'];
public function categories()
{
return $this->hasMany(StoreCategoryMap::class);
}
public function locations()
{
return $this->hasMany(StoreCapacity::class);
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class StoreCategoryMap extends Model
{
use HasFactory;
protected $table = "store_category_map";
protected $fillable = ['store_category_id', 'category1', 'category2', 'category3', 'category4'];
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\Repositories\Catalog;
use App\Models\Brand;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;
use Image;
use Storage;
class BrandRepository
{
public function getList($params){
return Cache::remember("catalog_brand_".json_encode($params),60, function() use ($params) {
$category_id = @$params["category_id"];
if ($category_id){
$ids = DB::select("select distinct brand from store_category_map a
left join item_dimension b
left join items on b.no = items.number
on a.category1 = b.category1
and (a.category2 = b.category2 or a.category2 is null)
and (a.category3 = b.category3 or a.category3 is null)
and (a.category4 = b.category4 or a.category4 is null)
where store_category_id = ?
and items.is_publish = true ",[$category_id]);
$ids = collect($ids)->pluck("brand");
return Brand::whereIn("name",$ids)->orderBy('priority', 'desc')
->where("priority",">",0)
->orderBy('name', 'asc')->get();
}
return Brand::orderBy('priority', 'desc')->orderBy('name', 'asc')
->where("priority",">",0)
->get();
});
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Repositories\Catalog;
use App\Models\StoreCategory as Category;
use DB;
use Carbon\Carbon;
use Image;
use Storage;
class CategoryRepository
{
public function getList($params){
return Category::get();
}
}

View File

@ -0,0 +1,97 @@
<?php
namespace App\Repositories\Catalog;
use App\Models\Items;
use App\Models\StoreCategoryMap;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class ProductRepository
{
public function getList($params)
{
$event = @$params["event"];
$sort = @$params["sort"];
$search = @$params["search"];
$category_id = @$params["category_id"];
$brand_id = @$params["brand_id"];
$gender_id = @$params["gender_id"];
$limit = @$params["limit"];
$builder = Items::select('items.*','percent')
->leftJoin('item_dimension', 'item_dimension.no', 'items.number')
->leftJoin(DB::raw("(select distinct on (item_id) item_id, percent, discounts.created_at,
case when discounts.valid_at is null then 'special-offer' else 'limited-sale' end as event
from discount_items
left join item_reference on item_reference_id = item_reference.id
left join discounts on discounts.id = discount_id
where discounts.type = 'discount' and
( discounts.valid_at is null or discounts.valid_at <= now()) and
( discounts.valid_at is null or discounts.expired_at >= now())
order by item_id, discounts.created_at desc
) as d"),"d.item_id","=","items.id")
->when(true, function($query) use ($event, $sort){
if ($event){
$query->orderByRaw("case when brand = 'CHAMELO' then 1 else 2 end ASC ");
$query->orderBy("percent", "desc");
}else{
/* if ($event == "special-offer"){
$query->orderByRaw("case when brand = 'CHAMELO' then 1 else 2 end ASC ");
} */
if ($sort == "new"){
\Log::info($sort);
$query->orderByRaw("case when category1 in ('CLUBS','CLUB','COMPONENT HEAD') and brand = 'PXG' then 1 else 2 end ASC");
}else{
$query->orderByRaw("case when d.created_at is not null then 1 else 2 end ASC, random()");
}
// $query->orderByRaw("items.created_at desc NULLS LAST");
}
})
->where("is_publish", true)
->when($search, function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('number', 'ILIKE', "%$search%")
->orWhere('name', 'ILIKE', "%$search%")
->orWhere('alias_name', 'ILIKE', "%$search%");
});
})
->when($brand_id, function ($query) use ($brand_id) {
$query->where('brand_id', $brand_id);
})
->when($gender_id, function ($query) use ($gender_id) {
$query->where('gender_id', $gender_id);
})
->when($event, function($query) use ($event){
$query->where('d.event', $event);
});
if ($category_id) {
$categories = StoreCategoryMap::where('store_category_id', $category_id)->get();
$builder->where(function ($query) use ($categories) {
$i = 0;
foreach ($categories as $category) {
if ($i == 0) {
$query->where(function ($query) use ($category) {
$query->where('item_dimension.category1', $category->category1)
->where('item_dimension.category2', $category->category2);
});
} else {
$query->orWhere(function ($query) use ($category) {
$query->where('item_dimension.category1', $category->category1)
->where('item_dimension.category2', $category->category2);
});
}
$i++;
}
});
}
return $builder->paginate($limit);
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\View\Components\Home;
use App\Repositories\Catalog\BrandRepository;
use Closure;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class BrandHome extends Component
{
public $brands;
public $template = 'fashion-v1';
/**
* Create a new component instance.
*/
public function __construct(BrandRepository $brandRepository)
{
$this->brands = $brandRepository->getList([]);
if ($this->brands->count() < 9) {
// Ensure we have at least 9 brands by duplicating if necessary
while ($this->brands->count() < 9) {
$this->brands = $this->brands->concat($this->brands);
}
$this->brands = $this->brands->take(9);
}
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
{
$view = 'components.home.brand-home-fashion-v1';
if ($this->template === 'fashion-v2') {
$view = 'components.home.brand-home-fashion-v2';
}
return view($view);
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\View\Components\Home;
use App\Repositories\Catalog\ProductRepository;
use Illuminate\View\Component;
use Illuminate\View\View;
class NewArrivals extends Component
{
public $products;
public function __construct(ProductRepository $productRepository)
{
$params = [
'sort' => 'new',
];
$this->products = $productRepository->getList($params);
}
/**
* Get the view/contents that represent the component.
*/
public function render(): View
{
return view('components.home.new-arrivals');
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\View\Components\Home;
use App\Repositories\Catalog\ProductRepository;
use Closure;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class ProductHighlight extends Component
{
public $products;
public function __construct(ProductRepository $productRepository)
{
$params = [
'sort' => 'new',
];
$this->products = $productRepository->getList($params);
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
{
return view('components.home.product-highlight');
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
use Illuminate\View\View;
class LanguageSelector extends Component
{
/**
* Create a new component instance.
*/
public function __construct()
{
//
}
/**
* Get the view/contents that represent the component.
*/
public function render(): View
{
return view('components.language-selector');
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
use Illuminate\View\View;
class LanguageSelectorSidebar extends Component
{
/**
* Create a new component instance.
*/
public function __construct()
{
//
}
/**
* Get the view/contents that represent the component.
*/
public function render(): View
{
return view('components.language-selector-sidebar');
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\View\Components;
use App\Models\Location;
use Illuminate\View\Component;
use Illuminate\View\View;
class LocationSelector extends Component
{
public Location $selected;
public $locations;
/**
* Create a new component instance.
*/
public function __construct()
{
// Get location ID from session, default to 22 if not set
$locationId = session('location_id', 22);
$this->selected = Location::where('id', $locationId)->first();
$this->locations = Location::whereNotNull('display_name')
->whereNot('display_name', '=', '')
->orderBy('display_name')
->get();
}
/**
* Get the view/contents that represent the component.
*/
public function render(): View
{
return view('components.location-selector');
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\View\Components;
use App\Models\Location;
use Illuminate\View\Component;
use Illuminate\View\View;
class LocationSelectorSidebar extends Component
{
public Location $selected;
public $locations;
/**
* Create a new component instance.
*/
public function __construct()
{
// Get location ID from session, default to 22 if not set
$locationId = session('location_id', 22);
$this->selected = Location::where('id', $locationId)->first();
$this->locations = Location::whereNotNull('display_name')
->whereNot('display_name', '=', '')
->orderBy('display_name')
->get();
}
/**
* Get the view/contents that represent the component.
*/
public function render(): View
{
return view('components.location-selector-sidebar');
}
}

View File

@ -11,7 +11,9 @@ return Application::configure(basePath: dirname(__DIR__))
health: '/up', health: '/up',
) )
->withMiddleware(function (Middleware $middleware): void { ->withMiddleware(function (Middleware $middleware): void {
// $middleware->web(append: [
\App\Http\Middleware\SetLocale::class,
]);
}) })
->withExceptions(function (Exceptions $exceptions): void { ->withExceptions(function (Exceptions $exceptions): void {
// //

View File

@ -10,8 +10,10 @@
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": "^8.2", "php": "^8.2",
"awobaz/compoships": "^2.5",
"laravel/framework": "^12.0", "laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1" "laravel/tinker": "^2.10.1",
"spatie/laravel-activitylog": "^4.10"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.23", "fakerphp/faker": "^1.23",
@ -75,4 +77,4 @@
}, },
"minimum-stability": "stable", "minimum-stability": "stable",
"prefer-stable": true "prefer-stable": true
} }

216
composer.lock generated
View File

@ -4,8 +4,70 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "88970a0117c062eed55fa8728fc43833", "content-hash": "39a129e1371f7351b7cd6beab65a522a",
"packages": [ "packages": [
{
"name": "awobaz/compoships",
"version": "2.5.4",
"source": {
"type": "git",
"url": "https://github.com/topclaudy/compoships.git",
"reference": "dcae8012a8704fc2acd8dce2d8a1b35ce292adbe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/topclaudy/compoships/zipball/dcae8012a8704fc2acd8dce2d8a1b35ce292adbe",
"reference": "dcae8012a8704fc2acd8dce2d8a1b35ce292adbe",
"shasum": ""
},
"require": {
"illuminate/database": ">=5.6 <13.0"
},
"require-dev": {
"ext-sqlite3": "*",
"fakerphp/faker": "^1.18",
"phpunit/phpunit": "^6.0|^8.0|^9.0|^10.0|^11.0|^12.0"
},
"suggest": {
"awobaz/blade-active": "Blade directives for the Laravel 'Active' package",
"awobaz/eloquent-auto-append": "Automatically append accessors to model serialization",
"awobaz/eloquent-mutators": "Reusable mutators (getters/setters) for Laravel 5's Eloquent",
"awobaz/syntactic": "Syntactic sugar for named and indexed parameters call."
},
"type": "library",
"autoload": {
"psr-4": {
"Awobaz\\Compoships\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Claudin J. Daniel",
"email": "cdaniel@awobaz.com"
}
],
"description": "Laravel relationships with support for composite/multiple keys",
"keywords": [
"laravel",
"laravel composite keys",
"laravel relationships"
],
"support": {
"issues": "https://github.com/topclaudy/compoships/issues",
"source": "https://github.com/topclaudy/compoships/tree/2.5.4"
},
"funding": [
{
"url": "https://paypal.me/awobaz",
"type": "custom"
}
],
"time": "2025-12-23T18:33:46+00:00"
},
{ {
"name": "brick/math", "name": "brick/math",
"version": "0.13.1", "version": "0.13.1",
@ -3271,6 +3333,158 @@
}, },
"time": "2025-06-25T14:20:11+00:00" "time": "2025-06-25T14:20:11+00:00"
}, },
{
"name": "spatie/laravel-activitylog",
"version": "4.10.2",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-activitylog.git",
"reference": "bb879775d487438ed9a99e64f09086b608990c10"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/bb879775d487438ed9a99e64f09086b608990c10",
"reference": "bb879775d487438ed9a99e64f09086b608990c10",
"shasum": ""
},
"require": {
"illuminate/config": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0",
"illuminate/database": "^8.69 || ^9.27 || ^10.0 || ^11.0 || ^12.0",
"illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0",
"php": "^8.1",
"spatie/laravel-package-tools": "^1.6.3"
},
"require-dev": {
"ext-json": "*",
"orchestra/testbench": "^6.23 || ^7.0 || ^8.0 || ^9.0 || ^10.0",
"pestphp/pest": "^1.20 || ^2.0 || ^3.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Spatie\\Activitylog\\ActivitylogServiceProvider"
]
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Spatie\\Activitylog\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
},
{
"name": "Sebastian De Deyne",
"email": "sebastian@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
},
{
"name": "Tom Witkowski",
"email": "dev.gummibeer@gmail.com",
"homepage": "https://gummibeer.de",
"role": "Developer"
}
],
"description": "A very simple activity logger to monitor the users of your website or application",
"homepage": "https://github.com/spatie/activitylog",
"keywords": [
"activity",
"laravel",
"log",
"spatie",
"user"
],
"support": {
"issues": "https://github.com/spatie/laravel-activitylog/issues",
"source": "https://github.com/spatie/laravel-activitylog/tree/4.10.2"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
},
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2025-06-15T06:59:49+00:00"
},
{
"name": "spatie/laravel-package-tools",
"version": "1.92.7",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-package-tools.git",
"reference": "f09a799850b1ed765103a4f0b4355006360c49a5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5",
"reference": "f09a799850b1ed765103a4f0b4355006360c49a5",
"shasum": ""
},
"require": {
"illuminate/contracts": "^9.28|^10.0|^11.0|^12.0",
"php": "^8.0"
},
"require-dev": {
"mockery/mockery": "^1.5",
"orchestra/testbench": "^7.7|^8.0|^9.0|^10.0",
"pestphp/pest": "^1.23|^2.1|^3.1",
"phpunit/php-code-coverage": "^9.0|^10.0|^11.0",
"phpunit/phpunit": "^9.5.24|^10.5|^11.5",
"spatie/pest-plugin-test-time": "^1.1|^2.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Spatie\\LaravelPackageTools\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"role": "Developer"
}
],
"description": "Tools for creating Laravel packages",
"homepage": "https://github.com/spatie/laravel-package-tools",
"keywords": [
"laravel-package-tools",
"spatie"
],
"support": {
"issues": "https://github.com/spatie/laravel-package-tools/issues",
"source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7"
},
"funding": [
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2025-07-17T15:46:43+00:00"
},
{ {
"name": "symfony/clock", "name": "symfony/clock",
"version": "v7.3.0", "version": "v7.3.0",

BIN
composer.phar Normal file

Binary file not shown.

View File

@ -13,7 +13,7 @@ return [
| |
*/ */
'default' => env('FILESYSTEM_DISK', 'local'), 'default' => env('FILESYSTEM_DISK', 'wms'),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -47,6 +47,16 @@ return [
'report' => false, 'report' => false,
], ],
'wms' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('WMS_ASSET_URL'),
'visibility' => 'public',
'throw' => false,
'report' => false,
],
's3' => [ 's3' => [
'driver' => 's3', 'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'), 'key' => env('AWS_ACCESS_KEY_ID'),

View File

@ -1,49 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
Schema::dropIfExists('password_reset_tokens');
Schema::dropIfExists('sessions');
}
};

View File

@ -1,35 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('cache', function (Blueprint $table) {
$table->string('key')->primary();
$table->mediumText('value');
$table->integer('expiration');
});
Schema::create('cache_locks', function (Blueprint $table) {
$table->string('key')->primary();
$table->string('owner');
$table->integer('expiration');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('cache');
Schema::dropIfExists('cache_locks');
}
};

View File

@ -1,57 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('jobs', function (Blueprint $table) {
$table->id();
$table->string('queue')->index();
$table->longText('payload');
$table->unsignedTinyInteger('attempts');
$table->unsignedInteger('reserved_at')->nullable();
$table->unsignedInteger('available_at');
$table->unsignedInteger('created_at');
});
Schema::create('job_batches', function (Blueprint $table) {
$table->string('id')->primary();
$table->string('name');
$table->integer('total_jobs');
$table->integer('pending_jobs');
$table->integer('failed_jobs');
$table->longText('failed_job_ids');
$table->mediumText('options')->nullable();
$table->integer('cancelled_at')->nullable();
$table->integer('created_at');
$table->integer('finished_at')->nullable();
});
Schema::create('failed_jobs', function (Blueprint $table) {
$table->id();
$table->string('uuid')->unique();
$table->text('connection');
$table->text('queue');
$table->longText('payload');
$table->longText('exception');
$table->timestamp('failed_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('jobs');
Schema::dropIfExists('job_batches');
Schema::dropIfExists('failed_jobs');
}
};

20
lang/en/auth.php Normal file
View File

@ -0,0 +1,20 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'These credentials do not match our records.',
'password' => 'The provided password is incorrect.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
];

8
lang/en/languages.php Normal file
View File

@ -0,0 +1,8 @@
<?php
return [
'id' => 'Indonesia',
'en' => 'English',
];

6
lang/en/new_arrivals.php Normal file
View File

@ -0,0 +1,6 @@
<?php
return [
'new_arrivals' => 'New Arrivals',
'meet_the_collection' => 'Meet the :app collection'
];

19
lang/en/pagination.php Normal file
View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Previous',
'next' => 'Next &raquo;',
];

22
lang/en/passwords.php Normal file
View File

@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| outcome such as failure due to an invalid password / reset token.
|
*/
'reset' => 'Your password has been reset.',
'sent' => 'We have emailed your password reset link.',
'throttled' => 'Please wait before retrying.',
'token' => 'This password reset token is invalid.',
'user' => "We can't find a user with that email address.",
];

198
lang/en/validation.php Normal file
View File

@ -0,0 +1,198 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute field must be accepted.',
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
'active_url' => 'The :attribute field must be a valid URL.',
'after' => 'The :attribute field must be a date after :date.',
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
'alpha' => 'The :attribute field must only contain letters.',
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
'any_of' => 'The :attribute field is invalid.',
'array' => 'The :attribute field must be an array.',
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
'before' => 'The :attribute field must be a date before :date.',
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
'between' => [
'array' => 'The :attribute field must have between :min and :max items.',
'file' => 'The :attribute field must be between :min and :max kilobytes.',
'numeric' => 'The :attribute field must be between :min and :max.',
'string' => 'The :attribute field must be between :min and :max characters.',
],
'boolean' => 'The :attribute field must be true or false.',
'can' => 'The :attribute field contains an unauthorized value.',
'confirmed' => 'The :attribute field confirmation does not match.',
'contains' => 'The :attribute field is missing a required value.',
'current_password' => 'The password is incorrect.',
'date' => 'The :attribute field must be a valid date.',
'date_equals' => 'The :attribute field must be a date equal to :date.',
'date_format' => 'The :attribute field must match the format :format.',
'decimal' => 'The :attribute field must have :decimal decimal places.',
'declined' => 'The :attribute field must be declined.',
'declined_if' => 'The :attribute field must be declined when :other is :value.',
'different' => 'The :attribute field and :other must be different.',
'digits' => 'The :attribute field must be :digits digits.',
'digits_between' => 'The :attribute field must be between :min and :max digits.',
'dimensions' => 'The :attribute field has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
'email' => 'The :attribute field must be a valid email address.',
'ends_with' => 'The :attribute field must end with one of the following: :values.',
'enum' => 'The selected :attribute is invalid.',
'exists' => 'The selected :attribute is invalid.',
'extensions' => 'The :attribute field must have one of the following extensions: :values.',
'file' => 'The :attribute field must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'array' => 'The :attribute field must have more than :value items.',
'file' => 'The :attribute field must be greater than :value kilobytes.',
'numeric' => 'The :attribute field must be greater than :value.',
'string' => 'The :attribute field must be greater than :value characters.',
],
'gte' => [
'array' => 'The :attribute field must have :value items or more.',
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be greater than or equal to :value.',
'string' => 'The :attribute field must be greater than or equal to :value characters.',
],
'hex_color' => 'The :attribute field must be a valid hexadecimal color.',
'image' => 'The :attribute field must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field must exist in :other.',
'in_array_keys' => 'The :attribute field must contain at least one of the following keys: :values.',
'integer' => 'The :attribute field must be an integer.',
'ip' => 'The :attribute field must be a valid IP address.',
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
'json' => 'The :attribute field must be a valid JSON string.',
'list' => 'The :attribute field must be a list.',
'lowercase' => 'The :attribute field must be lowercase.',
'lt' => [
'array' => 'The :attribute field must have less than :value items.',
'file' => 'The :attribute field must be less than :value kilobytes.',
'numeric' => 'The :attribute field must be less than :value.',
'string' => 'The :attribute field must be less than :value characters.',
],
'lte' => [
'array' => 'The :attribute field must not have more than :value items.',
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be less than or equal to :value.',
'string' => 'The :attribute field must be less than or equal to :value characters.',
],
'mac_address' => 'The :attribute field must be a valid MAC address.',
'max' => [
'array' => 'The :attribute field must not have more than :max items.',
'file' => 'The :attribute field must not be greater than :max kilobytes.',
'numeric' => 'The :attribute field must not be greater than :max.',
'string' => 'The :attribute field must not be greater than :max characters.',
],
'max_digits' => 'The :attribute field must not have more than :max digits.',
'mimes' => 'The :attribute field must be a file of type: :values.',
'mimetypes' => 'The :attribute field must be a file of type: :values.',
'min' => [
'array' => 'The :attribute field must have at least :min items.',
'file' => 'The :attribute field must be at least :min kilobytes.',
'numeric' => 'The :attribute field must be at least :min.',
'string' => 'The :attribute field must be at least :min characters.',
],
'min_digits' => 'The :attribute field must have at least :min digits.',
'missing' => 'The :attribute field must be missing.',
'missing_if' => 'The :attribute field must be missing when :other is :value.',
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
'missing_with' => 'The :attribute field must be missing when :values is present.',
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
'multiple_of' => 'The :attribute field must be a multiple of :value.',
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute field format is invalid.',
'numeric' => 'The :attribute field must be a number.',
'password' => [
'letters' => 'The :attribute field must contain at least one letter.',
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
'numbers' => 'The :attribute field must contain at least one number.',
'symbols' => 'The :attribute field must contain at least one symbol.',
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
],
'present' => 'The :attribute field must be present.',
'present_if' => 'The :attribute field must be present when :other is :value.',
'present_unless' => 'The :attribute field must be present unless :other is :value.',
'present_with' => 'The :attribute field must be present when :values is present.',
'present_with_all' => 'The :attribute field must be present when :values are present.',
'prohibited' => 'The :attribute field is prohibited.',
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.',
'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.',
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
'regex' => 'The :attribute field format is invalid.',
'required' => 'The :attribute field is required.',
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
'required_if_declined' => 'The :attribute field is required when :other is declined.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute field must match :other.',
'size' => [
'array' => 'The :attribute field must contain :size items.',
'file' => 'The :attribute field must be :size kilobytes.',
'numeric' => 'The :attribute field must be :size.',
'string' => 'The :attribute field must be :size characters.',
],
'starts_with' => 'The :attribute field must start with one of the following: :values.',
'string' => 'The :attribute field must be a string.',
'timezone' => 'The :attribute field must be a valid timezone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'uppercase' => 'The :attribute field must be uppercase.',
'url' => 'The :attribute field must be a valid URL.',
'ulid' => 'The :attribute field must be a valid ULID.',
'uuid' => 'The :attribute field must be a valid UUID.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [],
];

View File

@ -0,0 +1,9 @@
<?php
return [
'this_weeks_highlights' => 'This week\'s highlights',
'best_sellers' => 'Best sellers',
'new_arrivals' => 'New arrivals',
'sale_items' => 'Sale items',
'top_rated' => 'Top rated'
];

8
lang/id/languages.php Normal file
View File

@ -0,0 +1,8 @@
<?php
return [
'id' => 'Indonesia',
'en' => 'English',
];

6
lang/id/new_arrivals.php Normal file
View File

@ -0,0 +1,6 @@
<?php
return [
'new_arrivals' => 'Kedatangan Baru',
'meet_the_collection' => 'Temukan koleksi :app'
];

View File

@ -0,0 +1,9 @@
<?php
return [
'this_weeks_highlights' => 'Highlight minggu ini',
'best_sellers' => 'Terlaris',
'new_arrivals' => 'Kedatangan baru',
'sale_items' => 'Item diskon',
'top_rated' => 'Peringkat tertinggi'
];

1310
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

BIN
public/img/flags/id.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/logo/icon.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
public/logo/logo-app.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -0,0 +1,44 @@
<section class="container pb-5 mb-1 mb-sm-3 mb-lg-4 mb-xl-5">
<div class="swiper my-md-3"
data-swiper='{
"slidesPerView": 2,
"pagination": {
"el": ".swiper-pagination",
"clickable": true
},
"breakpoints": {
"500": {
"slidesPerView": 3
},
"768": {
"slidesPerView": 4,
"spaceBetween": 12
},
"992": {
"slidesPerView": 5,
"spaceBetween": 20
},
"1200": {
"slidesPerView": 6,
"spaceBetween": 24
}
}
}'>
<div class="swiper-wrapper">
<!-- Item -->
@foreach($brands as $brand)
<a class="swiper-slide text-body" href="#!" aria-label="{{ $brand->name }}">
<img src="{{ $brand->image_url }}" alt="{{ $brand->name }}" class="object-fit-contain">
</a>
@endforeach
</div>
<!-- Pagination (Bullets) -->
<div class="swiper-pagination position-static mt-3"></div>
</div>
</section>

View File

@ -0,0 +1,105 @@
<section class="container pt-5 mt-2 mt-sm-3 mt-lg-4 mt-xl-5">
<h3 class="text-center pb-2 pb-md-3">Shop by brand</h3>
<div class="row justify-content-center">
<div class="col-sm-10 col-md-12">
<div class="row g-0 border rounded-5 overflow-hidden">
<div class="col-8 col-md-4 d-flex flex-column border-end">
<a class="hover-effect-opacity position-relative d-block text-body border-bottom"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[0]->image_url }}" alt="{{ $brands[0]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[0]->image_dark_url ?? '/img/home/fashion/v2/brands/zara-dark.svg' }}" alt="{{ $brands[0]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
<a class="hover-effect-opacity position-relative d-block h-100 text-body" href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[1]->image_url ?? '/img/home/fashion/v2/brands/brooks-light.svg' }}" alt="{{ $brands[1]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[1]->image_dark_url ?? '/img/home/fashion/v2/brands/brooks-dark.svg' }}" alt="{{ $brands[1]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<div class="col-4 col-md-2 d-flex">
<div class="d-flex flex-column w-100">
<a class="hover-effect-opacity position-relative d-block border-bottom text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[2]->image_url }}" alt="{{ $brands[2]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[2]->image_dark_url }}" alt="{{ $brands[2]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
<a class="hover-effect-opacity position-relative d-block h-100 text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[3]->image_url }}" alt="{{ $brands[3]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[3]->image_dark_url }}" alt="{{ $brands[3]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<hr class="vr d-none d-md-block m-0">
</div>
<hr class="d-md-none m-0">
<div class="col-8 col-md-4">
<div class="row row-cols-2 g-0 border-bottom border-end">
<div class="col">
<a class="hover-effect-opacity position-relative d-block text-body" href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[4]->image_url}}" alt="{{ $brands[4]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[4]->image_dark_url }}" alt="{{ $brands[4]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<div class="col border-start">
<a class="hover-effect-opacity position-relative d-block h-100 text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[5]->image_url }}" alt="{{ $brands[5]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[5]->image_dark_url }}" alt="{{ $brands[5]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
</div>
<a class="hover-effect-opacity position-relative d-block h-100 border-end text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[6]->image_url }}" alt="{{ $brands[6]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[6]->image_dark_url }}" alt="{{ $brands[6]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<div class="col-4 col-md-2">
<a class="hover-effect-opacity position-relative d-block text-body border-bottom"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[7]->image_url }}" alt="{{ $brands[7]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[7]->image_dark_url }}" alt="{{ $brands[7]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
<a class="hover-effect-opacity position-relative d-block text-body" href="#!">
<img class="position-relative z-1 d-none-dark"
src="{{ $brands[8]->image_url }}" alt="{{ $brands[8]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<img class="position-relative z-1 d-none d-block-dark"
src="{{ $brands[8]->image_dark_url }}" alt="{{ $brands[8]->name }}" onerror="this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5ZWNlZiIvPjx0ZXh0IHg9IjUwIiB5PSI1NSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiBmaWxsPSIjNmM3NTdkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+PC9zdmc+'">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,97 @@
<!-- Special collection carousel -->
<section class="container pb-5 mb-2 mb-sm-3 mb-lg-4 mb-xl-5">
<div class="d-md-none text-center pb-3 mb-3">
<p class="mb-2">{{ __('new_arrivals.new_arrivals') }}</p>
<h2 class="mb-0">{{ __('new_arrivals.meet_the_collection', ['app' => config('app.name')]) }}</h2>
</div>
<div class="row align-items-center pb-xxl-3">
<!-- Preview images (controlled slider) -->
<div class="col-md-7 order-md-2 mb-4 mb-md-0">
<div class="swiper user-select-none" id="previewImages"
data-swiper='{
"allowTouchMove": false,
"loop": true,
"effect": "fade",
"fadeEffect": {
"crossFade": true
}
}'>
<div class="swiper-wrapper">
@foreach ($products as $key => $product)
<div class="swiper-slide">
<div class="ratio" style="--cz-aspect-ratio: calc(720 / 746 * 100%)">
<img src="{{ $product->image_url }}" class="rounded-5" alt="Image">
</div>
</div>
@endforeach
</div>
</div>
</div>
<!-- Products master slider -->
<div class="col-md-5 order-md-1 text-center">
<div class="d-none d-md-block pb-3 mb-2 mb-lg-3 mx-auto" style="max-width: 306px">
<p class="mb-2">{{ __('new_arrivals.new_arrivals') }}</p>
<h2 class="mb-0">{{ __('new_arrivals.meet_the_collection', ['app' => config('app.name')]) }}</h2>
</div>
<div class="d-flex align-items-center justify-content-center">
<!-- Prev button -->
<button type="button"
class="btn btn-icon btn-outline-secondary animate-slide-start rounded-circle mt-n5"
id="collectionPrev" aria-label="Prev">
<i class="ci-chevron-left fs-lg animate-target"></i>
</button>
<!-- Slider -->
<div class="swiper mx-3 mx-lg-4"
data-swiper='{
"spaceBetween": 24,
"loop": true,
"speed": 400,
"controlSlider": "#previewImages",
"navigation": {
"prevEl": "#collectionPrev",
"nextEl": "#collectionNext"
}
}'
style="max-width: 306px">
<div class="swiper-wrapper">
@foreach ($products as $key => $product)
<div class="swiper-slide">
<div class="animate-underline hover-effect-opacity">
<a class="d-flex bg-body-tertiary rounded p-3 mb-3"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="{{ $product->image_url }}" loading="lazy" class="w-100 h-100 object-cover">
</div>
</a>
<div class="nav justify-content-center mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">{{ $product->name }}</span>
</a>
</div>
<div class="h6 mb-0">{{ number_format($product->price, 0, ',', '.') }}</div>
</div>
</div>
@endforeach
</div>
</div>
<!-- Next button -->
<button type="button"
class="btn btn-icon btn-outline-secondary animate-slide-end rounded-circle mt-n5"
id="collectionNext" aria-label="Next">
<i class="ci-chevron-right fs-lg animate-target"></i>
</button>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,57 @@
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
@if ($product->display_discount_price > 0)
<span
class="badge text-bg-danger position-absolute top-0 start-0 z-2 mt-2 mt-sm-3 ms-2 ms-sm-3">Sale</span>
@endif
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('product.detail', $product->slug) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="{{ $product->image_url }}" loading="lazy" class="w-100 h-100 object-cover">
</div>
</a>
{{-- <div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XS</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">S</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="{{ route('second', ['shop', 'product-fashion']) }}">+3</a>
</div>
</div>
</div> --}}
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('product.detail', $product->slug) }}">
<span class="text-truncate">{{ $product->name ?? '' }}</span>
</a>
</div>
<div class="h6 mb-2">Rp {{ number_format($product->display_price,0,",",".") }} @if ($product->display_discount_price > 0)<del class="fs-sm fw-normal text-body-tertiary">Rp {{ number_format($product->display_discount_price,0,",",".") }}</del>@endif</div>
<div class="position-relative">
@if ($product->variants->count() > 1)
<div class=" fs-xs text-body-secondary opacity-100">+{{ $product->variants->count() - 1 }} Varian</div>
@endif
{{-- <div class="hover-effect-target fs-xs text-body-secondary opacity-100">+1 color</div> --}}
{{-- <div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-1" id="color-1-1" checked>
<label for="color-1-1" class="btn btn-color fs-base" style="color: #284971">
<span class="visually-hidden">Dark denim</span>
</label>
<input type="radio" class="btn-check" name="colors-1" id="color-1-2">
<label for="color-1-2" class="btn btn-color fs-base" style="color: #8b9bc4">
<span class="visually-hidden">Light denim</span>
</label>
</div> --}}
</div>
</div>

View File

@ -0,0 +1,35 @@
<section class="container pb-5 mb-2 mb-sm-3 mb-lg-4 mb-xl-5">
<h2 class="text-center pb-2 pb-sm-3">{{ __('weeks_highlights.this_weeks_highlights') }}</h2>
<!-- Nav pills -->
<div class="row g-0 overflow-x-auto pb-2 pb-sm-3 mb-3">
<div class="col-auto pb-1 pb-sm-0 mx-auto">
<ul class="nav nav-pills flex-nowrap text-nowrap">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#!">{{ __('weeks_highlights.best_sellers') }}</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#!">{{ __('weeks_highlights.new_arrivals') }}</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#!">{{ __('weeks_highlights.sale_items') }}</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#!">{{ __('weeks_highlights.top_rated') }}</a>
</li>
</ul>
</div>
</div>
<!-- Products grid -->
<div class="row row-cols-2 row-cols-md-3 row-cols-lg-4 gy-4 gy-md-5 pb-xxl-3">
<!-- Item -->
@foreach ($products as $key => $product)
<div class="col mb-2 mb-sm-3 mb-md-0">
<x-home.product-card :product="$product" />
</div>
@endforeach
</div>
</section>

View File

@ -0,0 +1,48 @@
<!-- Language selector for sidebar/offcanvas -->
<div class="dropdown nav">
<a class="nav-link dropdown-toggle py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="{{ __('languages.Country select') }}: {{ app()->getLocale() === 'en' ? 'USA' : 'Indonesia' }}">
<div class="ratio ratio-1x1" style="width: 20px">
<img src="/img/flags/{{ app()->getLocale() === 'en' ? 'en-us' : 'id' }}.png" alt="{{ app()->getLocale() === 'en' ? 'USA' : 'Indonesia' }}">
</div>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li>
<a class="dropdown-item {{ app()->getLocale() === 'en' ? 'active' : '' }}" href="#" onclick="switchLanguageSidebar('en')">
<img src="/img/flags/en-us.png" class="flex-shrink-0 me-2" width="20" alt="United States">
{{ __('languages.en') }}
</a>
</li>
<li>
<a class="dropdown-item {{ app()->getLocale() === 'id' ? 'active' : '' }}" href="#" onclick="switchLanguageSidebar('id')">
<img src="/img/flags/id.png" class="flex-shrink-0 me-2" width="20" alt="Indonesia">
{{ __('languages.id') }}
</a>
</li>
</ul>
</div>
<script>
function switchLanguageSidebar(locale) {
// Store language in session via AJAX
fetch('/locale/switch', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
},
body: JSON.stringify({
locale: locale
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Reload page to reflect changes
window.location.reload();
}
})
.catch(error => console.error('Error switching language:', error));
}
</script>

View File

@ -0,0 +1,48 @@
<!-- Country selector visible on screens > 768px wide (md breakpoint) -->
<div class="dropdown d-none d-md-block nav">
<a class="nav-link dropdown-toggle py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="{{ __('messages.Country select') }}: {{ app()->getLocale() === 'en' ? 'USA' : 'Indonesia' }}">
<div class="ratio ratio-1x1" style="width: 20px">
<img src="/img/flags/{{ session('locale') === 'en' ? 'en-us' : 'id' }}.png" alt="{{ session('locale') === 'en' ? 'USA' : 'Indonesia' }}">
</div>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li>
<a class="dropdown-item {{ session('locale') === 'en' ? 'active' : '' }}" href="#" onclick="switchLanguage('en')">
<img src="/img/flags/en-us.png" class="flex-shrink-0 me-2" width="20" alt="United States">
{{ __('languages.en') }}
</a>
</li>
<li>
<a class="dropdown-item {{ session('locale') === 'id' ? 'active' : '' }}" href="#" onclick="switchLanguage('id')">
<img src="/img/flags/id.png" class="flex-shrink-0 me-2" width="20" alt="Indonesia">
{{ __('languages.id') }}
</a>
</li>
</ul>
</div>
<script>
function switchLanguage(locale) {
// Store language in session via AJAX
fetch('/locale/switch', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
},
body: JSON.stringify({
locale: locale
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Reload page to reflect changes
window.location.reload();
}
})
.catch(error => console.error('Error switching language:', error));
}
</script>

View File

@ -0,0 +1,44 @@
<!-- Location selector for sidebar -->
<div class="dropdown nav">
<a class="nav-link animate-underline dropdown-toggle fw-normal py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="animate-target location-name-sidebar">{{ $selected->display_name ?? '-'}}</span>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
@foreach ($locations as $loc)
<li>
<a class="dropdown-item" href="#"
onclick="selectLocationSidebar({{ $loc->id }}, '{{ $loc->display_name }}')">
{{ $loc->display_name }}
</a>
</li>
@endforeach
</ul>
</div>
<script>
function selectLocationSidebar(locationId, locationName) {
// Store location in session via AJAX
fetch('/location/select', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
},
body: JSON.stringify({
location_id: locationId
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Update the displayed location
document.querySelector('.location-name-sidebar').textContent = locationName;
// Reload page to reflect changes
window.location.reload();
}
})
.catch(error => console.error('Error selecting location:', error));
}
</script>

View File

@ -0,0 +1,44 @@
<!-- City selector visible on screens > 768px wide (md breakpoint) -->
<div class="dropdown d-none d-md-block nav">
<a class="nav-link animate-underline dropdown-toggle fw-normal py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="animate-target location-name">{{ $selected->display_name ?? '-'}}</span>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
@foreach ($locations as $loc)
<li>
<a class="dropdown-item" href="#"
onclick="selectLocation({{ $loc->id }}, '{{ $loc->display_name }}')">
{{ $loc->display_name }}
</a>
</li>
@endforeach
</ul>
</div>
<script>
function selectLocation(locationId, locationName) {
// Store location in session via AJAX
fetch('/location/select', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
},
body: JSON.stringify({
location_id: locationId
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Update the displayed location
document.querySelector('.location-name').textContent = locationName;
// Reload page to reflect changes
window.location.reload();
}
})
.catch(error => console.error('Error selecting location:', error));
}
</script>

View File

@ -1,4 +1,4 @@
@extends('layouts.landing', ['title' => 'Fashion Store v.1']) @extends('layouts.landing', ['title' => 'AsiaGolf Store'])
@section('content') @section('content')
<div class="offcanvas offcanvas-end pb-sm-2 px-sm-2" id="shoppingCart" tabindex="-1" aria-labelledby="shoppingCartLabel" <div class="offcanvas offcanvas-end pb-sm-2 px-sm-2" id="shoppingCart" tabindex="-1" aria-labelledby="shoppingCartLabel"
@ -198,57 +198,19 @@
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<!-- Country slect visible on screens > 768px wide (md breakpoint) --> <!-- Country selector visible on screens > 768px wide (md breakpoint) -->
<div class="dropdown d-none d-md-block nav"> <x-language-selector />
<a class="nav-link dropdown-toggle py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Country select: USA">
<div class="ratio ratio-1x1" style="width: 20px">
<img src="/img/flags/en-us.png" alt="USA">
</div>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/en-uk.png" class="flex-shrink-0 me-2" width="20" alt="United Kingdom">
United Kingdom
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/fr.png" class="flex-shrink-0 me-2" width="20" alt="France">
France
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/de.png" class="flex-shrink-0 me-2" width="20" alt="Deutschland">
Deutschland
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/it.png" class="flex-shrink-0 me-2" width="20" alt="Italia">
Italia
</a>
</li>
</ul>
</div>
<!-- City slect visible on screens > 768px wide (md breakpoint) --> <!-- LOcation selector visible on screens > 768px wide (md breakpoint) -->
<div class="dropdown d-none d-md-block nav"> <x-location-selector />
<a class="nav-link animate-underline dropdown-toggle fw-normal py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="animate-target">Washington</span>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li><a class="dropdown-item" href="#!">Chicago</a></li>
<li><a class="dropdown-item" href="#!">Los Angeles</a></li>
<li><a class="dropdown-item" href="#!">New York</a></li>
<li><a class="dropdown-item" href="#!">Philadelphia</a></li>
</ul>
</div>
</div> </div>
<!-- Navbar brand (Logo) --> <!-- Navbar brand (Logo) -->
<a class="navbar-brand fs-2 py-0 m-0 me-auto me-sm-n5" href="/">Cartzilla</a> <a class="navbar-brand fs-2 py-0 m-0 me-auto me-sm-n5" href="/">
<img src="{{ asset('logo/logo-colored.png') }}" class="d-none d-lg-block" style="height:32px;"/>
<img src="{{ asset('logo/logo-app.png') }}" class="d-lg-none" style="height:42px;"/>
</a>
<!-- Button group --> <!-- Button group -->
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -329,52 +291,10 @@
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div> </div>
<!-- Country and City slects visible on screens < 768px wide (md breakpoint) --> <!-- Country and City selects visible on screens < 768px wide (md breakpoint) -->
<div class="offcanvas-header gap-3 d-md-none pt-0 pb-3"> <div class="offcanvas-header gap-3 d-md-none pt-0 pb-3">
<div class="dropdown nav"> <x-language-selector-sidebar />
<a class="nav-link dropdown-toggle py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Country select: USA"> <x-location-selector-sidebar />
<div class="ratio ratio-1x1" style="width: 20px">
<img src="/img/flags/en-us.png" alt="USA">
</div>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/en-uk.png" class="flex-shrink-0 me-2" width="20" alt="United Kingdom">
United Kingdom
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/fr.png" class="flex-shrink-0 me-2" width="20" alt="France">
France
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/de.png" class="flex-shrink-0 me-2" width="20" alt="Deutschland">
Deutschland
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/it.png" class="flex-shrink-0 me-2" width="20" alt="Italia">
Italia
</a>
</li>
</ul>
</div>
<div class="dropdown nav">
<a class="nav-link animate-underline dropdown-toggle fw-normal py-1 px-0" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="animate-target">Washington</span>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li><a class="dropdown-item" href="#!">Chicago</a></li>
<li><a class="dropdown-item" href="#!">Los Angeles</a></li>
<li><a class="dropdown-item" href="#!">New York</a></li>
<li><a class="dropdown-item" href="#!">Philadelphia</a></li>
</ul>
</div>
</div> </div>
<div class="offcanvas-body pt-1 pb-3 py-lg-0"> <div class="offcanvas-body pt-1 pb-3 py-lg-0">
<div class="container pb-lg-2 px-0 px-lg-3"> <div class="container pb-lg-2 px-0 px-lg-3">
@ -1345,628 +1265,14 @@
<!-- Featured products --> <!-- Featured products -->
<section class="container pb-5 mb-2 mb-sm-3 mb-lg-4 mb-xl-5"> <x-home.product-highlight />
<h2 class="text-center pb-2 pb-sm-3">This week's highlights</h2>
<!-- Nav pills -->
<div class="row g-0 overflow-x-auto pb-2 pb-sm-3 mb-3">
<div class="col-auto pb-1 pb-sm-0 mx-auto">
<ul class="nav nav-pills flex-nowrap text-nowrap">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#!">Best sellers</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#!">New arrivals</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#!">Sale items</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#!">Top rated</a>
</li>
</ul>
</div>
</div>
<!-- Products grid -->
<div class="row row-cols-2 row-cols-md-3 row-cols-lg-4 gy-4 gy-md-5 pb-xxl-3">
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<span
class="badge text-bg-danger position-absolute top-0 start-0 z-2 mt-2 mt-sm-3 ms-2 ms-sm-3">Sale</span>
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/01.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XS</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">S</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="{{ route('second', ['shop', 'product-fashion']) }}">+3</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Denim midi skirt with pockets</span>
</a>
</div>
<div class="h6 mb-2">$126.50 <del class="fs-sm fw-normal text-body-tertiary">$156.00</del></div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+1 color</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-1" id="color-1-1" checked>
<label for="color-1-1" class="btn btn-color fs-base" style="color: #284971">
<span class="visually-hidden">Dark denim</span>
</label>
<input type="radio" class="btn-check" name="colors-1" id="color-1-2">
<label for="color-1-2" class="btn btn-color fs-base" style="color: #8b9bc4">
<span class="visually-hidden">Light denim</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/08.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">6.5</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">7</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">7.5</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">8</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="{{ route('second', ['shop', 'product-fashion']) }}">+3</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Leather sneakers with golden laces</span>
</a>
</div>
<div class="h6 mb-2">$74.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+2 colors</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-8" id="color-8-1" checked>
<label for="color-8-1" class="btn btn-color fs-base" style="color: #b1aa9b">
<span class="visually-hidden">Cream</span>
</label>
<input type="radio" class="btn-check" name="colors-8" id="color-8-2">
<label for="color-8-2" class="btn btn-color fs-base" style="color: #496c33">
<span class="visually-hidden">Dark green</span>
</label>
<input type="radio" class="btn-check" name="colors-8" id="color-8-3">
<label for="color-8-3" class="btn btn-color fs-base" style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="#!">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/11.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">S</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XL</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2" href="#!">+1</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0" href="#!">
<span class="text-truncate">Warm sweatshirts without a hoodie</span>
</a>
</div>
<div class="h6 mb-2">$32.99</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+2 colors</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-11" id="color-11-1" checked>
<label for="color-11-1" class="btn btn-color fs-base" style="color: #42675f">
<span class="visually-hidden">Green</span>
</label>
<input type="radio" class="btn-check" name="colors-11" id="color-11-2">
<label for="color-11-2" class="btn btn-color fs-base" style="color: #476585">
<span class="visually-hidden">Blue</span>
</label>
<input type="radio" class="btn-check" name="colors-11" id="color-11-3">
<label for="color-11-3" class="btn btn-color fs-base" style="color: #724c74">
<span class="visually-hidden">Purple</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/04.png" alt="Image">
</div>
</a>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Knitted bag with a wooden handle</span>
</a>
</div>
<div class="h6 mb-2">$105.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+1 color</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-4" id="color-4-1" checked>
<label for="color-4-1" class="btn btn-color fs-base" style="color: #e7ddb4">
<span class="visually-hidden">Beige</span>
</label>
<input type="radio" class="btn-check" name="colors-4" id="color-4-2">
<label for="color-4-2" class="btn btn-color fs-base" style="color: #8b9bc4">
<span class="visually-hidden">Blue</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/09.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XS</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">S</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="{{ route('second', ['shop', 'product-fashion']) }}">+3</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">White cotton blouse with necklace</span>
</a>
</div>
<div class="h6 mb-2">$38.50</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+1 color</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-9" id="color-9-1" checked>
<label for="color-9-1" class="btn btn-color fs-base" style="color: #e0e5eb">
<span class="visually-hidden">White</span>
</label>
<input type="radio" class="btn-check" name="colors-9" id="color-9-2">
<label for="color-9-2" class="btn btn-color fs-base" style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/10.png" alt="Image">
</div>
</a>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Leather handbag for women</span>
</a>
</div>
<div class="h6 mb-2">$140.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+2 colors</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-10" id="color-10-1" checked>
<label for="color-10-1" class="btn btn-color fs-base" style="color: #869286">
<span class="visually-hidden">Olive</span>
</label>
<input type="radio" class="btn-check" name="colors-10" id="color-10-2">
<label for="color-10-2" class="btn btn-color fs-base" style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
<input type="radio" class="btn-check" name="colors-10" id="color-10-3">
<label for="color-10-3" class="btn btn-color fs-base" style="color: #526f99">
<span class="visually-hidden">Blue</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<span
class="badge text-bg-danger position-absolute top-0 start-0 z-2 mt-2 mt-sm-3 ms-2 ms-sm-3">-17%</span>
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/05.png" alt="Image">
</div>
</a>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Polarized sunglasses for men</span>
</a>
</div>
<div class="h6 mb-2">$96.00 <del class="fs-sm fw-normal text-body-tertiary">$112.00</del></div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+2 colors</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-5" id="color-5-1" checked>
<label for="color-5-1" class="btn btn-color fs-base" style="color: #8cc4ac">
<span class="visually-hidden">Green</span>
</label>
<input type="radio" class="btn-check" name="colors-5" id="color-5-2">
<label for="color-5-2" class="btn btn-color fs-base" style="color: #8cb7c4">
<span class="visually-hidden">Blue</span>
</label>
<input type="radio" class="btn-check" name="colors-5" id="color-5-3">
<label for="color-5-3" class="btn btn-color fs-base" style="color: #ccb782">
<span class="visually-hidden">Brown</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col mb-2 mb-sm-3 mb-md-0">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/06.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<span class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XL</span>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Classic cotton men's shirt</span>
</a>
</div>
<div class="h6 mb-2">$27.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+3 colors</div>
<div class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-6" id="color-6-1" checked>
<label for="color-6-1" class="btn btn-color fs-base" style="color: #c1cde7">
<span class="visually-hidden">Blue</span>
</label>
<input type="radio" class="btn-check" name="colors-6" id="color-6-2">
<label for="color-6-2" class="btn btn-color fs-base" style="color: #526f99">
<span class="visually-hidden">Dark blue</span>
</label>
<input type="radio" class="btn-check" name="colors-6" id="color-6-3">
<label for="color-6-3" class="btn btn-color fs-base" style="color: #e0e5eb">
<span class="visually-hidden">White</span>
</label>
<input type="radio" class="btn-check" name="colors-6" id="color-6-4">
<label for="color-6-4" class="btn btn-color fs-base" style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Special collection carousel --> <!-- Special collection carousel -->
<section class="container pb-5 mb-2 mb-sm-3 mb-lg-4 mb-xl-5"> <x-home.new-arrivals />
<div class="d-md-none text-center pb-3 mb-3">
<p class="mb-2">New arrivals</p>
<h2 class="mb-0">Meet the Cartzilla collection</h2>
</div>
<div class="row align-items-center pb-xxl-3">
<!-- Preview images (controlled slider) -->
<div class="col-md-7 order-md-2 mb-4 mb-md-0">
<div class="swiper user-select-none" id="previewImages"
data-swiper='{
"allowTouchMove": false,
"loop": true,
"effect": "fade",
"fadeEffect": {
"crossFade": true
}
}'>
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="ratio" style="--cz-aspect-ratio: calc(720 / 746 * 100%)">
<img src="/img/home/fashion/v1/collection/01.jpg" class="rounded-5" alt="Image">
</div>
</div>
<div class="swiper-slide">
<div class="ratio" style="--cz-aspect-ratio: calc(720 / 746 * 100%)">
<img src="/img/home/fashion/v1/collection/02.jpg" class="rounded-5" alt="Image">
</div>
</div>
</div>
</div>
</div>
<!-- Products master slider -->
<div class="col-md-5 order-md-1 text-center">
<div class="d-none d-md-block pb-3 mb-2 mb-lg-3 mx-auto" style="max-width: 306px">
<p class="mb-2">New arrivals</p>
<h2 class="mb-0">Meet the Cartzilla collection</h2>
</div>
<div class="d-flex align-items-center justify-content-center">
<!-- Prev button -->
<button type="button"
class="btn btn-icon btn-outline-secondary animate-slide-start rounded-circle mt-n5"
id="collectionPrev" aria-label="Prev">
<i class="ci-chevron-left fs-lg animate-target"></i>
</button>
<!-- Slider -->
<div class="swiper mx-3 mx-lg-4"
data-swiper='{
"spaceBetween": 24,
"loop": true,
"speed": 400,
"controlSlider": "#previewImages",
"navigation": {
"prevEl": "#collectionPrev",
"nextEl": "#collectionNext"
}
}'
style="max-width: 306px">
<div class="swiper-wrapper">
<!-- Item -->
<div class="swiper-slide">
<div class="animate-underline hover-effect-opacity">
<a class="d-flex bg-body-tertiary rounded p-3 mb-3"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/03.png" alt="Image">
</div>
</a>
<div class="nav justify-content-center mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Sneakers with a massive sole</span>
</a>
</div>
<div class="h6 mb-0">$86.50</div>
</div>
</div>
<!-- Item -->
<div class="swiper-slide">
<div class="animate-underline hover-effect-opacity">
<a class="d-flex bg-body-tertiary rounded p-3 mb-3"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/12.png" alt="Image">
</div>
</a>
<div class="nav justify-content-center mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('second', ['shop', 'product-fashion']) }}">
<span class="text-truncate">Single breasted oversized blazer</span>
</a>
</div>
<div class="h6 mb-0">$113.99</div>
</div>
</div>
</div>
</div>
<!-- Next button -->
<button type="button"
class="btn btn-icon btn-outline-secondary animate-slide-end rounded-circle mt-n5"
id="collectionNext" aria-label="Next">
<i class="ci-chevron-right fs-lg animate-target"></i>
</button>
</div>
</div>
</div>
</section>
<!-- Brands --> <!-- Brands -->
<section class="container pb-5 mb-1 mb-sm-3 mb-lg-4 mb-xl-5"> <x-home.brand-home template="fashion-v1" />
<div class="swiper my-md-3"
data-swiper='{
"slidesPerView": 2,
"pagination": {
"el": ".swiper-pagination",
"clickable": true
},
"breakpoints": {
"500": {
"slidesPerView": 3
},
"768": {
"slidesPerView": 4,
"spaceBetween": 12
},
"992": {
"slidesPerView": 5,
"spaceBetween": 20
},
"1200": {
"slidesPerView": 6,
"spaceBetween": 24
}
}
}'>
<div class="swiper-wrapper">
<!-- Item -->
<a class="swiper-slide text-body" href="#!" aria-label="Brooks">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196 64" fill="currentColor">
<path fill-rule="evenodd"
d="M67.948 22.154c.155.003.33-.006.515-.016 1.226-.065 2.921-.155 2.515 3.051-.516 4.184-1.79 4.467-2.733 4.677l-.041.009-.06.014c-.209-.027-.342-.088-.454-.14l-.132-.056-14.174-7.832c-.665-.346-.79.119-.587.392l8.016 8.616c-11.176 1.731-20.193 11.654-20.528 12.14-.378.442-.414.798.098.783h11.046c2.662-6.303 14.636-11.3 16.422-11.259.603-.041 2.599.067 1.76 4.699-.802 4.647-3.082 5.146-4.203 5.189-.696-.042-1.088-.47-.978-1.371l1.368-6.951c-1.264.535-4.65 2.105-5.376 2.643l-.782 4.797c-.156.683-.631.761-1.235.859l-.134.022c-.759.171-1.258 1.493-.098 1.468l3.652-.192h.001 0 0l.061-.004a110 110 0 0 1 2.388.202l1.034.092c3.464.212 8.382-1.108 9.286-6.853.272-1.609-.013-4.535-3.03-5.776-.332-.008-.261-.294-.098-.294.194 0 3.864-1.498 4.301-5.189.635-4.818-3.965-5.305-5.669-5.189l-4.496.196-.794-.034c-.858-.04-1.965-.091-2.92-.064-.919-.036-1.096 1.392 0 1.371.756.021 1.149.485 1.075 1.273l-.391 2.252 4.301 2.448 1.075-5.972zM120.538 20c-2.894.034-9.024 3.246-10.557 11.553-1.603 8.397 1.248 12.466 6.06 12.727 4.738.168 9.3-3.83 11.046-11.161 1.675-7.374-2.315-13.085-6.549-13.119zm-.754 4.735c-1.744.021-5.374 1.981-6.311 7.052-.921 5.125.768 7.609 3.59 7.768 2.835.103 5.537-2.338 6.543-6.812 1.021-4.501-1.343-7.987-3.822-8.008zM102.259 20c-2.944.034-9.073 3.246-10.655 11.553-1.554 8.397 1.297 12.466 6.06 12.727 4.787.168 9.348-3.83 11.046-11.161 1.724-7.374-2.266-13.085-6.451-13.119zm-.78 4.735c-1.744.021-5.374 1.981-6.311 7.052-.921 5.125.768 7.609 3.59 7.768 2.836.102 5.538-2.338 6.543-6.812 1.021-4.501-1.342-7.987-3.821-8.008zm41.249 19.055c.9.194 3.018.576 4.496.49 1.699-.046 6.254-1.175 8.016-6.266 1.453-4.417-1.398-7.273-2.053-7.832-.064-.059-.157-.142-.273-.245-1.023-.912-3.814-3.401-3.833-4.944.021-1.513 1.196-3.138 3.031-3.133 1.871-.005 2.477 2.493 2.834 4.797.106.835.963 1.123 1.076.392l.879-4.699c.041-.46.005-.638-.195-.783h-.001c-.94-.641-1.724-1.176-4.105-1.174-2.465.07-5.85 1.819-6.94 4.014-1.851 3.795-.086 7.051.587 7.832.752.788 3.421 3.329 3.421 3.329.933 1.134 2.25 3.206.489 6.07a3.18 3.18 0 0 1-1.236 1.062c-.498.24-1.049.347-1.599.309-.893-.059-2.319-.201-2.444-5.874-.016-1.251-1.372-1.465-1.759 0l-.88 4.993c-.051-.169-.117-.332-.196-.489l-4.007-13.413 1.564-1.86c3.444-4.117 5.047-4.331 5.865-4.308 1 .055.751-1.309.099-1.273-.321-.018-.857-.009-1.365 0-.491.009-.957.017-1.178 0-.27.018-.954.009-1.665 0h-1.854c-.771-.036-.95 1.32.098 1.273 1.019-.023.806 1.189.391 1.664l-6.061 7.245c-.153.17-.474.098-.391-.196l1.271-7.245c.215-.884 1.07-1.421 1.857-1.469.78-.023.675-1.309 0-1.273-1.236-.027-2.346.026-3.179.066l-.731.032-.816-.034c-.86-.04-1.958-.09-2.898-.064-.932-.036-.968 1.356.097 1.371.789-.015 1.038.485.978 1.273l-3.324 18.112c-.169.691-.654.762-1.341.863l-.125.019c-.674.171-1.173 1.493 0 1.468l3.526-.185h0l.189-.011c.227.014.639.03 1.111.049h.001c.995.04 2.254.09 2.602.147.557-.011.878-1.046.098-1.273-.859-.273-1.393-.666-1.271-1.566l1.564-8.028h.88l2.444 8.322.021.133.001.002c.108.657.161.975-.511 1.039-.815.109-.958 1.287-.098 1.273.78.015 2.561-.057 3.421-.099l.463.027h0c.768.047 1.79.11 2.665.072.074.007.139.004.195.001.037-.002.071-.003.099-.001zM81.633 33.315h1.271l1.564 9.986c.057.326.2.504.489.489h5.474c.831.015.759-1.233 0-1.371-.81-.149-1.093-.684-1.271-1.567L88.183 34c-.2-1.296-1.02-1.653-1.955-1.666-.275.013-.205-.273 0-.294.151.021 5.212-1.3 5.572-6.168.424-4.841-4.244-5.305-5.963-5.189a172.57 172.57 0 0 1-4.496.196l-.789-.034h0c-.847-.04-1.936-.091-2.828-.064-1.004-.036-1.181 1.392-.098 1.371.771.021 1.162.485 1.075 1.273l-3.324 18.112c-.143.685-.619.761-1.236.86l-.132.021c-.745.171-1.243 1.493-.098 1.468l3.715-.196c.236.014.652.03 1.128.049 1.009.04 2.288.09 2.684.147.487-.011.806-1.046 0-1.273-.832-.272-1.367-.666-1.271-1.566l1.466-7.733zm2.053-11.161a11.27 11.27 0 0 0 .333-.001c1.191-.014 2.793-.034 2.6 3.428-.204 3.983-1.898 6.107-4.692 6.07l1.76-9.497z" />
</svg>
</a>
<!-- Item -->
<a class="swiper-slide text-body" href="#!" aria-label="Fila">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196 64" fill="currentColor">
<path
d="M91.079 41.202c0 1.904-1.653 3.448-3.691 3.448s-3.692-1.544-3.692-3.448V23.753c0-1.904 1.653-3.448 3.692-3.448s3.691 1.543 3.691 3.448v17.449zM61.692 27.277c-2.039 0-3.692-1.544-3.692-3.448s1.653-3.448 3.692-3.448h15.907c2.038 0 3.691 1.544 3.691 3.448s-1.653 3.448-3.691 3.448H61.692zm14.847 8.915c2.038 0 3.691-1.544 3.691-3.448s-1.653-3.448-3.691-3.448H61.774c-2.039 0-3.691 1.543-3.691 3.448v8.458c0 1.904 1.653 3.448 3.691 3.448s3.692-1.544 3.692-3.448v-5.029l11.073.02zm55.224 8.486c3.249 0 5.883-2.499 5.883-5.534 0-1.138-.371-2.195-1.005-3.073l-9.531-14.5c-.657-.946-1.799-1.572-3.097-1.572-1.339 0-2.511.666-3.158 1.663l-10.301 15.501h-9.523V23.829c0-1.905-1.653-3.448-3.692-3.448s-3.691 1.544-3.691 3.448v17.372c0 1.904 1.653 3.448 3.691 3.448h13.582c1.673.018 3.344-.858 4.568-2.649l8.524-12.762 5.71 8.495-7.994.019c-2.038 0-3.691 1.543-3.691 3.448s1.653 3.448 3.691 3.448l10.034.029z" />
</svg>
</a>
<!-- Item -->
<a class="swiper-slide text-body" href="#!" aria-label="Zara">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196 64" fill="currentColor">
<path
d="M137.486 48.905l-13.038-35.881-.008-.024h-.258l-2.685 7.374-4.887 13.424-.012-.011c-1.694-1.494-4.084-2.428-7.094-2.776l-.918-.095.911-.117c4.964-.892 8.3-4.025 8.3-7.801 0-5.177-4.871-8.791-11.849-8.791H91.429v.262h4.219v26.752L85.402 13.024 85.393 13h-.257l-2.685 7.374-10.355 28.439-.064.007a11.2 11.2 0 0 1-.525.052c-.26.02-.519.033-.779.033H60.264L80.153 14.47l.148-.259H55.976v10.652h.258c.046-5.189 3.069-10.394 9.748-10.394h8.058L54 49.163h26.997V38.957h-.258c-.035 4.522-2.6 8.818-8.177 9.788l-.177.03 4.247-11.67H88.53l4.287 11.8h-4.229v.258h16.6v-.258h-4.247V31.106h4.901c4.987 0 7.848 2.227 7.848 6.109v3.157c0 .348.023.857.049 1.282v.015l-2.634 7.234h-3.441v.258h7.123v-.258h-3.404l2.399-6.587.007.102.066.594.064.393c.4 2.429 1.33 4.215 2.762 5.307l.206.149c1.088.756 2.439 1.139 4.02 1.139 2.093 0 3.489-.522 4.642-1.75l-.151-.142c-1.062.98-1.953 1.377-3.07 1.377-1.902 0-2.898-2.307-2.898-4.581V40.48c.01-1.098-.162-2.189-.509-3.231l-.047-.137v-.005h8.703l4.287 11.8h-4.229v.258H142v-.258l-4.514-.002zM76.727 36.848l5.861-16.097 5.848 16.097h-11.71zm24.216-6V14.47h3.741c4.998 0 7.636 2.97 7.636 8.584 0 5.972-1.515 7.793-6.478 7.793h-4.899zm17.83 6l-.026-.064a8 8 0 0 0-1.659-2.531l-.245-.245-.026-.025 4.814-13.232 5.849 16.097h-8.707z" />
</svg>
</a>
<!-- Item -->
<a class="swiper-slide text-body" href="#!" aria-label="New Balance">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196 64" fill="currentColor">
<path
d="M79.909 30.295l10.34-.366-.522.907-9.818-.542zm-1.261 2.158l10.364-.366-.51.91-9.854-.544zm-1.224 2.17l10.351-.361-.509.904-9.842-.543zm-1.224 2.17l10.364-.367-.534.909-9.831-.542zm9.837-17.287l13.197-.466.037 1.196-13.235-.73zm1.258-2.195l11.855-.413.037 1.09-11.893-.677zm1.208-2.133l10.563-.345.051.93-10.614-.585zm1.233-2.158l9.259-.307.037.852-9.295-.545zM90.881 11h8.053l.012.425L90.881 11zM74.976 38.962l10.339-.372-.211.372H74.976zm30.478-27.893h14.901c5.791.012 7.033 3.443 6.289 6.799-.821 3.695-4.971 6.367-7.357 6.91 4.275 1.382 4.275 4.146 3.379 7.206s-5.666 6.91-10.984 6.91H91.624l-.025-.593 6.151-.221c.124 0 .124-.148.037-.161l-6.213-.343-.049-1.38 7.444-.264c.149 0 .124-.16.037-.172l-7.519-.415-.038-1.255 8.749-.305c.149 0 .112-.173.025-.185l-8.823-.487-.05-1.144 10.102-.356c.137 0 .1-.148.026-.16l-10.165-.561-.037-1.022 11.408-.404c.149 0 .087-.16.025-.173l-21.474-1.184 22.668-.801c.185-.012.099-.173.012-.185L82.44 25.939l22.704-.814c.149 0 .125-.16.025-.16L83.695 23.78l22.666-.802c.15 0 .162-.173.026-.173L84.913 21.62l22.63-.753c.15 0 .136-.136.025-.148l-7.381-.407.758-1.302 7.854-.278c.149 0 .161-.148 0-.16l-7.369-.419.745-1.318 7.854-.273c.161 0 .161-.136 0-.148l-7.394-.408.732-1.261 7.867-.257c.087 0 .112-.136.012-.148l-7.406-.434.758-1.316 7.854-.261c.125 0 .125-.123.037-.123l-7.456-.393.422-.743zm-1.352 21.43h6.164c4.324 0 6.611-6.12 1.889-6.12h-4.573l-3.48 6.12zm10.563-10.514c1.887 0 3.379-1.876 3.579-2.616s.098-2.418-2.884-2.517h-2.336l-2.933 5.133h4.574zm23.893 21.419c2.389 0 4.375 1.986 4.375 4.358 0 .308-.032.539-.11 1.016h-6.545c.295.986 1.21 1.679 2.233 1.679.808 0 1.396-.323 1.846-1.031h2.265c-.512 1.679-2.234 2.91-4.048 2.91-.587.002-1.169-.11-1.712-.332a4.45 4.45 0 0 1-1.452-.961c-.415-.412-.744-.902-.968-1.441s-.338-1.117-.335-1.7c0-2.479 2.001-4.497 4.451-4.497zm.031 1.87c-1.147 0-2.078.739-2.372 1.894h4.699c-.279-1.17-1.178-1.894-2.327-1.894zm-25.059-.767v-.692h2.064v8.321h-1.893v-1.093c-.79.893-1.628 1.145-2.729 1.145-2.497 0-4.182-2.085-4.182-4.41 0-2.464 1.904-4.358 4.138-4.358 1.008 0 1.951.394 2.602 1.087zm-4.15 5.161a2.61 2.61 0 0 0 3.678 0c.487-.484.761-1.141.761-1.826s-.274-1.342-.761-1.826a2.61 2.61 0 0 0-3.678 0 2.57 2.57 0 0 0 0 3.652zm-54.472-5.247c.714-.724 1.365-1.017 2.218-1.017 1.163 0 2.295.693 2.776 1.709.326.678.419 1.247.419 2.449v4.574h-2.063v-4.173c0-1.047-.155-2.68-1.582-2.68-1.52 0-1.613 1.741-1.613 2.834v4.02H53v-8.532h1.908v.816zm10.661-1.016a4.41 4.41 0 0 1 4.374 4.358c0 .308-.031.539-.109 1.016h-6.545c.295.986 1.21 1.679 2.233 1.679.807 0 1.396-.323 1.846-1.031h2.264c-.512 1.679-2.233 2.91-4.048 2.91-.587.002-1.169-.111-1.712-.333a4.45 4.45 0 0 1-1.452-.961c-.415-.412-.744-.902-.968-1.441a4.39 4.39 0 0 1-.335-1.7c0-2.479 2.001-4.497 4.451-4.497zm.032 1.87c-1.148 0-2.079.739-2.373 1.894h4.7c-.279-1.17-1.179-1.894-2.327-1.894zm40.344 6.854h-2.062v-11.38h2.062v11.38zm12.873-7.708c.713-.724 1.365-1.017 2.218-1.017 1.164 0 2.296.693 2.776 1.709.326.678.419 1.247.419 2.449v4.574h-2.063v-4.173c0-1.047-.155-2.68-1.582-2.68-1.52 0-1.612 1.741-1.612 2.834v4.02h-2.064v-8.532h1.908v.816zm12.563 2.033c-.512-.862-1.055-1.17-2.001-1.17-1.365 0-2.388 1.093-2.388 2.586 0 1.479 1.069 2.587 2.512 2.587.776 0 1.395-.385 1.877-1.124h2.326c-.279.754-.435 1.031-.869 1.509-.429.468-.951.842-1.533 1.099a4.63 4.63 0 0 1-1.848.395c-2.497 0-4.529-2.033-4.529-4.496 0-2.449 2.017-4.435 4.529-4.435 1.986 0 3.614 1.217 4.25 3.049h-2.326zm-55.014-2.848l1.461 5.205 1.762-5.205h1.706l-2.751 8.531h-1.387l-1.628-5.528-1.675 5.528h-1.322l-2.869-8.531h1.82l1.746 5.205 1.477-5.205h1.66zm9.91.895c.651-.693 1.594-1.087 2.602-1.087 2.234 0 4.138 1.894 4.138 4.358 0 2.325-1.684 4.41-4.182 4.41-1.101 0-1.939-.252-2.73-1.145v1.093h-1.892v-11.38h2.063V44.5zm.473 5.168a2.61 2.61 0 0 0 3.678 0c.488-.484.762-1.141.762-1.826s-.274-1.342-.762-1.826a2.61 2.61 0 0 0-3.678 0c-.488.484-.762 1.141-.762 1.826s.274 1.342.762 1.826zm13.692-5.161v-.692h2.063v8.321h-1.892v-1.093c-.791.893-1.629 1.145-2.73 1.145-2.497 0-4.182-2.085-4.182-4.41 0-2.464 1.905-4.358 4.138-4.358 1.008 0 1.951.394 2.602 1.087zm-4.15 5.161a2.61 2.61 0 0 0 3.678 0c.488-.484.762-1.141.762-1.826s-.274-1.342-.762-1.826a2.61 2.61 0 0 0-3.678 0c-.488.484-.762 1.141-.762 1.826s.274 1.342.762 1.826z" />
</svg>
</a>
<!-- Item -->
<a class="swiper-slide text-body" href="#!" aria-label="Puma">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196 64" fill="currentColor">
<path
d="M82.282 40.849c0 .669.556 1.211 1.211 1.226.658-.015 1.214-.557 1.214-1.226L84.713 19h7.141v24.085c0 1.18-.938 2.144-2.111 2.144H77.249c-1.165 0-2.114-.963-2.114-2.144V19h7.148l-.002 21.849zM96.607 19h10.818 10.821c1.28 0 2.324 1.049 2.324 2.352v23.877h-7.154V23.327c-.006-.671-.552-1.203-1.213-1.203s-1.202.519-1.21 1.184v21.921h-7.127V23.308c-.015-.665-.55-1.184-1.218-1.184s-1.204.531-1.209 1.203v21.902h-7.155V21.352c0-1.303 1.043-2.352 2.323-2.352zm-32.248 3.124a1.23 1.23 0 0 1 1.21 1.249v10.786c.005.726-.58 1.231-1.21 1.231h-1.214V22.124h1.214zm-1.214 16.513h7.221c1.297 0 2.343-1.054 2.343-2.362V21.362c0-1.307-1.007-2.362-2.297-2.362H56v26.229h7.145v-6.591zm69.42-15.319v12.077h-2.428V23.337a1.21 1.21 0 0 1 1.211-1.199c.666 0 1.2.512 1.217 1.18zm0 15.326v6.585h7.145V21.352c0-1.303-1.043-2.352-2.326-2.352h-12.065c-1.28 0-2.323 1.049-2.323 2.352v23.877h7.141v-6.585h2.428z" />
</svg>
</a>
<!-- Item -->
<a class="swiper-slide text-body" href="#!" aria-label="Dior">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196 64" fill="currentColor">
<path
d="M56.667 14.837l-1.71-.087-.705-.139-.141-.262c0-.244.176-.348.529-.348h17.684c8.287 0 14.105 2.492 17.49 7.494 1.939 2.893 2.909 6.327 2.909 10.301a18.67 18.67 0 0 1-.97 6.013c-.74 2.039-1.763 3.835-3.085 5.439-1.446 1.69-3.209 2.998-5.237 3.956-2.169.976-4.602 1.481-7.334 1.481h-22.55c-.37 0-.547-.122-.547-.331 0-.227.265-.348.758-.348l4.32-.261c.67-.088 1.146-.28 1.375-.541l.441-.61c.159-.418.247-1.045.265-1.899V17.05c0-1.081-.617-1.743-1.816-2.005l-1.676-.209zm9.521.471l-.124.697v30.693c0 .348.071.592.212.68l.705.104h2.327l5.395-.192c1.446-.157 2.68-.383 3.65-.697.965-.348 1.868-.841 2.68-1.463.705-.575 1.428-1.395 2.222-2.44 1.322-1.708 2.274-3.887 2.856-6.553.352-1.742.529-3.433.529-5.054 0-1.429-.212-2.963-.652-4.619-.617-2.388-1.552-4.479-2.874-6.257-2.556-3.451-6.753-5.159-12.553-5.159h-3.579c-.405-.036-.67.052-.793.261zm30.008 33.116c-.035-.209.141-.296.529-.296l1.234-.035c.67-.087 1.076-.313 1.234-.662l.229-1.255V36.048c0-.383-.141-.68-.406-.854l-.917-.088-1.234.332-.67-.035c-.088-.209.176-.401.793-.575 1.463-.383 2.751-.871 3.844-1.481.67-.383 1.146-.593 1.357-.68l.529-.052c.177.034.265.383.265 1.01v12.758c0 .609.141 1.046.406 1.307.317.314 1.058.471 2.204.471.405 0 .616.088.652.279 0 .158-.123.21-.335.21h-9.398c-.212.001-.317-.086-.317-.225zm41.609-12.549c-.864.889-1.445 1.934-1.763 3.189v7.408c0 .662.229 1.133.705 1.429l1.076.191 1.128.122c.265.035.371.088.371.227l-.052.122-.3.088h-9.433c-.282 0-.44-.088-.44-.227l.264-.209 1.587-.122c.616-.105 1.005-.313 1.216-.627l.265-.784V36.223l-.177-.767-.299-.174c-.088-.087-.229-.139-.441-.174-.264-.017-.582.035-.916.174l-.899.244-.512-.122c-.088-.122-.053-.209.07-.261l.758-.314c1.728-.505 3.121-1.028 4.091-1.568l1.199-.645.529.034.211.436v3.834c1.323-2.126 2.381-3.433 3.104-3.869.44-.261.864-.471 1.181-.557l.617-.052c.388-.035.829.087 1.322.401.67.383 1.023.958 1.058 1.69.035.611-.142 1.082-.529 1.447-.353.296-.706.384-1.023.296-.299-.052-.529-.174-.687-.348l-.494-.609c-.388-.558-.758-.733-1.198-.575-.514.138-1.042.522-1.589 1.132zm-36.848-14.327c-.653 0-1.182.227-1.622.662-.476.436-.705.993-.671 1.639-.035.61.194 1.133.671 1.569.44.436.969.662 1.622.662.616 0 1.163-.227 1.604-.662s.687-.958.687-1.569a2.25 2.25 0 0 0-.687-1.639c-.441-.436-.988-.662-1.604-.662zm9.344 13.908a8.07 8.07 0 0 1 2.38-2.091 7.87 7.87 0 0 1 2.575-.959l3.262-.191c1.18.052 2.274.279 3.262.714 2.38 1.046 3.878 2.964 4.442 5.752.582 2.824.089 5.212-1.464 7.146-1.321 1.638-3.067 2.684-5.271 3.137-2.309.506-4.46.348-6.4-.435-2.522-1.011-4.055-3.016-4.549-5.944-.441-2.771.141-5.124 1.763-7.129zm10.331-.784c-1.075-1.185-2.433-1.708-4.073-1.569-1.586.157-2.802 1.028-3.596 2.684-.722 1.499-.988 3.33-.722 5.491.193 2.144.881 3.852 1.991 5.159 1.182 1.377 2.522 1.952 4.02 1.691a4.76 4.76 0 0 0 3.474-2.527c.74-1.429 1.004-3.277.828-5.63-.211-2.353-.828-4.097-1.922-5.299zm-24.559.767v.174l-.388-.244v.087l.035.157h-.053v-.332h.018l.352.262v-.262h.071l-.035.157z" />
</svg>
</a>
</div>
<!-- Pagination (Bullets) -->
<div class="swiper-pagination position-static mt-3"></div>
</div>
</section>
<!-- Reviews carousel --> <!-- Reviews carousel -->

View File

@ -2170,112 +2170,7 @@
</section> </section>
<!-- Brands --> <x-home.brand-home template="fashion-v2" />
<section class="container pt-5 mt-2 mt-sm-3 mt-lg-4 mt-xl-5">
<h3 class="text-center pb-2 pb-md-3">Shop by brand</h3>
<div class="row justify-content-center">
<div class="col-sm-10 col-md-12">
<div class="row g-0 border rounded-5 overflow-hidden">
<div class="col-8 col-md-4 d-flex flex-column border-end">
<a class="hover-effect-opacity position-relative d-block text-body border-bottom"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/zara-light.svg" alt="Zara">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/zara-dark.svg" alt="Zara">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
<a class="hover-effect-opacity position-relative d-block h-100 text-body" href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/brooks-light.svg" alt="Brooks">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/brooks-dark.svg" alt="Brooks">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<div class="col-4 col-md-2 d-flex">
<div class="d-flex flex-column w-100">
<a class="hover-effect-opacity position-relative d-block border-bottom text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/fila-light.svg" alt="Fila">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/fila-dark.svg" alt="Fila">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
<a class="hover-effect-opacity position-relative d-block h-100 text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/adidas-light.svg" alt="Adidas">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/adidas-dark.svg" alt="Adidas">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<hr class="vr d-none d-md-block m-0">
</div>
<hr class="d-md-none m-0">
<div class="col-8 col-md-4">
<div class="row row-cols-2 g-0 border-bottom border-end">
<div class="col">
<a class="hover-effect-opacity position-relative d-block text-body" href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/hermes-light.svg" alt="Hermes">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/hermes-dark.svg" alt="Hermes">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<div class="col border-start">
<a class="hover-effect-opacity position-relative d-block h-100 text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/dior-light.svg" alt="Dior">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/dior-dark.svg" alt="Dior">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
</div>
<a class="hover-effect-opacity position-relative d-block h-100 border-end text-body"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/newbalance-light.svg" alt="New Balance">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/newbalance-dark.svg" alt="New Balance">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
<div class="col-4 col-md-2">
<a class="hover-effect-opacity position-relative d-block text-body border-bottom"
href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/puma-light.svg" alt="Puma">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/puma-dark.svg" alt="Puma">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
<a class="hover-effect-opacity position-relative d-block text-body" href="#!">
<img class="position-relative z-1 d-none-dark"
src="/img/home/fashion/v2/brands/hm-light.svg" alt="H & M">
<img class="position-relative z-1 d-none d-block-dark"
src="/img/home/fashion/v2/brands/hm-dark.svg" alt="H & M">
<span
class="hover-effect-target position-absolute top-0 start-0 w-100 h-100 bg-body-tertiary opacity-0"></span>
</a>
</div>
</div>
</div>
</div>
</section>
<!-- Instagram feed --> <!-- Instagram feed -->

View File

@ -18,6 +18,8 @@
@vite(['resources/js/theme.js']) @vite(['resources/js/theme.js'])
@yield('scripts')
</body> </body>
</html> </html>

View File

@ -1,10 +1,13 @@
<meta charset="utf-8"> <meta charset="utf-8">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<!-- Viewport --> <!-- Viewport -->
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, viewport-fit=cover"> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, viewport-fit=cover">
<!-- SEO Meta Tags --> <!-- SEO Meta Tags -->
<title>Cartzilla | {{ $title }}</title> <title>{{ config('app.name') }} | {{ $title }}</title>
<meta name="description" content="Cartzilla - Multipurpose Bootstrap E-Commerce HTML Template"> <meta name="description" content="Cartzilla - Multipurpose Bootstrap E-Commerce HTML Template">
<meta name="keywords" <meta name="keywords"
content="online shop, e-commerce, online store, market, multipurpose, product landing, cart, checkout, ui kit, light and dark mode, bootstrap, html5, css3, javascript, gallery, slider, mobile, pwa"> content="online shop, e-commerce, online store, market, multipurpose, product landing, cart, checkout, ui kit, light and dark mode, bootstrap, html5, css3, javascript, gallery, slider, mobile, pwa">
@ -14,5 +17,5 @@
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="manifest" href="/manifest.json"> <link rel="manifest" href="/manifest.json">
<link rel="icon" type="image/png" href="/app-icons/icon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="{{ asset('logo/logo-app.png') }}" sizes="32x32">
<link rel="apple-touch-icon" href="/app-icons/icon-180x180.png"> <link rel="apple-touch-icon" href="{{ asset('app-icons/icon-180x180.png') }}">

View File

@ -605,60 +605,19 @@
</button> </button>
<!-- Country slect visible on screens > 768px wide (md breakpoint) --> <!-- Country slect visible on screens > 768px wide (md breakpoint) -->
<div class="dropdown d-none d-md-block nav"> <x-language-selector />
<a class="nav-link dropdown-toggle py-1 px-0" href="#" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="false" aria-label="Country select: USA">
<div class="ratio ratio-1x1" style="width: 20px">
<img src="/img/flags/en-us.png" alt="USA">
</div>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/en-uk.png" class="flex-shrink-0 me-2" width="20"
alt="United Kingdom">
United Kingdom
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/fr.png" class="flex-shrink-0 me-2" width="20" alt="France">
France
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/de.png" class="flex-shrink-0 me-2" width="20"
alt="Deutschland">
Deutschland
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/it.png" class="flex-shrink-0 me-2" width="20" alt="Italia">
Italia
</a>
</li>
</ul>
</div>
<!-- City slect visible on screens > 768px wide (md breakpoint) --> <!-- City slect visible on screens > 768px wide (md breakpoint) -->
<div class="dropdown d-none d-md-block nav"> <x-location-selector />
<a class="nav-link animate-underline dropdown-toggle fw-normal py-1 px-0" href="#"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="animate-target">Washington</span>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li><a class="dropdown-item" href="#!">Chicago</a></li>
<li><a class="dropdown-item" href="#!">Los Angeles</a></li>
<li><a class="dropdown-item" href="#!">New York</a></li>
<li><a class="dropdown-item" href="#!">Philadelphia</a></li>
</ul>
</div>
</div> </div>
<!-- Navbar brand (Logo) --> <!-- Navbar brand (Logo) -->
<a class="navbar-brand fs-2 py-0 m-0 me-auto me-sm-n5" href="{{ route('second', ['home', 'fashion-v1']) }}">Cartzilla</a> <a class="navbar-brand fs-2 py-0 m-0 me-auto me-sm-n5" href="/">
<img src="{{ asset('logo/logo-colored.png') }}" class="d-none d-lg-block" style="height:32px;"/>
<img src="{{ asset('logo/logo-app.png') }}" class="d-lg-none" style="height:42px;"/>
</a>
<!-- Button group --> <!-- Button group -->
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -757,56 +716,8 @@
<!-- Country and City slects visible on screens < 768px wide (md breakpoint) --> <!-- Country and City slects visible on screens < 768px wide (md breakpoint) -->
<div class="offcanvas-header gap-3 d-md-none pt-0 pb-3"> <div class="offcanvas-header gap-3 d-md-none pt-0 pb-3">
<div class="dropdown nav"> <x-language-selector-sidebar />
<a class="nav-link dropdown-toggle py-1 px-0" href="#" data-bs-toggle="dropdown" <x-location-selector-sidebar />
aria-haspopup="true" aria-expanded="false" aria-label="Country select: USA">
<div class="ratio ratio-1x1" style="width: 20px">
<img src="/img/flags/en-us.png" alt="USA">
</div>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/en-uk.png" class="flex-shrink-0 me-2" width="20"
alt="United Kingdom">
United Kingdom
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/fr.png" class="flex-shrink-0 me-2" width="20"
alt="France">
France
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/de.png" class="flex-shrink-0 me-2" width="20"
alt="Deutschland">
Deutschland
</a>
</li>
<li>
<a class="dropdown-item" href="#!">
<img src="/img/flags/it.png" class="flex-shrink-0 me-2" width="20"
alt="Italia">
Italia
</a>
</li>
</ul>
</div>
<div class="dropdown nav">
<a class="nav-link animate-underline dropdown-toggle fw-normal py-1 px-0" href="#"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="animate-target">Washington</span>
</a>
<ul class="dropdown-menu fs-sm" style="--cz-dropdown-spacer: .5rem">
<li><a class="dropdown-item" href="#!">Chicago</a></li>
<li><a class="dropdown-item" href="#!">Los Angeles</a></li>
<li><a class="dropdown-item" href="#!">New York</a></li>
<li><a class="dropdown-item" href="#!">Philadelphia</a></li>
</ul>
</div>
</div> </div>
<div class="offcanvas-body pt-1 pb-3 py-lg-0"> <div class="offcanvas-body pt-1 pb-3 py-lg-0">
<div class="container pb-lg-2 px-0 px-lg-3"> <div class="container pb-lg-2 px-0 px-lg-3">
@ -1788,9 +1699,9 @@
<!-- Breadcrumb --> <!-- Breadcrumb -->
<nav class="container pt-2 pt-xxl-3 my-3 my-md-4" aria-label="breadcrumb"> <nav class="container pt-2 pt-xxl-3 my-3 my-md-4" aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ route('second', ['home', 'fashion-v1']) }}">Home</a></li> <li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
<li class="breadcrumb-item"><a href="{{ route('second', ['shop', 'catalog-fashion']) }}">Shop</a></li> <li class="breadcrumb-item"><a href="{{ route('home') }}">Product</a></li>
<li class="breadcrumb-item active" aria-current="page">Product page</li> <li class="breadcrumb-item active" aria-current="page">Detail</li>
</ol> </ol>
</nav> </nav>
@ -1801,75 +1712,54 @@
<!-- Gallery --> <!-- Gallery -->
<div class="col-md-6 pb-4 pb-md-0 mb-2 mb-sm-3 mb-md-0"> <div class="col-md-6 pb-4 pb-md-0 mb-2 mb-sm-3 mb-md-0">
<div class="position-relative"> <div class="position-relative">
@if ($product->display_discount_price > 0)
<span <span
class="badge text-bg-danger position-absolute top-0 start-0 z-2 mt-3 mt-sm-4 ms-3 ms-sm-4">Sale</span> class="badge text-bg-danger position-absolute top-0 start-0 z-2 mt-3 mt-sm-4 ms-3 ms-sm-4">Sale</span>
<button type="button" @endif
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-lg bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-2 mt-sm-3 me-2 me-sm-3" class="btn btn-icon btn-secondary animate-pulse fs-lg bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-2 mt-sm-3 me-2 me-sm-3"
data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="tooltip-sm" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="tooltip-sm"
data-bs-title="Add to Wishlist" aria-label="Add to Wishlist"> data-bs-title="Add to Wishlist" aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i> <i class="ci-heart animate-target"></i>
</button> </button>
<a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden mb-3 mb-sm-4 mb-md-3 mb-lg-4" <a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden mb-3 mb-sm-4 mb-md-3 mb-lg-4"
href="/img/shop/fashion/product/01.png" data-glightbox data-gallery="product-gallery"> href="{{ $product->image_url ?? '' }}" data-glightbox data-gallery="product-gallery">
<i <i
class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i> class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i>
<div class="ratio hover-effect-target bg-body-tertiary rounded" <div class="ratio hover-effect-target bg-body-tertiary rounded"
style="--cz-aspect-ratio: calc(706 / 636 * 100%)"> style="--cz-aspect-ratio: calc(706 / 636 * 100%)">
<img src="/img/shop/fashion/product/01.png" alt="Image"> <img src="{{ $product->image_url ?? '' }}" class="product-main-image" alt="Image">
</div> </div>
</a> </a>
</div> </div>
<div class="collapse d-md-block" id="morePictures"> <div class="collapse d-md-block" id="morePictures">
<div class="row row-cols-2 g-3 g-sm-4 g-md-3 g-lg-4 pb-3 pb-sm-4 pb-md-0"> <div class="row row-cols-2 g-3 g-sm-4 g-md-3 g-lg-4 pb-3 pb-sm-4 pb-md-0">
<div class="col">
@foreach ($product->image_urls as $key => $url)
@if ($key == 0)
@continue
@endif
<div class="col">
<a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden" <a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden"
href="/img/shop/fashion/product/02.png" data-glightbox href="{{ $url }}" data-glightbox
data-gallery="product-gallery"> data-gallery="product-gallery">
<i <i
class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i> class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i>
<div class="ratio hover-effect-target bg-body-tertiary rounded" <div class="ratio hover-effect-target bg-body-tertiary rounded"
style="--cz-aspect-ratio: calc(342 / 306 * 100%)"> style="--cz-aspect-ratio: calc(342 / 306 * 100%)">
<img src="/img/shop/fashion/product/02.png" alt="Image"> <img src="{{ $url }}" alt="Image">
</div>
</a>
</div>
<div class="col">
<a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden"
href="/img/shop/fashion/product/03.png" data-glightbox
data-gallery="product-gallery">
<i
class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i>
<div class="ratio hover-effect-target bg-body-tertiary rounded"
style="--cz-aspect-ratio: calc(342 / 306 * 100%)">
<img src="/img/shop/fashion/product/03.png" alt="Image">
</div>
</a>
</div>
<div class="col">
<a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden"
href="/img/shop/fashion/product/04.png" data-glightbox
data-gallery="product-gallery">
<i
class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i>
<div class="ratio hover-effect-target bg-body-tertiary rounded"
style="--cz-aspect-ratio: calc(342 / 306 * 100%)">
<img src="/img/shop/fashion/product/04.png" alt="Image">
</div>
</a>
</div>
<div class="col">
<a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden"
href="/img/shop/fashion/product/05.png" data-glightbox
data-gallery="product-gallery">
<i
class="ci-zoom-in hover-effect-target fs-3 text-white position-absolute top-50 start-50 translate-middle opacity-0 z-2"></i>
<div class="ratio hover-effect-target bg-body-tertiary rounded"
style="--cz-aspect-ratio: calc(342 / 306 * 100%)">
<img src="/img/shop/fashion/product/05.png" alt="Image">
</div> </div>
</a> </a>
</div> </div>
@endforeach
</div> </div>
</div> </div>
<button type="button" class="btn btn-lg btn-outline-secondary w-100 collapsed d-md-none" <button type="button" class="btn btn-lg btn-outline-secondary w-100 collapsed d-md-none"
@ -1886,7 +1776,7 @@
<div class="ps-md-4 ps-xl-5"> <div class="ps-md-4 ps-xl-5">
<!-- Reviews --> <!-- Reviews -->
<a class="d-none d-md-flex align-items-center gap-2 text-decoration-none mb-3" href="#reviews"> {{-- <a class="d-none d-md-flex align-items-center gap-2 text-decoration-none mb-3" href="#reviews">
<div class="d-flex gap-1 fs-sm"> <div class="d-flex gap-1 fs-sm">
<i class="ci-star-filled text-warning"></i> <i class="ci-star-filled text-warning"></i>
<i class="ci-star-filled text-warning"></i> <i class="ci-star-filled text-warning"></i>
@ -1895,67 +1785,59 @@
<i class="ci-star text-body-tertiary opacity-75"></i> <i class="ci-star text-body-tertiary opacity-75"></i>
</div> </div>
<span class="text-body-tertiary fs-sm">23 reviews</span> <span class="text-body-tertiary fs-sm">23 reviews</span>
</a> </a> --}}
<!-- Title --> <!-- Title -->
<h1 class="h3">Denim midi skirt with pockets</h1> <h1 class="h3">{{ $product->name }}</h1>
<!-- Description --> <!-- Description -->
<p class="fs-sm mb-0">Made from high-quality denim fabric, this midi skirt offers durability and <p class="fs-sm mb-0">{!! nl2br(Str::limit($product->description, 500)) !!}</p>
comfort for all-day wear. The mid-length design strikes the perfect balance between casual and
chic, making it suitable for various occasions, from casual outings to semi-formal events.</p>
<div class="collapse" id="moreDescription"> <div class="collapse" id="moreDescription">
<div class="fs-sm pt-3"> <div class="fs-sm pt-3">
<p>One of the standout features of this skirt is its functional pockets. With two spacious @if(strlen($product->description) > 500)
pockets at the front, you can conveniently carry your essentials such as keys, phone, or <p>{!! nl2br(substr($product->description, 500)) !!}</p>
wallet without the need for a bulky bag. The pockets also add a touch of utility and @endif
flair to the overall look.</p>
<p class="mb-0">The skirt's classic denim color and timeless design make it easy to pair
with a variety of tops, blouses, and footwear, allowing you to create endless stylish
ensembles. Whether you prefer a laid-back look with a graphic tee and sneakers or a more
polished ensemble with a blouse and heels, this skirt effortlessly adapts to your style.
</p>
</div> </div>
</div> </div>
<!-- Price --> <!-- Price -->
@if(strlen($product->description) > 500)
<a class="d-inline-block fs-sm fw-medium text-dark-emphasis collapsed mt-1" <a class="d-inline-block fs-sm fw-medium text-dark-emphasis collapsed mt-1"
href="#moreDescription" data-bs-toggle="collapse" aria-expanded="false" href="#moreDescription" data-bs-toggle="collapse" aria-expanded="false"
aria-controls="moreDescription" data-label-collapsed="Read more" aria-controls="moreDescription" data-label-collapsed="Read more"
data-label-expanded="Show less" aria-label="Show / hide description"></a> data-label-expanded="Show less" aria-label="Show / hide description"></a>
@endif
<div class="h4 d-flex align-items-center my-4"> <div class="h4 d-flex align-items-center my-4">
$126.50 <span class="display_price">Rp {{ number_format($product->display_price, 0, ',', '.') }}</span>
<del class="fs-sm fw-normal text-body-tertiary ms-2">$156.00</del>
<del class="display_discount_price fs-sm fw-normal text-body-tertiary ms-2" style="display: {{ $product->discount_display_price ? 'inline' : 'none' }};">{{ $product->discount_display_price ? ' Rp ' . number_format($product->discount_display_price, 0, ',', '.') : '' }}</del>
</div> </div>
<!-- Color options --> <!-- Color options -->
<div class="mb-4"> <div class="mb-4">
<label class="form-label fw-semibold pb-1 mb-2">Color: <span class="text-body fw-normal" <label class="form-label fw-semibold pb-1 mb-2">Varian: <span class="text-body fw-normal"
id="colorOption">Dark blue</span></label> id="colorOption">{{ $product->variants->first()->description ?? '' }}</span></label>
<div class="d-flex flex-wrap gap-2" data-binded-label="#colorOption"> <div class="d-flex flex-wrap gap-2" data-binded-label="#colorOption">
<input type="radio" class="btn-check" name="colors" id="dark-blue" checked>
<label for="dark-blue" class="btn btn-image p-0" data-label="Dark blue"> @foreach ($product->variants as $key => $variant)
<img src="/img/shop/fashion/product/colors/color01.png" width="56" <input type="radio" class="btn-check" name="colors" id="variant-id-{{ $variant->id }}" {{ $key == 0 ? 'checked' : '' }}>
alt="Dark blue"> <label for="variant-id-{{ $variant->id }}" class="btn btn-image p-0" data-label="{{ $variant->description }}"
<span class="visually-hidden">Dark blue</span> data-price="Rp {{ number_format($variant->display_price, 0, ",",".") }}"
</label> data-discount-price="{{ $variant->discount_display_price ? 'Rp ' . number_format($variant->discount_display_price, 0, ',', '.') : '' }}"
<input type="radio" class="btn-check" name="colors" id="pink"> data-image="{{ $variant->image_url ?? $product->image_url }}"
<label for="pink" class="btn btn-image p-0" data-label="Pink"> >
<img src="/img/shop/fashion/product/colors/color02.png" width="56" <img src="{{ $variant->image_url ?? $product->image_url }}" width="56"
alt="Pink"> alt="{{ $variant->name }}">
<span class="visually-hidden">Pink</span> <span class="visually-hidden">{{ $variant->name }}</span>
</label> </label>
<input type="radio" class="btn-check" name="colors" id="light-blue"> @endforeach
<label for="light-blue" class="btn btn-image p-0" data-label="Light blue">
<img src="/img/shop/fashion/product/colors/color03.png" width="56"
alt="Light blue">
<span class="visually-hidden">Light blue</span>
</label>
</div> </div>
</div> </div>
<!-- Size select --> <!-- Size select -->
<div class="mb-3"> {{-- <div class="mb-3">
<div class="d-flex align-items-center justify-content-between mb-1"> <div class="d-flex align-items-center justify-content-between mb-1">
<label class="form-label fw-semibold mb-0">Size</label> <label class="form-label fw-semibold mb-0">Size</label>
<div class="nav"> <div class="nav">
@ -1980,7 +1862,7 @@
<option value="l">12-14 (L)</option> <option value="l">12-14 (L)</option>
<option value="xl">14-16 (XL)</option> <option value="xl">14-16 (XL)</option>
</select> </select>
</div> </div> --}}
<!-- Count input + Add to cart button --> <!-- Count input + Add to cart button -->
<div class="d-flex gap-3 pb-3 pb-lg-4 mb-3"> <div class="d-flex gap-3 pb-3 pb-lg-4 mb-3">
@ -2000,7 +1882,7 @@
</div> </div>
<!-- Info list --> <!-- Info list -->
<ul class="list-unstyled gap-3 pb-3 pb-lg-4 mb-3"> {{-- <ul class="list-unstyled gap-3 pb-3 pb-lg-4 mb-3">
<li class="d-flex flex-wrap fs-sm"> <li class="d-flex flex-wrap fs-sm">
<span class="d-flex align-items-center fw-medium text-dark-emphasis me-2"> <span class="d-flex align-items-center fw-medium text-dark-emphasis me-2">
<i class="ci-clock fs-base me-2"></i> <i class="ci-clock fs-base me-2"></i>
@ -2015,10 +1897,10 @@
</span> </span>
On all orders over $100.00 On all orders over $100.00
</li> </li>
</ul> </ul> --}}
<!-- Stock status --> <!-- Stock status -->
<div class="d-flex flex-wrap justify-content-between fs-sm mb-3"> {{-- <div class="d-flex flex-wrap justify-content-between fs-sm mb-3">
<span class="fw-medium text-dark-emphasis me-2">🔥 Hurry up! The sale is coming to an <span class="fw-medium text-dark-emphasis me-2">🔥 Hurry up! The sale is coming to an
end</span> end</span>
<span><span class="fw-medium text-dark-emphasis">6</span> items in stock!</span> <span><span class="fw-medium text-dark-emphasis">6</span> items in stock!</span>
@ -2026,7 +1908,7 @@
<div class="progress" role="progressbar" aria-label="Left in stock" aria-valuenow="25" <div class="progress" role="progressbar" aria-label="Left in stock" aria-valuenow="25"
aria-valuemin="0" aria-valuemax="100" style="height: 4px"> aria-valuemin="0" aria-valuemax="100" style="height: 4px">
<div class="progress-bar rounded-pill" style="width: 25%"></div> <div class="progress-bar rounded-pill" style="width: 25%"></div>
</div> </div> --}}
</div> </div>
</div> </div>
</div> </div>
@ -2109,23 +1991,7 @@
aria-labelledby="description-tab"> aria-labelledby="description-tab">
<div class="row"> <div class="row">
<div class="col-lg-6 fs-sm"> <div class="col-lg-6 fs-sm">
<ul class="list-unstyled"> {!! nl2br($product->description) !!}
<li>Model's height: <span class="text-dark-emphasis fw-semibold">176 cm</span></li>
<li>The model is wearing size: <span class="text-dark-emphasis fw-semibold">S/36</span>
</li>
</ul>
<p>This skirt is designed to fall just below the knee, offering a flattering length that is
suitable for various occasions. It is made from a soft and lightweight fabric that drapes
beautifully, ensuring comfort and ease of movement. The blue color adds a vibrant touch,
making it a standout piece in your wardrobe.</p>
<ul>
<li>fitted waistband</li>
<li>fastened with a hidden zipper</li>
<li>midi length</li>
</ul>
<p class="mb-0">The blue color of the skirt allows for easy pairing with a variety of tops.
You can opt for a crisp white blouse for a classic and polished outfit, or choose a
patterned or contrasting-colored top for a more vibrant and fashion-forward look.</p>
</div> </div>
<div class="col-lg-6 col-xl-5 offset-xl-1"> <div class="col-lg-6 col-xl-5 offset-xl-1">
<div class="row row-cols-2 g-4 my-0 my-lg-n2"> <div class="row row-cols-2 g-4 my-0 my-lg-n2">
@ -2528,288 +2394,30 @@
}'> }'>
<div class="swiper-wrapper"> <div class="swiper-wrapper">
<!-- Slide --> @foreach ($complete_look_products as $key => $value)
<div class="swiper-slide"> <div class="swiper-slide">
<div class="row row-cols-2"> <div class="row row-cols-2">
<!-- Item --> @foreach ($value as $key2 => $value2)
<div class="col"> <div class="col">
<div class="animate-underline hover-effect-opacity"> <x-home.product-card :product="$value2" />
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="#!">
<div class="ratio"
style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/02.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">S</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XL</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="#!">+1</a>
</div>
</div>
</div>
</div> </div>
<div class="nav mb-2"> @endforeach
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="#!">
<span class="text-truncate">Cotton lace blouse with necklace</span>
</a>
</div>
<div class="h6 mb-2">$54.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+2
colors</div>
<div
class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-2"
id="color-2-1" checked>
<label for="color-2-1" class="btn btn-color fs-base"
style="color: #dcb1b1">
<span class="visually-hidden">Pink</span>
</label>
<input type="radio" class="btn-check" name="colors-2"
id="color-2-2">
<label for="color-2-2" class="btn btn-color fs-base"
style="color: #ced6f0">
<span class="visually-hidden">Blue</span>
</label>
<input type="radio" class="btn-check" name="colors-2"
id="color-2-3">
<label for="color-2-3" class="btn btn-color fs-base"
style="color: #e1e0cf">
<span class="visually-hidden">Mustard</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="#!">
<div class="ratio"
style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/07.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">6</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">6.5</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">7</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">7.5</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="#!">+4</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="#!">
<span class="text-truncate">Black massive women's boots</span>
</a>
</div>
<div class="h6 mb-2">$160.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+1
color</div>
<div
class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-7"
id="color-7-1" checked>
<label for="color-7-1" class="btn btn-color fs-base"
style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
<input type="radio" class="btn-check" name="colors-7"
id="color-7-2">
<label for="color-7-2" class="btn btn-color fs-base"
style="color: #e0e5eb">
<span class="visually-hidden">White</span>
</label>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div>
@endforeach
<!-- Slide -->
<div class="swiper-slide">
<div class="row row-cols-2">
<!-- Item -->
<div class="col">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="#!">
<div class="ratio"
style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/09.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">XS</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">S</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">M</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">L</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="#!">+3</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="#!">
<span class="text-truncate">White cotton blouse with necklace</span>
</a>
</div>
<div class="h6 mb-2">$38.50</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+1
color</div>
<div
class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-9"
id="color-9-1" checked>
<label for="color-9-1" class="btn btn-color fs-base"
style="color: #e0e5eb">
<span class="visually-hidden">White</span>
</label>
<input type="radio" class="btn-check" name="colors-9"
id="color-9-2">
<label for="color-9-2" class="btn btn-color fs-base"
style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
</div>
</div>
</div>
</div>
<!-- Item -->
<div class="col">
<div class="animate-underline hover-effect-opacity">
<div class="position-relative mb-3">
<button type="button"
class="btn btn-icon btn-secondary animate-pulse fs-base bg-transparent border-0 position-absolute top-0 end-0 z-2 mt-1 mt-sm-2 me-1 me-sm-2"
aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i>
</button>
<a class="d-flex bg-body-tertiary rounded p-3" href="#!">
<div class="ratio"
style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="/img/shop/fashion/08.png" alt="Image">
</div>
</a>
<div
class="hover-effect-target position-absolute start-0 bottom-0 w-100 z-2 opacity-0 pb-2 pb-sm-3 px-2 px-sm-3">
<div
class="d-flex align-items-center justify-content-center gap-2 gap-xl-3 bg-body rounded-2 p-2">
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">6.5</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">7</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">7.5</span>
<span
class="fs-xs fw-medium text-secondary-emphasis py-1 px-sm-2">8</span>
<div class="nav">
<a class="nav-link fs-xs text-body-tertiary py-1 px-2"
href="#!">+3</a>
</div>
</div>
</div>
</div>
<div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="#!">
<span class="text-truncate">Leather sneakers with golden laces</span>
</a>
</div>
<div class="h6 mb-2">$74.00</div>
<div class="position-relative">
<div class="hover-effect-target fs-xs text-body-secondary opacity-100">+2
colors</div>
<div
class="hover-effect-target d-flex gap-2 position-absolute top-0 start-0 opacity-0">
<input type="radio" class="btn-check" name="colors-8"
id="color-8-1" checked>
<label for="color-8-1" class="btn btn-color fs-base"
style="color: #b1aa9b">
<span class="visually-hidden">Cream</span>
</label>
<input type="radio" class="btn-check" name="colors-8"
id="color-8-2">
<label for="color-8-2" class="btn btn-color fs-base"
style="color: #496c33">
<span class="visually-hidden">Dark green</span>
</label>
<input type="radio" class="btn-check" name="colors-8"
id="color-8-3">
<label for="color-8-3" class="btn btn-color fs-base"
style="color: #364254">
<span class="visually-hidden">Black</span>
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- Product image --> <!-- Product image -->
<div class="col-md-6 order-md-1"> <div class="col-md-6 order-md-1">
<img src="/img/shop/fashion/product/01.png" class="d-block bg-body-tertiary rounded" <img src="{{ $product->image_url ?? '' }}" class="d-block bg-body-tertiary rounded"
alt="Image"> alt="Image">
</div> </div>
</div> </div>
@ -3395,4 +3003,35 @@
@endsection @endsection
@section('scripts') @section('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const radios = document.querySelectorAll('input[name="colors"]');
radios.forEach(radio => {
radio.addEventListener('change', function() {
const label = document.querySelector(`label[for="${this.id}"]`);
const price = label.getAttribute('data-price');
const discountPrice = label.getAttribute('data-discount-price');
const image = label.getAttribute('data-image');
const labelText = label.getAttribute('data-label');
document.querySelector('.display_price').textContent = price;
const discountSpan = document.querySelector('.display_discount_price');
if (discountPrice) {
discountSpan.textContent = ' ' + discountPrice;
discountSpan.style.display = 'inline';
} else {
discountSpan.style.display = 'none';
}
document.querySelector('.product-main-image').src = image;
document.querySelector('#colorOption').textContent = labelText;
});
});
// Trigger change for the initially checked radio
const checkedRadio = document.querySelector('input[name="colors"]:checked');
if (checkedRadio) {
checkedRadio.dispatchEvent(new Event('change'));
}
});
</script>
@endsection @endsection

View File

@ -1,12 +1,26 @@
<?php <?php
use App\Http\Controllers\HomeController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\RoutingController; use App\Http\Controllers\RoutingController;
use App\Http\Controllers\LocationController;
use App\Http\Controllers\LocaleController;
use App\Http\Controllers\ProductController;
Route::group(['prefix' => '/'], function () { Route::group(['prefix' => '/dummy'], function () {
Route::get('', [RoutingController::class, 'index'])->name('root'); Route::get('', [RoutingController::class, 'index'])->name('root');
Route::get('{first}/{second}/{third}', [RoutingController::class, 'thirdLevel'])->name('third'); Route::get('{first}/{second}/{third}', [RoutingController::class, 'thirdLevel'])->name('third');
Route::get('{first}/{second}', [RoutingController::class, 'secondLevel'])->name('second'); Route::get('{first}/{second}', [RoutingController::class, 'secondLevel'])->name('second');
Route::get('{any}', [RoutingController::class, 'root'])->name('any'); Route::get('{any}', [RoutingController::class, 'root'])->name('any');
}); });
// Location selection route
Route::post('/location/select', [LocationController::class, 'select'])->name('location.select');
// Language switching route
Route::post('/locale/switch', [LocaleController::class, 'switch'])->name('locale.switch');
Route::get('/', [HomeController::class, 'index'])->name('home');
Route::get('/product/{slug}',[ProductController::class, 'detail'])->name('product.detail');