Compare commits
No commits in common. "feature-product" and "master" have entirely different histories.
feature-pr
...
master
|
|
@ -27,7 +27,7 @@ DB_CONNECTION=sqlite
|
|||
# DB_USERNAME=root
|
||||
# DB_PASSWORD=
|
||||
|
||||
SESSION_DRIVER=file
|
||||
SESSION_DRIVER=database
|
||||
SESSION_LIFETIME=120
|
||||
SESSION_ENCRYPT=false
|
||||
SESSION_PATH=/
|
||||
|
|
@ -63,6 +63,3 @@ AWS_BUCKET=
|
|||
AWS_USE_PATH_STYLE_ENDPOINT=false
|
||||
|
||||
VITE_APP_NAME="${APP_NAME}"
|
||||
|
||||
|
||||
WMS_ASSET_URL="https://dev.smgdev.top/api/storage"
|
||||
|
|
@ -1 +0,0 @@
|
|||
8.4
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
|
||||
|
||||
return view('home.fashion-v1');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<?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]);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<?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]);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
<?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
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
<?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"];
|
||||
}
|
||||
|
|
@ -1,203 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,121 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,361 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
<?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");
|
||||
}
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
<?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'];
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
<?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();
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<?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();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -11,9 +11,7 @@ return Application::configure(basePath: dirname(__DIR__))
|
|||
health: '/up',
|
||||
)
|
||||
->withMiddleware(function (Middleware $middleware): void {
|
||||
$middleware->web(append: [
|
||||
\App\Http\Middleware\SetLocale::class,
|
||||
]);
|
||||
//
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions): void {
|
||||
//
|
||||
|
|
|
|||
|
|
@ -10,10 +10,8 @@
|
|||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"awobaz/compoships": "^2.5",
|
||||
"laravel/framework": "^12.0",
|
||||
"laravel/tinker": "^2.10.1",
|
||||
"spatie/laravel-activitylog": "^4.10"
|
||||
"laravel/tinker": "^2.10.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.23",
|
||||
|
|
@ -77,4 +75,4 @@
|
|||
},
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
}
|
||||
}
|
||||
|
|
@ -4,70 +4,8 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "39a129e1371f7351b7cd6beab65a522a",
|
||||
"content-hash": "88970a0117c062eed55fa8728fc43833",
|
||||
"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",
|
||||
"version": "0.13.1",
|
||||
|
|
@ -3333,158 +3271,6 @@
|
|||
},
|
||||
"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",
|
||||
"version": "v7.3.0",
|
||||
|
|
|
|||
BIN
composer.phar
BIN
composer.phar
Binary file not shown.
|
|
@ -13,7 +13,7 @@ return [
|
|||
|
|
||||
*/
|
||||
|
||||
'default' => env('FILESYSTEM_DISK', 'wms'),
|
||||
'default' => env('FILESYSTEM_DISK', 'local'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
@ -47,16 +47,6 @@ return [
|
|||
'report' => false,
|
||||
],
|
||||
|
||||
|
||||
'wms' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/public'),
|
||||
'url' => env('WMS_ASSET_URL'),
|
||||
'visibility' => 'public',
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
's3' => [
|
||||
'driver' => 's3',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
<?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');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?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');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
<?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');
|
||||
}
|
||||
};
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
<?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.',
|
||||
|
||||
];
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'id' => 'Indonesia',
|
||||
'en' => 'English',
|
||||
|
||||
];
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'new_arrivals' => 'New Arrivals',
|
||||
'meet_the_collection' => 'Meet the :app collection'
|
||||
];
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<?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' => '« Previous',
|
||||
'next' => 'Next »',
|
||||
|
||||
];
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
<?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.",
|
||||
|
||||
];
|
||||
|
|
@ -1,198 +0,0 @@
|
|||
<?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' => [],
|
||||
|
||||
];
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<?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'
|
||||
];
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'id' => 'Indonesia',
|
||||
'en' => 'English',
|
||||
|
||||
];
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'new_arrivals' => 'Kedatangan Baru',
|
||||
'meet_the_collection' => 'Temukan koleksi :app'
|
||||
];
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<?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
1310
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 66 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 92 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 80 KiB |
|
|
@ -1,44 +0,0 @@
|
|||
<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>
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
<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>
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
<!-- 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>
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
|
||||
<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>
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
<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>
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
<!-- 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>
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
<!-- 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>
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
<!-- 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>
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
<!-- 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>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
@extends('layouts.landing', ['title' => 'AsiaGolf Store'])
|
||||
@extends('layouts.landing', ['title' => 'Fashion Store v.1'])
|
||||
|
||||
@section('content')
|
||||
<div class="offcanvas offcanvas-end pb-sm-2 px-sm-2" id="shoppingCart" tabindex="-1" aria-labelledby="shoppingCartLabel"
|
||||
|
|
@ -198,19 +198,57 @@
|
|||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<!-- Country selector visible on screens > 768px wide (md breakpoint) -->
|
||||
<x-language-selector />
|
||||
<!-- Country slect 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="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>
|
||||
|
||||
<!-- LOcation selector visible on screens > 768px wide (md breakpoint) -->
|
||||
<x-location-selector />
|
||||
<!-- City slect 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">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>
|
||||
|
||||
<!-- Navbar brand (Logo) -->
|
||||
<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>
|
||||
<a class="navbar-brand fs-2 py-0 m-0 me-auto me-sm-n5" href="/">Cartzilla</a>
|
||||
|
||||
<!-- Button group -->
|
||||
<div class="d-flex align-items-center">
|
||||
|
|
@ -291,10 +329,52 @@
|
|||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
||||
</div>
|
||||
|
||||
<!-- Country and City selects 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">
|
||||
<x-language-selector-sidebar />
|
||||
<x-location-selector-sidebar />
|
||||
<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="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 class="offcanvas-body pt-1 pb-3 py-lg-0">
|
||||
<div class="container pb-lg-2 px-0 px-lg-3">
|
||||
|
|
@ -1265,14 +1345,628 @@
|
|||
|
||||
|
||||
<!-- Featured products -->
|
||||
<x-home.product-highlight />
|
||||
<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">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 -->
|
||||
<x-home.new-arrivals />
|
||||
<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</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 -->
|
||||
<x-home.brand-home template="fashion-v1" />
|
||||
<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 -->
|
||||
<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 -->
|
||||
|
|
|
|||
|
|
@ -2170,7 +2170,112 @@
|
|||
</section>
|
||||
|
||||
|
||||
<x-home.brand-home template="fashion-v2" />
|
||||
<!-- Brands -->
|
||||
<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 -->
|
||||
|
|
|
|||
|
|
@ -18,8 +18,6 @@
|
|||
|
||||
@vite(['resources/js/theme.js'])
|
||||
|
||||
@yield('scripts')
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,13 +1,10 @@
|
|||
<meta charset="utf-8">
|
||||
|
||||
<!-- CSRF Token -->
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<!-- Viewport -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, viewport-fit=cover">
|
||||
|
||||
<!-- SEO Meta Tags -->
|
||||
<title>{{ config('app.name') }} | {{ $title }}</title>
|
||||
<title>Cartzilla | {{ $title }}</title>
|
||||
<meta name="description" content="Cartzilla - Multipurpose Bootstrap E-Commerce HTML Template">
|
||||
<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">
|
||||
|
|
@ -17,5 +14,5 @@
|
|||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link rel="icon" type="image/png" href="{{ asset('logo/logo-app.png') }}" sizes="32x32">
|
||||
<link rel="apple-touch-icon" href="{{ asset('app-icons/icon-180x180.png') }}">
|
||||
<link rel="icon" type="image/png" href="/app-icons/icon-32x32.png" sizes="32x32">
|
||||
<link rel="apple-touch-icon" href="/app-icons/icon-180x180.png">
|
||||
|
|
|
|||
|
|
@ -605,19 +605,60 @@
|
|||
</button>
|
||||
|
||||
<!-- Country slect visible on screens > 768px wide (md breakpoint) -->
|
||||
<x-language-selector />
|
||||
<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="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) -->
|
||||
<x-location-selector />
|
||||
<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">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>
|
||||
|
||||
<!-- Navbar brand (Logo) -->
|
||||
<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>
|
||||
|
||||
<a class="navbar-brand fs-2 py-0 m-0 me-auto me-sm-n5" href="{{ route('second', ['home', 'fashion-v1']) }}">Cartzilla</a>
|
||||
|
||||
<!-- Button group -->
|
||||
<div class="d-flex align-items-center">
|
||||
|
|
@ -716,8 +757,56 @@
|
|||
|
||||
<!-- Country and City slects visible on screens < 768px wide (md breakpoint) -->
|
||||
<div class="offcanvas-header gap-3 d-md-none pt-0 pb-3">
|
||||
<x-language-selector-sidebar />
|
||||
<x-location-selector-sidebar />
|
||||
<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="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 class="offcanvas-body pt-1 pb-3 py-lg-0">
|
||||
<div class="container pb-lg-2 px-0 px-lg-3">
|
||||
|
|
@ -1699,9 +1788,9 @@
|
|||
<!-- Breadcrumb -->
|
||||
<nav class="container pt-2 pt-xxl-3 my-3 my-md-4" aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ route('home') }}">Product</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Detail</li>
|
||||
<li class="breadcrumb-item"><a href="{{ route('second', ['home', 'fashion-v1']) }}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ route('second', ['shop', 'catalog-fashion']) }}">Shop</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Product page</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
|
|
@ -1712,54 +1801,75 @@
|
|||
|
||||
<!-- Gallery -->
|
||||
<div class="col-md-6 pb-4 pb-md-0 mb-2 mb-sm-3 mb-md-0">
|
||||
|
||||
<div class="position-relative">
|
||||
|
||||
@if ($product->display_discount_price > 0)
|
||||
<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>
|
||||
@endif
|
||||
<button type="button"
|
||||
<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"
|
||||
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">
|
||||
<i class="ci-heart animate-target"></i>
|
||||
</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"
|
||||
href="{{ $product->image_url ?? '' }}" data-glightbox data-gallery="product-gallery">
|
||||
href="/img/shop/fashion/product/01.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(706 / 636 * 100%)">
|
||||
<img src="{{ $product->image_url ?? '' }}" class="product-main-image" alt="Image">
|
||||
<img src="/img/shop/fashion/product/01.png" alt="Image">
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<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">
|
||||
|
||||
@foreach ($product->image_urls as $key => $url)
|
||||
|
||||
@if ($key == 0)
|
||||
@continue
|
||||
@endif
|
||||
<div class="col">
|
||||
<div class="col">
|
||||
<a class="hover-effect-scale hover-effect-opacity position-relative d-flex rounded overflow-hidden"
|
||||
href="{{ $url }}" data-glightbox
|
||||
href="/img/shop/fashion/product/02.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="{{ $url }}" alt="Image">
|
||||
<img src="/img/shop/fashion/product/02.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/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>
|
||||
</a>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="btn btn-lg btn-outline-secondary w-100 collapsed d-md-none"
|
||||
|
|
@ -1776,7 +1886,7 @@
|
|||
<div class="ps-md-4 ps-xl-5">
|
||||
|
||||
<!-- 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">
|
||||
<i class="ci-star-filled text-warning"></i>
|
||||
<i class="ci-star-filled text-warning"></i>
|
||||
|
|
@ -1785,59 +1895,67 @@
|
|||
<i class="ci-star text-body-tertiary opacity-75"></i>
|
||||
</div>
|
||||
<span class="text-body-tertiary fs-sm">23 reviews</span>
|
||||
</a> --}}
|
||||
</a>
|
||||
|
||||
<!-- Title -->
|
||||
<h1 class="h3">{{ $product->name }}</h1>
|
||||
<h1 class="h3">Denim midi skirt with pockets</h1>
|
||||
|
||||
<!-- Description -->
|
||||
<p class="fs-sm mb-0">{!! nl2br(Str::limit($product->description, 500)) !!}</p>
|
||||
<p class="fs-sm mb-0">Made from high-quality denim fabric, this midi skirt offers durability and
|
||||
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="fs-sm pt-3">
|
||||
@if(strlen($product->description) > 500)
|
||||
<p>{!! nl2br(substr($product->description, 500)) !!}</p>
|
||||
@endif
|
||||
<p>One of the standout features of this skirt is its functional pockets. With two spacious
|
||||
pockets at the front, you can conveniently carry your essentials such as keys, phone, or
|
||||
wallet without the need for a bulky bag. The pockets also add a touch of utility and
|
||||
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>
|
||||
|
||||
<!-- Price -->
|
||||
@if(strlen($product->description) > 500)
|
||||
<a class="d-inline-block fs-sm fw-medium text-dark-emphasis collapsed mt-1"
|
||||
href="#moreDescription" data-bs-toggle="collapse" aria-expanded="false"
|
||||
aria-controls="moreDescription" data-label-collapsed="Read more"
|
||||
data-label-expanded="Show less" aria-label="Show / hide description"></a>
|
||||
@endif
|
||||
<div class="h4 d-flex align-items-center my-4">
|
||||
<span class="display_price">Rp {{ number_format($product->display_price, 0, ',', '.') }}</span>
|
||||
|
||||
<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>
|
||||
$126.50
|
||||
<del class="fs-sm fw-normal text-body-tertiary ms-2">$156.00</del>
|
||||
</div>
|
||||
|
||||
<!-- Color options -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label fw-semibold pb-1 mb-2">Varian: <span class="text-body fw-normal"
|
||||
id="colorOption">{{ $product->variants->first()->description ?? '' }}</span></label>
|
||||
<label class="form-label fw-semibold pb-1 mb-2">Color: <span class="text-body fw-normal"
|
||||
id="colorOption">Dark blue</span></label>
|
||||
<div class="d-flex flex-wrap gap-2" data-binded-label="#colorOption">
|
||||
|
||||
@foreach ($product->variants as $key => $variant)
|
||||
<input type="radio" class="btn-check" name="colors" id="variant-id-{{ $variant->id }}" {{ $key == 0 ? 'checked' : '' }}>
|
||||
<label for="variant-id-{{ $variant->id }}" class="btn btn-image p-0" data-label="{{ $variant->description }}"
|
||||
data-price="Rp {{ number_format($variant->display_price, 0, ",",".") }}"
|
||||
data-discount-price="{{ $variant->discount_display_price ? 'Rp ' . number_format($variant->discount_display_price, 0, ',', '.') : '' }}"
|
||||
data-image="{{ $variant->image_url ?? $product->image_url }}"
|
||||
>
|
||||
<img src="{{ $variant->image_url ?? $product->image_url }}" width="56"
|
||||
alt="{{ $variant->name }}">
|
||||
<span class="visually-hidden">{{ $variant->name }}</span>
|
||||
</label>
|
||||
@endforeach
|
||||
|
||||
|
||||
<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">
|
||||
<img src="/img/shop/fashion/product/colors/color01.png" width="56"
|
||||
alt="Dark blue">
|
||||
<span class="visually-hidden">Dark blue</span>
|
||||
</label>
|
||||
<input type="radio" class="btn-check" name="colors" id="pink">
|
||||
<label for="pink" class="btn btn-image p-0" data-label="Pink">
|
||||
<img src="/img/shop/fashion/product/colors/color02.png" width="56"
|
||||
alt="Pink">
|
||||
<span class="visually-hidden">Pink</span>
|
||||
</label>
|
||||
<input type="radio" class="btn-check" name="colors" id="light-blue">
|
||||
<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>
|
||||
|
||||
<!-- Size select -->
|
||||
{{-- <div class="mb-3">
|
||||
<div class="mb-3">
|
||||
<div class="d-flex align-items-center justify-content-between mb-1">
|
||||
<label class="form-label fw-semibold mb-0">Size</label>
|
||||
<div class="nav">
|
||||
|
|
@ -1862,7 +1980,7 @@
|
|||
<option value="l">12-14 (L)</option>
|
||||
<option value="xl">14-16 (XL)</option>
|
||||
</select>
|
||||
</div> --}}
|
||||
</div>
|
||||
|
||||
<!-- Count input + Add to cart button -->
|
||||
<div class="d-flex gap-3 pb-3 pb-lg-4 mb-3">
|
||||
|
|
@ -1882,7 +2000,7 @@
|
|||
</div>
|
||||
|
||||
<!-- 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">
|
||||
<span class="d-flex align-items-center fw-medium text-dark-emphasis me-2">
|
||||
<i class="ci-clock fs-base me-2"></i>
|
||||
|
|
@ -1897,10 +2015,10 @@
|
|||
</span>
|
||||
On all orders over $100.00
|
||||
</li>
|
||||
</ul> --}}
|
||||
</ul>
|
||||
|
||||
<!-- 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
|
||||
end</span>
|
||||
<span><span class="fw-medium text-dark-emphasis">6</span> items in stock!</span>
|
||||
|
|
@ -1908,7 +2026,7 @@
|
|||
<div class="progress" role="progressbar" aria-label="Left in stock" aria-valuenow="25"
|
||||
aria-valuemin="0" aria-valuemax="100" style="height: 4px">
|
||||
<div class="progress-bar rounded-pill" style="width: 25%"></div>
|
||||
</div> --}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1991,7 +2109,23 @@
|
|||
aria-labelledby="description-tab">
|
||||
<div class="row">
|
||||
<div class="col-lg-6 fs-sm">
|
||||
{!! nl2br($product->description) !!}
|
||||
<ul class="list-unstyled">
|
||||
<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 class="col-lg-6 col-xl-5 offset-xl-1">
|
||||
<div class="row row-cols-2 g-4 my-0 my-lg-n2">
|
||||
|
|
@ -2394,30 +2528,288 @@
|
|||
}'>
|
||||
<div class="swiper-wrapper">
|
||||
|
||||
@foreach ($complete_look_products as $key => $value)
|
||||
<div class="swiper-slide">
|
||||
<div class="row row-cols-2">
|
||||
<!-- Slide -->
|
||||
<div class="swiper-slide">
|
||||
<div class="row row-cols-2">
|
||||
|
||||
@foreach ($value as $key2 => $value2)
|
||||
<div class="col">
|
||||
<x-home.product-card :product="$value2" />
|
||||
|
||||
<!-- 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/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>
|
||||
@endforeach
|
||||
<div class="nav mb-2">
|
||||
<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>
|
||||
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 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>
|
||||
|
||||
<!-- Product image -->
|
||||
<div class="col-md-6 order-md-1">
|
||||
<img src="{{ $product->image_url ?? '' }}" class="d-block bg-body-tertiary rounded"
|
||||
<img src="/img/shop/fashion/product/01.png" class="d-block bg-body-tertiary rounded"
|
||||
alt="Image">
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -3003,35 +3395,4 @@
|
|||
@endsection
|
||||
|
||||
@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
|
||||
|
|
|
|||
|
|
@ -1,26 +1,12 @@
|
|||
<?php
|
||||
|
||||
use App\Http\Controllers\HomeController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use App\Http\Controllers\RoutingController;
|
||||
use App\Http\Controllers\LocationController;
|
||||
use App\Http\Controllers\LocaleController;
|
||||
use App\Http\Controllers\ProductController;
|
||||
|
||||
Route::group(['prefix' => '/dummy'], function () {
|
||||
Route::group(['prefix' => '/'], function () {
|
||||
Route::get('', [RoutingController::class, 'index'])->name('root');
|
||||
Route::get('{first}/{second}/{third}', [RoutingController::class, 'thirdLevel'])->name('third');
|
||||
Route::get('{first}/{second}', [RoutingController::class, 'secondLevel'])->name('second');
|
||||
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');
|
||||
Loading…
Reference in New Issue