From 5328c33b348809c8573e9d41a41d29cba0f3809d Mon Sep 17 00:00:00 2001 From: A1Gard Date: Sat, 3 Aug 2024 07:16:27 +0330 Subject: [PATCH] added Karen theme part improved ux of preview QuantitiesAddToCard --- .../js/client-vue/QuantitiesAddToCard.vue | 3 + .../product/ProductAria/ProductAria.blade.php | 71 +++--- .../product/ProductAria/ProductAria.js | 2 + .../ProductKaren/ProductKaren.blade.php | 204 ++++++++++++++++++ .../product/ProductKaren/ProductKaren.js | 93 ++++++++ .../product/ProductKaren/ProductKaren.json | 10 + .../product/ProductKaren/ProductKaren.php | 30 +++ .../product/ProductKaren/ProductKaren.scss | 172 +++++++++++++++ .../product/ProductKaren/screenshot.png | Bin 0 -> 448868 bytes 9 files changed, 552 insertions(+), 33 deletions(-) create mode 100644 resources/views/segments/product/ProductKaren/ProductKaren.blade.php create mode 100644 resources/views/segments/product/ProductKaren/ProductKaren.js create mode 100644 resources/views/segments/product/ProductKaren/ProductKaren.json create mode 100644 resources/views/segments/product/ProductKaren/ProductKaren.php create mode 100644 resources/views/segments/product/ProductKaren/ProductKaren.scss create mode 100644 resources/views/segments/product/ProductKaren/screenshot.png diff --git a/resources/js/client-vue/QuantitiesAddToCard.vue b/resources/js/client-vue/QuantitiesAddToCard.vue index 9207cd7..1a2c9a2 100644 --- a/resources/js/client-vue/QuantitiesAddToCard.vue +++ b/resources/js/client-vue/QuantitiesAddToCard.vue @@ -99,6 +99,9 @@ export default { methods: { select(i) { document.querySelector('#price').innerText = commafy(this.qz[i].price.toString()) + ' ' + this.currency; + let index = this.qz[i].image; + document.querySelector('#preview a').setAttribute('href',document.querySelector(`#hidden-images a:nth-child(${index+1})`).getAttribute('href')); + document.querySelector('#preview img').setAttribute('src',document.querySelector(`#hidden-images a:nth-child(${index+1}) img`).getAttribute('src')); this.selected = i; }, async add2card() { diff --git a/resources/views/segments/product/ProductAria/ProductAria.blade.php b/resources/views/segments/product/ProductAria/ProductAria.blade.php index e04208a..734bc0c 100644 --- a/resources/views/segments/product/ProductAria/ProductAria.blade.php +++ b/resources/views/segments/product/ProductAria/ProductAria.blade.php @@ -20,10 +20,12 @@
- - {{$product->name}} - +
+ + {{$product->name}} + +
@foreach($product->getMedia() as $media)
@@ -71,14 +73,14 @@
 
@if($product->quantities()->count()>0) hasDiscount()) - :discount='@json($product->activeDiscounts()->first())' - @endif + @if($product->hasDiscount()) + :discount='@json($product->activeDiscounts()->first())' + @endif > @else

- @@ -145,23 +148,25 @@

@if($product->table != null || trim($product->table) != '') -
-

- -

-
-
- {!! $product->table !!} +
+

+ +

+
+
+ {!! $product->table !!} +
-
@endif

-

@@ -198,16 +203,16 @@
diff --git a/resources/views/segments/product/ProductAria/ProductAria.js b/resources/views/segments/product/ProductAria/ProductAria.js index 49d362b..0d3091a 100644 --- a/resources/views/segments/product/ProductAria/ProductAria.js +++ b/resources/views/segments/product/ProductAria/ProductAria.js @@ -4,6 +4,8 @@ import {tns} from "tiny-slider/src/tiny-slider"; var ariaImgSlider, ariaRelativeSlider; document.addEventListener('DOMContentLoaded',function () { + + for (const el of document.querySelectorAll('.light-box')) { el.addEventListener('click', Lightbox.initialize); } diff --git a/resources/views/segments/product/ProductKaren/ProductKaren.blade.php b/resources/views/segments/product/ProductKaren/ProductKaren.blade.php new file mode 100644 index 0000000..b64f0b8 --- /dev/null +++ b/resources/views/segments/product/ProductKaren/ProductKaren.blade.php @@ -0,0 +1,204 @@ +
+ +
+
+
+
+ + {{$product->name}} + +
+
+ @foreach($product->getMedia() as $media) +
+ + {{$product->name}} + +
+ @endforeach +
+
+
+ + + +

+ {{$product->name}} +

+
+

+ {{$product->excerpt}} +

+
+
+
+ {{$product->getPrice()}} +
+ + @if($product->hasDiscount()) +
+ {{$product->oldPrice()}} +
+ @endif +
+ @if($product->sku != null && $product->sku != '') +
+ + + {{__("SKU")}}: + + + {{$product->sku}} + +
+ @endif + @if($product->categories()->count() > 0) +
+ + {{__("Categories")}}: + + @foreach($product->categories()->where('id','<>',$product->category->id)->get() as $cat) + + {{$cat->name}}, + + @endforeach + + {{$product->category->name}} + +
+ @endif + @if($product->tags()->count() > 0) +
+ + {{__("Tags")}}: + + @foreach($product->tags as $tag) + + + {{$tag->name}} + + @endforeach +
+ @endif +
+ + + + {{__("Toggle favorite")}} + + + + + {{__("Add to compare list")}} + +
 
+ + @if($product->quantities()->count()>0) + hasDiscount()) + :discount='@json($product->activeDiscounts()->first())' + @endif + > + @else + + + {{__("Add to card")}} + + @endif +
+
+ +
+ {!! $product->description !!} +
+
+ {!! $product->table !!} +
+
+ + + + + + @foreach($product->fullMeta() as $meta) + + + + + @endforeach +
+ {{__("Item")}} + + {{__("Value")}} +
+ +   + {{$meta['data']->label}} + + {!! $meta['human_value'] !!} +
+
+

+ {{__("Related products")}} +

+
+ @foreach($product->category->products()->where('status',1)->limit(10)->get() as $p) + + @endforeach +
+
+
+ @foreach($product->getMedia() as $k => $media) + + {{$product->name}} + + @endforeach +
+
diff --git a/resources/views/segments/product/ProductKaren/ProductKaren.js b/resources/views/segments/product/ProductKaren/ProductKaren.js new file mode 100644 index 0000000..b99def1 --- /dev/null +++ b/resources/views/segments/product/ProductKaren/ProductKaren.js @@ -0,0 +1,93 @@ +import Lightbox from 'bs5-lightbox' ; +import {tns} from "tiny-slider/src/tiny-slider"; + +var karenImgSlider, karenRelativeSlider; +document.addEventListener('DOMContentLoaded',function () { + + for (const el of document.querySelectorAll('.light-box')) { + el.addEventListener('click', Lightbox.initialize); + } + karenImgSlider = tns({ + container: '#karen-img-slider', + items: 3, + autoplay: true, + autoplayButton: false, + // nextButton: false, + controls: false, + autoplayHoverPause: true, + mouseDrag: true, + gutter: 5, + slideBy: 1, + autoplayTimeout: 5000, + // speed:10000, + }); + karenRelativeSlider = tns({ + container: '#rel-products', + items: 3, + autoplay: true, + autoplayButton: false, + // nextButton: false, + controls: false, + autoplayHoverPause: true, + mouseDrag: true, + gutter: 5, + slideBy: 1, + autoplayTimeout: 5000, + responsive:{ + 560:{ + items: 1, + }, + 768:{ + items: 2, + }, + 1000:{ + items: 4, + }, + 1400:{ + items: 5, + }, + + } + // speed:10000, + }); + + document.querySelectorAll('#karen-img-slider a')?.forEach(function (el) { + el.addEventListener('click',function (e) { + e.preventDefault(); + document.querySelector('#karen-main-img').setAttribute('href',el.getAttribute('href')); + document.querySelector('#karen-main-img img').setAttribute('src',el.querySelector('img').getAttribute('src')); + }) + }); + + + // tabs + const tabs = document.querySelectorAll('.navtab'); + const contents = document.querySelectorAll('.tab-content'); + const underline = document.querySelector('.underline'); + + function updateUnderline() { + const activeTab = document.querySelector('.navtab.active'); + underline.style.width = `${activeTab.offsetWidth}px`; + underline.style.left = `${activeTab.offsetLeft}px`; + } + + tabs.forEach(tab => { + tab.addEventListener('click', () => { + tabs.forEach(t => t.classList.remove('active')); + tab.classList.add('active'); + const target = tab.getAttribute('data-target'); + contents.forEach(content => { + if (content.id === target) { + content.classList.add('active'); + } else { + content.classList.remove('active'); + } + }); + updateUnderline(); + }); + }); + + window.addEventListener('resize', updateUnderline); + updateUnderline(); + +}); diff --git a/resources/views/segments/product/ProductKaren/ProductKaren.json b/resources/views/segments/product/ProductKaren/ProductKaren.json new file mode 100644 index 0000000..5f889fe --- /dev/null +++ b/resources/views/segments/product/ProductKaren/ProductKaren.json @@ -0,0 +1,10 @@ +{ + "name": "ProductKaren", + "version": "1.0", + "author": "xStack", + "email": "xshop@xstack.ir", + "license": "GPL-3.0-or-later", + "url": "https:\/\/xstack.ir", + "author_url": "https:\/\/4xmen.ir", + "packages": [] +} \ No newline at end of file diff --git a/resources/views/segments/product/ProductKaren/ProductKaren.php b/resources/views/segments/product/ProductKaren/ProductKaren.php new file mode 100644 index 0000000..bfe4c29 --- /dev/null +++ b/resources/views/segments/product/ProductKaren/ProductKaren.php @@ -0,0 +1,30 @@ +section = 'theme'; + $setting->key = $part->area->name . '_' . $part->part.'_bg'; + $setting->value = '#ffffff'; + $setting->type = 'COLOR'; + $setting->data = json_encode(['name' => 'karen-tab-bg-color']); + $setting->size = 12; + $setting->title = $part->area->name . ' ' . $part->part .' tab background color'; + $setting->save(); + } + public static function onRemove(Part $part = null) + { + Setting::where('key',$part->area->name . '_' . $part->part.'_bg')->first()?->delete(); + } + public static function onMount(Part $part = null) + { + return $part; + } +} diff --git a/resources/views/segments/product/ProductKaren/ProductKaren.scss b/resources/views/segments/product/ProductKaren/ProductKaren.scss new file mode 100644 index 0000000..d8b261e --- /dev/null +++ b/resources/views/segments/product/ProductKaren/ProductKaren.scss @@ -0,0 +1,172 @@ +#ProductKaren { + padding: 1rem 0; + + + #preview{ + position: relative; + } + + #karen-product-detail{ + position: relative; + overflow: hidden; + + .description{ + //border: 1px solid var(--xshop-primary); + //border-radius: var(--xshop-border-radius); + padding: 1rem 0; + p{ + padding: 0; + margin: 0; + } + + margin-bottom: 1rem; + margin-top: 1rem; + } + + h1{ + font-size: 32px; + font-weight: 200; + } + + #price{ + color: var(--xshop-primary); + font-size: 27px; + margin-bottom: .7rem; + text-align: center; + } + + #price-old{ + text-align: center; + text-decoration: line-through red; + font-size: 27px; + color: gray; + font-weight: 200; + } + + .fav-btn, .compare-btn { + + height: 40px; + background: #ffffff55; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: var(--xshop-border-radius); + z-index: 4; + cursor: pointer; + transition: .4s; + padding:7px 1rem; + border: 1px solid var(--xshop-primary); + i{ + font-size: 25px; + } + + &:hover { + background: var(--xshop-primary); + color: var(--xshop-diff); + } + } + .fav-btn { + top: calc(3% + 50px); + + &[data-is-fav="-1"]{ + display: none; + } + &[data-is-fav="1"]{ + .ri-heart-line{ + display: none; + } + } + &[data-is-fav="0"]{ + .ri-heart-fill{ + display: none; + } + } + } + } + p{ + text-align: justify; + color: gray; + line-height: 2em; + } + + + #karen-main-img{ + img{ + height: 50vh; + object-fit: cover; + width: 100%; + border-radius: var(--xshop-border-radius); + } + } + + #karen-img-slider{ + margin-top: 5px; + img{ + width: 100%; + height: 150px; + object-fit: cover; + border-radius: var(--xshop-border-radius); + } + + } + + .karen-product-data{ + padding: 5px; + } + + .karen-product-list{ + padding: 5px; + img{ + height: 20vh; + width: 100%; + object-fit: cover; + border-radius: var(--xshop-border-radius); + } + h5{ + text-align: center; + padding: .5rem 0; + } + } + + + + .navtabs { + display: flex; + justify-content: center; + margin-top: 20px; + background: var(--karen-tab-bg-color,#ffffff); + box-shadow: var(--xshop-shadow); + border-radius: var(--xshop-border-radius); + padding: 10px 20px; + position: relative; + } + .navtab { + margin: 0 10px; + padding: 5px 20px; + cursor: pointer; + transition: color 0.3s; + &:hover { + color: var(--xshop-secondary); + } + } + .navtab.active { + color: var(--xshop-primary); + font-weight: 600; + } + .underline { + position: absolute; + bottom: 0; + height: 2px; + background: var(--xshop-primary); + transition: left 0.3s ease, width 0.3s ease; + } + .tab-content { + display: none; + padding: 1rem; + background: var(--karen-tab-bg-color,#ffffff); + } + .tab-content.active { + display: block; + } + +} diff --git a/resources/views/segments/product/ProductKaren/screenshot.png b/resources/views/segments/product/ProductKaren/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f10e7d0a2dd38c765ecb8c9729296d184c3ea95b GIT binary patch literal 448868 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