View all
Shop now
const updateHeaderMetrics = () => { const header = document.getElementById('header'); const rect = header.getBoundingClientRect(); const headerHeight = rect.bottom; document.documentElement.style.setProperty('--header-height', `${headerHeight}px`); }; window.addEventListener('DOMContentLoaded', updateHeaderMetrics); window.addEventListener('resize', updateHeaderMetrics); const header = document.getElementById('header'); const resizeObserver = new ResizeObserver(entries => { for (let entry of entries) { const rect = entry.target.getBoundingClientRect(); const headerHeight = rect.bottom; document.documentElement.style.setProperty('--header-height', `${headerHeight}px`); } }); resizeObserver.observe(header);
function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl);
Customized Jerseys
function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl);
function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl);
Search
Account
Log in
Create an account
${data.data.count > 99 ? '99+' : data.data.count}
Cart
Home
Popular Leagues
Popular Leagues
Premier League
Premier League
Bournemouth FC
Tottenham FC
Sunderland FC
Manchester City FC
Manchester United FC
Liverpool FC
Aston Villa FC
Chelsea FC
Crystal Palace FC
Brentford FC
Newcastle United FC
Brighton FC
Everton FC
Leeds United FC
Burnley FC
Fulham FC
Nottingham Forest FC
West Ham United FC
Wolverhampton Wanderers FC
Arsenal
Bundesliga
Bundesliga
Bayern FC
RB Leipzig FC
Stuttgart FC
Borussia Dortmund FC
Bayer Leverkusen FC
Frankfurt FC
Hoffenheim FC
Köln FC
Werder Bremen FC
Berlin Union FC
Freiburg FC
Wolfsburg FC
Hamburger SV FC
St. Pauli FC
Augsburg FC
Mainz 05 FC
Heidenheim FC
Mönchengladbach FC
La Liga
La Liga
Real Madrid FC
Barcelona FC
Villarreal FC
Atletico Madrid FC
Espanyol FC
Real Betis FC
Vallecano FC
Elche FC
Athletic Bilbao FC
Getafe FC
Sevilla FC
Alavés FC
Celta Vigo FC
Osasuna FC
Levante FC
RCD Mallorca FC
Real Sociedad FC
Valencia FC
Real Oviedo FC
Girona FC
Serie A
Serie A
Napoli FC
Roma FC
Inter Milan FC
AC Milan FC
Como FC
Bologna FC
Juventus FC
Cremona FC
Atalanta FC
Udinese FC
Torino FC
Lazio FC
Sassuolo FC
Cagliari FC
Parma FC
Lecce FC
Hellas Verona FC
Pisa FC
Fiorentina FC
Genoa FC
Ligue 1
Ligue 1
Paris Saint-Germain FC
Monaco FC
Marseille FC
Strasbourg FC
Lyon FC
RC Lens FC
Lille FC
OGC Nice FC
Toulouse FC
Rennais FC
Le Havre FC
Paris FC
Angers FC
Brest FC
Nantes FC
Lorient FC
Auxerre FC
Metz FC
UEFA Champions League
UEFA Champions League
Paris Saint-Germain FC
Bayern FC
Inter Milan FC
Arsenal FC
Real Madrid FC
Borussia Dortmund FC
Manchester City FC
Newcastle United FC
Barcelona FC
Liverpool FC
Chelsea FC
Sporting Lisbon FC
Galatasaray FC
Tottenham FC
PSV Eindhoven FC
Atalanta FC
Marseille FC
Atletico Madrid FC
Brugge FC
Athletic Bilbao FC
Frankfurt FC
Napol FC
Juventus FC
Monaco FC
Leverkusen FC
Villarreal FC
Copenhagen FC
Olympiacos FC
Benfica FC
Ajax FC
EFL Championship
EFL Championship
Coventry City FC
Middlesbrough FC
Millwall FC
Bristol City FC
Stoke City FC
Charlton Athletic FC
Preston North End FC
Hull City FC
QPR FC
Leicester City FC
West Brom FC
Ipswich Town FC
Swansea City FC
Watford FC
Birmingham City FC
Wrexham FC
Derby County FC
Portsmouth FC
Oxford United FC
Southampton FC
Blackburn FC
Sheffield United FC
Norwich City FC
Sheffield Wednesday FC
Other leagues
Other leagues
German Bundesliga 2
German Bundesliga 2
Bielefeld FC
Hertha BSC
Karlsruhe FC
Schalke 04 FC
Kaiserslautern FC
Nürnberg FC
SC Preußen Münster FC
TSV 1860 Munich FC
Hansa Rostock FC
Rot-Weiss Essen FC
Dresden FC
Hannover 96 FC
Düsseldorf FC
LaLiga 2
LaLiga 2
Tenerife FC
Málaga FC
Deportivo La Coruna FC
Real Zaragoza FC
Albacete FC
Cordoba FC
Racing Santander FC
Cádiz FC
Castellon FC
Burgos FC
Cartagena FC
Ceuta FC
Hércules FC
League One
League One
Huddersfield Town FC
Bolton FC
Northampton Town F.C.
Rotherham United F.C.
Blackpool F.C.
Walsall FC
Bradford City FC
Port Vale FC
Portuguese Super League
Portuguese Super League
Porto FC
Sporting Lisbon FC
Benfica FC
Braga FC
Vitória Guimarães FC
Alverca FC
Scottish Premiership
Scottish Premiership
Celtic FC
Aberdeen FC
Hearts FC
Hibernian FC
Rangers FC
Motherwell FC
Türkiye 1. Süper Futbol Ligi
Türkiye 1. Süper Futbol Ligi
Fenerbahce Sports Club
Galatasaray FC
Besiktas FC
Eredivisie
Eredivisie
PSV Eindhoven FC
Feyenoord FC
AZ Alkmaar FC
Ajax FC
Brazilian Serie B
Brazilian Serie B
Coritiba Foot Ball Club
Criciúma Esporte FC
Atletico Parana FC
Vitória FC
Novorizontino FC
Amazon Football Club
Paysandú Sports FC
Liga MX
Liga MX
Cruz Azul FC
América FC
Atlas FC
Tijuana FC
Tigres FC
Toluca FC
Monterrey FC
Chivas FC
Pumas UNAM FC
Leon FC
Necaxa FC
Santos Laguna FC
Puebla FC
J1 League
J1 League
Kashima Antlers FC
Tokyo Verdy FC
Sanfrecce Hiroshima FC
Urawa Red Diamonds FC
Sagan Tosu FC
Vissel Kobe FC
Yokohama F. Marinos FC
Cerezo Osaka FC
Gamba Osaka FC
Hokkaido Consadole Sapporo FC
Kyoto Sanga FC
Avispa Fukuoka FC
Kashiwa Reysol FC
Shimizu S-Pulse FC
Argentine Professional Football League
Argentine Professional Football League
Club Atlético Boca Juniors
San Lorenzo FC
Atlético Independiente FC
Avellaneda FC
River Plate FC
Al Ain FC
Atlético Tigre FC
Estudiantes de La Plata FC
Atlético Vélez Sársfield FC
Atlético Huracán FC
Atlético Lanús FC
Rosario Central FC
Newell's Old Boys FC
Argentinos Juniors FC
Brazilian Serie A
Brazilian Serie A
Fortaleza FC
Botafogo FC
Flamenco FC
Palmeiras FC
Sao Paulo FC
Esporte Clube Bahia FC
Brazil International FC
Cruzeiro FC
Vasco da Gama FC
Atletico Mineiro FC
Bragantino FC
Esporte Clube Juventude FC
Gremio FC
Corinthians FC
Fluminense FC
Sporting Recife FC
Ceará Sporting FC
santos
Major League Soccer
Major League Soccer
LA Galaxy FC
Philadelphia Union FC
Los Angeles FC
Atlanta United FC
Orlando City FC
Austin FC
Portland Timbers FC
Toronto FC
Dallas FC
Montreal FC
Minnesota United FC
Nashville FC
New York City FC
Columbus Crew FC
San Diego FC
San Jose Earthquakes FC
St. Louis City FC
Vancouver Whitecaps FC
Seattle Sounders FC
Charlotte FC
Cincinnati FC
Houston Dynamo FC
Chicago Fire FC
Orlando Pride FC
Other league clubs
Other league clubs
Palermo FC
Bristol Rovers F.C.
U.C. Sampdoria FC
Bastia FC
Universidad de Chile FC
Al Hilal SFC
Al-Nassr FC
AIK FC
Basel FC
Malmö FC
Al-Ittihad FC
Colo Colo FC
Johor FC
Selangor FC
Legia Warszawa FC
Al Ahly SC
Deportivo Palestino FC
Atlético Peñarol FC
Copenhagen FC
Mamelodi Sundowns FC
Steaua Bucureşti FC
Dinamo Bucuresti FC
Kaizer Chiefs FC
Millionaires FC
Cerro Porteño FC
Motagua FC
Red Bull Salzburg FC
CD Olimpia FC
Santa Cruz FC
Alianza Lima FC
Associação Portuguesa de Desportos FC
MC Alger FC
Panathinaikos FC
Ayr United FC
Dinamo Tbilisi FC
West Santos FC
Club de Cuervos FC
Muchachos FC
Atlético Parceros FC
Los Chamos FC
Raniza FC
Galácticos del Caribe FC
Real Titán FC
Persas FC
Olimpo United FC
Atlético Juventus FC
Barcelona SC
Seoul FC
Rio Branco Atlético FC
Nacional FC
Cork City FC
Sporting Cristal FC
Figueirense FC
Olympiacos FC
St Patrick's Athletic FC
Universitaria de Quito FC
Beitar Jerusalem FC
Maccabi Tel Aviv FC
Libertad FC
Catholic University FC
New England Revolution FC
Olimpia FC
Linfield FC
Emelec FC
Ulsan HD FC
Sorrento FC
AEK Athens FC
Maccabi Haifa FC
Avai FC
AFC Richmond
Bohemian FC
Barranquilla Youth FC
Atlético Nacional FC
2026 FIFA World Cup
2026 FIFA World Cup
Argentina
Germany
England
Spain
Portugal
Italy
Mexico
Chile
Belgium
Sweden
japan
Peru
Costa Rica
Qatar
Saudi Arabia
Northern Ireland
Algeria
Wales
Scotland
Venezuela
Ukraine
Greece
UAE
Sweden
Hungary
Colombia
Brazil
Canada
Bosnia and Herzegovina
Czech Republic
turkey
USA
France
National Team
National Team
Europe
Europe
Germany
France
Portugal
Belgium
Denmark
England
Spain
Switzerland
Italy
Netherlands
Albania
Croatia
Finland
Sweden
Ireland
Greece
Wales
Hungary
Scotland
Austria
Georgia
Romania
Armenia
Norway
Yugoslavia
Ukraine
Northern Ireland
Türkiye
North America
North America
Mexico
Canada
El Salvador
Panama
Jamaica
Guatemala
USA
Costa Rica
South America
South America
Argentina
Brazil
Uruguay
Colombia
Chile
Venezuela
Bolivia
Peru
Asia
Asia
Korea
Japan
Malaysia
Australia
Philippines
Palestine
China
Israel
Zealand
Qatar
Saudi Arabia
UAE
Africa
Africa
Senegal
Tunisia
Ivory Coast
Morocco
Ghana
Egypt
Nigeria
Mali
Congo
Burkina Faso
Togo
Retro
Kids
Long Sleeve
Windbreaker
Log in
Create an account
Home
Popular Leagues
Premier League
Bournemouth FC
Tottenham FC
Sunderland FC
Manchester City FC
Manchester United FC
Liverpool FC
Aston Villa FC
Chelsea FC
Crystal Palace FC
Brentford FC
Newcastle United FC
Brighton FC
Everton FC
Leeds United FC
Burnley FC
Fulham FC
Nottingham Forest FC
West Ham United FC
Wolverhampton Wanderers FC
Arsenal
Bundesliga
Bayern FC
RB Leipzig FC
Stuttgart FC
Borussia Dortmund FC
Bayer Leverkusen FC
Frankfurt FC
Hoffenheim FC
Köln FC
Werder Bremen FC
Berlin Union FC
Freiburg FC
Wolfsburg FC
Hamburger SV FC
St. Pauli FC
Augsburg FC
Mainz 05 FC
Heidenheim FC
Mönchengladbach FC
La Liga
Real Madrid FC
Barcelona FC
Villarreal FC
Atletico Madrid FC
Espanyol FC
Real Betis FC
Vallecano FC
Elche FC
Athletic Bilbao FC
Getafe FC
Sevilla FC
Alavés FC
Celta Vigo FC
Osasuna FC
Levante FC
RCD Mallorca FC
Real Sociedad FC
Valencia FC
Real Oviedo FC
Girona FC
Serie A
Napoli FC
Roma FC
Inter Milan FC
AC Milan FC
Como FC
Bologna FC
Juventus FC
Cremona FC
Atalanta FC
Udinese FC
Torino FC
Lazio FC
Sassuolo FC
Cagliari FC
Parma FC
Lecce FC
Hellas Verona FC
Pisa FC
Fiorentina FC
Genoa FC
Ligue 1
Paris Saint-Germain FC
Monaco FC
Marseille FC
Strasbourg FC
Lyon FC
RC Lens FC
Lille FC
OGC Nice FC
Toulouse FC
Rennais FC
Le Havre FC
Paris FC
Angers FC
Brest FC
Nantes FC
Lorient FC
Auxerre FC
Metz FC
UEFA Champions League
Paris Saint-Germain FC
Bayern FC
Inter Milan FC
Arsenal FC
Real Madrid FC
Borussia Dortmund FC
Manchester City FC
Newcastle United FC
Barcelona FC
Liverpool FC
Chelsea FC
Sporting Lisbon FC
Galatasaray FC
Tottenham FC
PSV Eindhoven FC
Atalanta FC
Marseille FC
Atletico Madrid FC
Brugge FC
Athletic Bilbao FC
Frankfurt FC
Napol FC
Juventus FC
Monaco FC
Leverkusen FC
Villarreal FC
Copenhagen FC
Olympiacos FC
Benfica FC
Ajax FC
EFL Championship
Coventry City FC
Middlesbrough FC
Millwall FC
Bristol City FC
Stoke City FC
Charlton Athletic FC
Preston North End FC
Hull City FC
QPR FC
Leicester City FC
West Brom FC
Ipswich Town FC
Swansea City FC
Watford FC
Birmingham City FC
Wrexham FC
Derby County FC
Portsmouth FC
Oxford United FC
Southampton FC
Blackburn FC
Sheffield United FC
Norwich City FC
Sheffield Wednesday FC
Other leagues
German Bundesliga 2
Bielefeld FC
Hertha BSC
Karlsruhe FC
Schalke 04 FC
Kaiserslautern FC
Nürnberg FC
SC Preußen Münster FC
TSV 1860 Munich FC
Hansa Rostock FC
Rot-Weiss Essen FC
Dresden FC
Hannover 96 FC
Düsseldorf FC
LaLiga 2
Tenerife FC
Málaga FC
Deportivo La Coruna FC
Real Zaragoza FC
Albacete FC
Cordoba FC
Racing Santander FC
Cádiz FC
Castellon FC
Burgos FC
Cartagena FC
Ceuta FC
Hércules FC
League One
Huddersfield Town FC
Bolton FC
Northampton Town F.C.
Rotherham United F.C.
Blackpool F.C.
Walsall FC
Bradford City FC
Port Vale FC
Portuguese Super League
Porto FC
Sporting Lisbon FC
Benfica FC
Braga FC
Vitória Guimarães FC
Alverca FC
Scottish Premiership
Celtic FC
Aberdeen FC
Hearts FC
Hibernian FC
Rangers FC
Motherwell FC
Türkiye 1. Süper Futbol Ligi
Fenerbahce Sports Club
Galatasaray FC
Besiktas FC
Eredivisie
PSV Eindhoven FC
Feyenoord FC
AZ Alkmaar FC
Ajax FC
Brazilian Serie B
Coritiba Foot Ball Club
Criciúma Esporte FC
Atletico Parana FC
Vitória FC
Novorizontino FC
Amazon Football Club
Paysandú Sports FC
Liga MX
Cruz Azul FC
América FC
Atlas FC
Tijuana FC
Tigres FC
Toluca FC
Monterrey FC
Chivas FC
Pumas UNAM FC
Leon FC
Necaxa FC
Santos Laguna FC
Puebla FC
J1 League
Kashima Antlers FC
Tokyo Verdy FC
Sanfrecce Hiroshima FC
Urawa Red Diamonds FC
Sagan Tosu FC
Vissel Kobe FC
Yokohama F. Marinos FC
Cerezo Osaka FC
Gamba Osaka FC
Hokkaido Consadole Sapporo FC
Kyoto Sanga FC
Avispa Fukuoka FC
Kashiwa Reysol FC
Shimizu S-Pulse FC
Argentine Professional Football League
Club Atlético Boca Juniors
San Lorenzo FC
Atlético Independiente FC
Avellaneda FC
River Plate FC
Al Ain FC
Atlético Tigre FC
Estudiantes de La Plata FC
Atlético Vélez Sársfield FC
Atlético Huracán FC
Atlético Lanús FC
Rosario Central FC
Newell's Old Boys FC
Argentinos Juniors FC
Brazilian Serie A
Fortaleza FC
Botafogo FC
Flamenco FC
Palmeiras FC
Sao Paulo FC
Esporte Clube Bahia FC
Brazil International FC
Cruzeiro FC
Vasco da Gama FC
Atletico Mineiro FC
Bragantino FC
Esporte Clube Juventude FC
Gremio FC
Corinthians FC
Fluminense FC
Sporting Recife FC
Ceará Sporting FC
santos
Major League Soccer
LA Galaxy FC
Philadelphia Union FC
Los Angeles FC
Atlanta United FC
Orlando City FC
Austin FC
Portland Timbers FC
Toronto FC
Dallas FC
Montreal FC
Minnesota United FC
Nashville FC
New York City FC
Columbus Crew FC
San Diego FC
San Jose Earthquakes FC
St. Louis City FC
Vancouver Whitecaps FC
Seattle Sounders FC
Charlotte FC
Cincinnati FC
Houston Dynamo FC
Chicago Fire FC
Orlando Pride FC
Other league clubs
Palermo FC
Bristol Rovers F.C.
U.C. Sampdoria FC
Bastia FC
Universidad de Chile FC
Al Hilal SFC
Al-Nassr FC
AIK FC
Basel FC
Malmö FC
Al-Ittihad FC
Colo Colo FC
Johor FC
Selangor FC
Legia Warszawa FC
Al Ahly SC
Deportivo Palestino FC
Atlético Peñarol FC
Copenhagen FC
Mamelodi Sundowns FC
Steaua Bucureşti FC
Dinamo Bucuresti FC
Kaizer Chiefs FC
Millionaires FC
Cerro Porteño FC
Motagua FC
Red Bull Salzburg FC
CD Olimpia FC
Santa Cruz FC
Alianza Lima FC
Associação Portuguesa de Desportos FC
MC Alger FC
Panathinaikos FC
Ayr United FC
Dinamo Tbilisi FC
West Santos FC
Club de Cuervos FC
Muchachos FC
Atlético Parceros FC
Los Chamos FC
Raniza FC
Galácticos del Caribe FC
Real Titán FC
Persas FC
Olimpo United FC
Atlético Juventus FC
Barcelona SC
Seoul FC
Rio Branco Atlético FC
Nacional FC
Cork City FC
Sporting Cristal FC
Figueirense FC
Olympiacos FC
St Patrick's Athletic FC
Universitaria de Quito FC
Beitar Jerusalem FC
Maccabi Tel Aviv FC
Libertad FC
Catholic University FC
New England Revolution FC
Olimpia FC
Linfield FC
Emelec FC
Ulsan HD FC
Sorrento FC
AEK Athens FC
Maccabi Haifa FC
Avai FC
AFC Richmond
Bohemian FC
Barranquilla Youth FC
Atlético Nacional FC
2026 FIFA World Cup
Argentina
Germany
England
Spain
Portugal
Italy
Mexico
Chile
Belgium
Sweden
japan
Peru
Costa Rica
Qatar
Saudi Arabia
Northern Ireland
Algeria
Wales
Scotland
Venezuela
Ukraine
Greece
UAE
Sweden
Hungary
Colombia
Brazil
Canada
Bosnia and Herzegovina
Czech Republic
turkey
USA
France
Player Edition - Germany 2026 World Cup Home Jersey
$22.90
$47.90
-
$25.00
-
$25.00
National Team
Europe
Germany
France
Portugal
Belgium
Denmark
England
Spain
Switzerland
Italy
Netherlands
Albania
Croatia
Finland
Sweden
Ireland
Greece
Wales
Hungary
Scotland
Austria
Georgia
Romania
Armenia
Norway
Yugoslavia
Ukraine
Northern Ireland
Türkiye
North America
Mexico
Canada
El Salvador
Panama
Jamaica
Guatemala
USA
Costa Rica
South America
Argentina
Brazil
Uruguay
Colombia
Chile
Venezuela
Bolivia
Peru
Asia
Korea
Japan
Malaysia
Australia
Philippines
Palestine
China
Israel
Zealand
Qatar
Saudi Arabia
UAE
Africa
Senegal
Tunisia
Ivory Coast
Morocco
Ghana
Egypt
Nigeria
Mali
Congo
Burkina Faso
Togo
Retro
Kids
Long Sleeve
Windbreaker
More links
${function (){ var linkList =[false,true,true,true,true,false,false,false,false].slice(offset); var hasChild = linkList.some(v => v); var scriptStr = `
var parentId = "#header-more-link-container"; var contentId = "#header-more-link-container-content"; var container = SPZCore.Dom.scopedQuerySelector(document.body, parentId ); var containerContent = SPZCore.Dom.scopedQuerySelector(document.body, parentId+" "+contentId); var offset = +containerContent.getAttribute("offset"); var linkList = [false,true,true,true,true,false,false,false,false].slice(offset); var hasChild = linkList.some(v => v); if(hasChild){ container.classList.remove("more-link-simple-container"); container.classList.add("more-link-multi-container"); }else{ container.classList.add("more-link-simple-container"); container.classList.remove("more-link-multi-container"); }
` function renderContent( currentIdx ,content ){ if( offset+1 > currentIdx ){ return "" } return content } if(!hasChild){ return `
${renderContent( 1, `
Home
` )} ${renderContent( 2, `
Popular Leagues
` )} ${renderContent( 3, `
Other leagues
` )} ${renderContent( 4, `
2026 FIFA World Cup
` )} ${renderContent( 5, `
National Team
` )} ${renderContent( 6, `
Retro
` )} ${renderContent( 7, `
Kids
` )} ${renderContent( 8, `
Long Sleeve
` )} ${renderContent( 9, `
Windbreaker
` )} ${scriptStr}
` } return `
${renderContent(1, `
Home
` )} ${renderContent(2, `
Popular Leagues
` )} ${renderContent(3, `
Other leagues
` )} ${renderContent(4, `
2026 FIFA World Cup
` )} ${renderContent(5, `
National Team
` )} ${renderContent(6, `
Retro
` )} ${renderContent(7, `
Kids
` )} ${renderContent(8, `
Long Sleeve
` )} ${renderContent(9, `
Windbreaker
` )}
${renderContent(1, `
` )} ${renderContent(2, `
Premier League
Bournemouth FC
Tottenham FC
Sunderland FC
Manchester City FC
Manchester United FC
Liverpool FC
Aston Villa FC
Chelsea FC
Crystal Palace FC
Brentford FC
Newcastle United FC
Brighton FC
Everton FC
Leeds United FC
Burnley FC
Fulham FC
Nottingham Forest FC
West Ham United FC
Wolverhampton Wanderers FC
Arsenal
Bundesliga
Bayern FC
RB Leipzig FC
Stuttgart FC
Borussia Dortmund FC
Bayer Leverkusen FC
Frankfurt FC
Hoffenheim FC
Köln FC
Werder Bremen FC
Berlin Union FC
Freiburg FC
Wolfsburg FC
Hamburger SV FC
St. Pauli FC
Augsburg FC
Mainz 05 FC
Heidenheim FC
Mönchengladbach FC
La Liga
Real Madrid FC
Barcelona FC
Villarreal FC
Atletico Madrid FC
Espanyol FC
Real Betis FC
Vallecano FC
Elche FC
Athletic Bilbao FC
Getafe FC
Sevilla FC
Alavés FC
Celta Vigo FC
Osasuna FC
Levante FC
RCD Mallorca FC
Real Sociedad FC
Valencia FC
Real Oviedo FC
Girona FC
Serie A
Napoli FC
Roma FC
Inter Milan FC
AC Milan FC
Como FC
Bologna FC
Juventus FC
Cremona FC
Atalanta FC
Udinese FC
Torino FC
Lazio FC
Sassuolo FC
Cagliari FC
Parma FC
Lecce FC
Hellas Verona FC
Pisa FC
Fiorentina FC
Genoa FC
Ligue 1
Paris Saint-Germain FC
Monaco FC
Marseille FC
Strasbourg FC
Lyon FC
RC Lens FC
Lille FC
OGC Nice FC
Toulouse FC
Rennais FC
Le Havre FC
Paris FC
Angers FC
Brest FC
Nantes FC
Lorient FC
Auxerre FC
Metz FC
UEFA Champions League
Paris Saint-Germain FC
Bayern FC
Inter Milan FC
Arsenal FC
Real Madrid FC
Borussia Dortmund FC
Manchester City FC
Newcastle United FC
Barcelona FC
Liverpool FC
Chelsea FC
Sporting Lisbon FC
Galatasaray FC
Tottenham FC
PSV Eindhoven FC
Atalanta FC
Marseille FC
Atletico Madrid FC
Brugge FC
Athletic Bilbao FC
Frankfurt FC
Napol FC
Juventus FC
Monaco FC
Leverkusen FC
Villarreal FC
Copenhagen FC
Olympiacos FC
Benfica FC
Ajax FC
EFL Championship
Coventry City FC
Middlesbrough FC
Millwall FC
Bristol City FC
Stoke City FC
Charlton Athletic FC
Preston North End FC
Hull City FC
QPR FC
Leicester City FC
West Brom FC
Ipswich Town FC
Swansea City FC
Watford FC
Birmingham City FC
Wrexham FC
Derby County FC
Portsmouth FC
Oxford United FC
Southampton FC
Blackburn FC
Sheffield United FC
Norwich City FC
Sheffield Wednesday FC
` )} ${renderContent(3, `
German Bundesliga 2
Bielefeld FC
Hertha BSC
Karlsruhe FC
Schalke 04 FC
Kaiserslautern FC
Nürnberg FC
SC Preußen Münster FC
TSV 1860 Munich FC
Hansa Rostock FC
Rot-Weiss Essen FC
Dresden FC
Hannover 96 FC
Düsseldorf FC
LaLiga 2
Tenerife FC
Málaga FC
Deportivo La Coruna FC
Real Zaragoza FC
Albacete FC
Cordoba FC
Racing Santander FC
Cádiz FC
Castellon FC
Burgos FC
Cartagena FC
Ceuta FC
Hércules FC
League One
Huddersfield Town FC
Bolton FC
Northampton Town F.C.
Rotherham United F.C.
Blackpool F.C.
Walsall FC
Bradford City FC
Port Vale FC
Portuguese Super League
Porto FC
Sporting Lisbon FC
Benfica FC
Braga FC
Vitória Guimarães FC
Alverca FC
Scottish Premiership
Celtic FC
Aberdeen FC
Hearts FC
Hibernian FC
Rangers FC
Motherwell FC
Türkiye 1. Süper Futbol Ligi
Fenerbahce Sports Club
Galatasaray FC
Besiktas FC
Eredivisie
PSV Eindhoven FC
Feyenoord FC
AZ Alkmaar FC
Ajax FC
Brazilian Serie B
Coritiba Foot Ball Club
Criciúma Esporte FC
Atletico Parana FC
Vitória FC
Novorizontino FC
Amazon Football Club
Paysandú Sports FC
Liga MX
Cruz Azul FC
América FC
Atlas FC
Tijuana FC
Tigres FC
Toluca FC
Monterrey FC
Chivas FC
Pumas UNAM FC
Leon FC
Necaxa FC
Santos Laguna FC
Puebla FC
J1 League
Kashima Antlers FC
Tokyo Verdy FC
Sanfrecce Hiroshima FC
Urawa Red Diamonds FC
Sagan Tosu FC
Vissel Kobe FC
Yokohama F. Marinos FC
Cerezo Osaka FC
Gamba Osaka FC
Hokkaido Consadole Sapporo FC
Kyoto Sanga FC
Avispa Fukuoka FC
Kashiwa Reysol FC
Shimizu S-Pulse FC
Argentine Professional Football League
Club Atlético Boca Juniors
San Lorenzo FC
Atlético Independiente FC
Avellaneda FC
River Plate FC
Al Ain FC
Atlético Tigre FC
Estudiantes de La Plata FC
Atlético Vélez Sársfield FC
Atlético Huracán FC
Atlético Lanús FC
Rosario Central FC
Newell's Old Boys FC
Argentinos Juniors FC
Brazilian Serie A
Fortaleza FC
Botafogo FC
Flamenco FC
Palmeiras FC
Sao Paulo FC
Esporte Clube Bahia FC
Brazil International FC
Cruzeiro FC
Vasco da Gama FC
Atletico Mineiro FC
Bragantino FC
Esporte Clube Juventude FC
Gremio FC
Corinthians FC
Fluminense FC
Sporting Recife FC
Ceará Sporting FC
santos
Major League Soccer
LA Galaxy FC
Philadelphia Union FC
Los Angeles FC
Atlanta United FC
Orlando City FC
Austin FC
Portland Timbers FC
Toronto FC
Dallas FC
Montreal FC
Minnesota United FC
Nashville FC
New York City FC
Columbus Crew FC
San Diego FC
San Jose Earthquakes FC
St. Louis City FC
Vancouver Whitecaps FC
Seattle Sounders FC
Charlotte FC
Cincinnati FC
Houston Dynamo FC
Chicago Fire FC
Orlando Pride FC
Other league clubs
Palermo FC
Bristol Rovers F.C.
U.C. Sampdoria FC
Bastia FC
Universidad de Chile FC
Al Hilal SFC
Al-Nassr FC
AIK FC
Basel FC
Malmö FC
Al-Ittihad FC
Colo Colo FC
Johor FC
Selangor FC
Legia Warszawa FC
Al Ahly SC
Deportivo Palestino FC
Atlético Peñarol FC
Copenhagen FC
Mamelodi Sundowns FC
Steaua Bucureşti FC
Dinamo Bucuresti FC
Kaizer Chiefs FC
Millionaires FC
Cerro Porteño FC
Motagua FC
Red Bull Salzburg FC
CD Olimpia FC
Santa Cruz FC
Alianza Lima FC
Associação Portuguesa de Desportos FC
MC Alger FC
Panathinaikos FC
Ayr United FC
Dinamo Tbilisi FC
West Santos FC
Club de Cuervos FC
Muchachos FC
Atlético Parceros FC
Los Chamos FC
Raniza FC
Galácticos del Caribe FC
Real Titán FC
Persas FC
Olimpo United FC
Atlético Juventus FC
Barcelona SC
Seoul FC
Rio Branco Atlético FC
Nacional FC
Cork City FC
Sporting Cristal FC
Figueirense FC
Olympiacos FC
St Patrick's Athletic FC
Universitaria de Quito FC
Beitar Jerusalem FC
Maccabi Tel Aviv FC
Libertad FC
Catholic University FC
New England Revolution FC
Olimpia FC
Linfield FC
Emelec FC
Ulsan HD FC
Sorrento FC
AEK Athens FC
Maccabi Haifa FC
Avai FC
AFC Richmond
Bohemian FC
Barranquilla Youth FC
Atlético Nacional FC
` )} ${renderContent(4, `
Argentina
Germany
England
Spain
Portugal
Italy
Mexico
Chile
Belgium
Sweden
japan
Peru
Costa Rica
Qatar
Saudi Arabia
Northern Ireland
Algeria
Wales
Scotland
Venezuela
Ukraine
Greece
UAE
Sweden
Hungary
Colombia
Brazil
Canada
Bosnia and Herzegovina
Czech Republic
turkey
USA
France
` )} ${renderContent(5, `
Europe
Germany
France
Portugal
Belgium
Denmark
England
Spain
Switzerland
Italy
Netherlands
Albania
Croatia
Finland
Sweden
Ireland
Greece
Wales
Hungary
Scotland
Austria
Georgia
Romania
Armenia
Norway
Yugoslavia
Ukraine
Northern Ireland
Türkiye
North America
Mexico
Canada
El Salvador
Panama
Jamaica
Guatemala
USA
Costa Rica
South America
Argentina
Brazil
Uruguay
Colombia
Chile
Venezuela
Bolivia
Peru
Asia
Korea
Japan
Malaysia
Australia
Philippines
Palestine
China
Israel
Zealand
Qatar
Saudi Arabia
UAE
Africa
Senegal
Tunisia
Ivory Coast
Morocco
Ghana
Egypt
Nigeria
Mali
Congo
Burkina Faso
Togo
` )} ${renderContent(6, `
` )} ${renderContent(7, `
` )} ${renderContent(8, `
` )} ${renderContent(9, `
` )} ${scriptStr}
` }()}
function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl);
${SSS}
function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl);
${function() { if (data === undefined || typeof data !== 'string' || data == '') return `
`; if (data === 'close') return ''; return `
View more
`; }()}
1/11
${data.index + 1}/${data.total}
Facebook
Twitter
Pinterest
Player Version 2026 France World Cup Home Jersey - Long Sleeve
63 sold
$27.90
$55.90
-
$28.00
${function() { const variantData = data.variant || {"id":"c5f55d23-b8cf-4419-89b5-11415646891f","product_id":"7b95db68-bd9b-413b-a063-28898041d9d8","title":"S","weight_unit":"kg","inventory_quantity":1000,"sku":"\u7403\u5458\u7248 2026 \u6cd5\u56fd \u4e16\u754c\u676f\u4e3b\u573a\u7403\u8863-\u957f\u8896","barcode":"","position":1,"option1":"S","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":27.9,"min_quantity":1}],"weight":"0","compare_at_price":"55.9","price":"27.9","retail_price":"55.9","available":true,"url":"\/products\/player-version-2026-france-world-cup-home-jersey-long-sleeve?variant=c5f55d23-b8cf-4419-89b5-11415646891f","available_quantity":999999999,"options":[{"name":"Size","value":"S"}],"off_ratio":"50","flashsale_info":{"variant_id":"c5f55d23-b8cf-4419-89b5-11415646891f","product_id":"","quantity":0,"discount_id":"","limit_time":0,"limit_buy":0,"user_limit_buy":0,"discount_sales":0,"discount_sales_rate":"","discount_stock":0,"ends_at":0,"starts_at":0,"allow_oversold":"","allocation_method":"","price":"27.9","compare_at_price":"","discount_price":"27.9","customary_saved_price":"","customary_off_ratio":"","discount_saved_price":"","discount_off_ratio":"50","use_before_price":false,"before_price":"","title":"","properties":"","color_setting_promotional_copy":"","discount_quantity":0,"is_need_split":false},"sales":63}; const saveType = "amount"; const productSaveLabel = true; return `
-
${saveType == 'percent' ? `
-${variantData.off_ratio}%
` : `
-
` }
`; }()}
${function(){ // 获取基础配置数据 const isRTL = originData.isRTL; // 是否从右到左显示 const isMobile = originData.isMobile; // 是否移动端 const inProductDetail = originData.inProductDetail; // 是否在商品详情页 const image_domain = originData.image_domain; // 图片域名 const copyBtnClass = originData.copyBtnClass; // 复制按钮类名 const copyClass = originData.copyClass; // 复制内容类名 // 优惠码列表 const list = originData.discountCodeData.list || []; if (list.length === 0) { return ``; } // 显示模式: 平铺或折叠 const isTiled = originData.discountCodeData.display_type === "DTE_TILE"; // 获取第一个配置作为默认配置 const productSetting = list[0].product_setting; const { template_type, template_config } = productSetting; const { text, tag, banner, coupon } = template_config.color; // 优惠券样式配置 const { coupon_border_color, // 边框颜色 coupon_background_color, // 背景色起始色 coupon_background_color_end, // 背景色结束色 coupon_color, // 文字颜色 coupon_button_background_color_start, // 按钮背景起始色 coupon_button_background_color_end, // 按钮背景结束色 coupon_button_color // 按钮文字颜色 } = coupon; // 颜色透明度转换函数 const colorToRGBA = (color, alpha) => { if (color.startsWith('#')) { const hex = color.slice(1); const r = parseInt(hex.slice(0, 2), 16); const g = parseInt(hex.slice(2, 4), 16); const b = parseInt(hex.slice(4, 6), 16); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } else if (color.includes('rgb')) { const rgb = color.slice(color.indexOf('(') + 1, color.indexOf(')')).split(','); const r = parseInt(rgb[0]); const g = parseInt(rgb[1]); const b = parseInt(rgb[2]); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } else { return color } } // 渲染平铺样式的优惠券列表 const renderTiledList = (list, isFold = false) => { const rate = isRTL ? '34%' : '66%'; // RTL布局时调整分割线位置 let curDom = ` `; // 循环渲染优惠券列表 for(const item of list) { curDom += `
${item.discount_text}
${(isFold || item.product_setting.show_effective_date) && +item.ends_at !== -1 ? `${item.starts_at} - ${item.ends_at}` : ""}
${item.code}
` } return curDom; } let Dom = ``; // 根据显示模式选择渲染方式 if (isTiled || list.length === 1) { // 根据模板类型渲染不同样式 switch(template_type) { // 文本样式 case 'text': { Dom = `
${function(){ let textDom = ''; for(const item of list) { textDom += `
${ item.discount_text }
Code:
${ item.code }
` } return textDom; }()}
`; break; } // 标签样式 case 'tag': { const { text_color, background_color } = tag; Dom = `
${function(){ let textDom = ''; for(const item of list) { textDom += `
${ item.discount_text }
Code:
${ item.code }
`; } return textDom; }()}
` break; } // 横幅样式 case 'banner': { Dom = `
${function(){ let textDom = ''; for(const item of list) { textDom += `
${ item.discount_text }
Code:
${ item.code }
`; } return textDom; }()}
`; break; } // 优惠券样式 case 'coupon': { Dom = `
${renderTiledList(list)}
` break; } } } else { // 折叠模式样式 const foldStyle = ` `; // 只显示前3个优惠券 const showList = list.slice(0, 3); let couponDom = ""; for(const item of showList) { couponDom += `
${item.discount_text}
` } // PC端弹窗 const webModal = `
${function(){ return renderTiledList(list, true); }()}
` // 移动端侧边栏 const mobileModal = `
${function(){ return renderTiledList(list, true); }()}
` couponDom += `
Click to claim
${isMobile ? mobileModal : webModal} `; Dom = ` ${foldStyle}
${couponDom}
` } return `
${Dom}
`; }()}
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ class SpzCustomDiscountCodeModel extends SPZ.BaseElement { constructor(element) { super(element); // 复制按钮和内容的类名 this.copyBtnClass = "discount_code_btn" this.copyClass = "discount_code_value" } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { // 初始化服务 this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } /** * 渲染优惠码组件 * @param {Object} data - 渲染数据 */ doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, Object.assign(this.getDefaultData(), data) ) .then((el) => { this.clearDom(); this.element.appendChild(el); // 绑定复制代码功能 this.copyCode(el, data); }); } /** * 获取渲染模板 * @param {Object} data - 渲染数据 */ getRenderTemplate(data) { const renderData = Object.assign(this.getDefaultData(), data); return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); return el; }); } /** * 清除DOM内容 */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * 获取默认数据 * @returns {Object} 默认数据对象 */ getDefaultData() { return { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), image_domain: this.win.SHOPLAZZA.image_domain, copyBtnClass: this.copyBtnClass, copyClass: this.copyClass } } /** * 复制优惠码功能 * @param {Element} el - 当前元素 */ copyCode(el) { const copyBtnList = el.querySelectorAll(`.${this.copyBtnClass}`); if (copyBtnList.length > 0) { copyBtnList.forEach(item => { item.onclick = async () => { // 确保获取正确的元素和内容 const codeElement = item.querySelector(`.${this.copyClass}`); if (!codeElement) return; // 获取纯文本内容 const textToCopy = codeElement.innerText.trim(); // 尝试使用现代API,如果失败则使用备用方案 try { if (navigator.clipboard && navigator.clipboard.writeText) { await navigator.clipboard.writeText(textToCopy); } else { throw new Error('Clipboard API not available'); } // 显示复制成功提示 this.showCopySuccessToast(textToCopy, el); } catch (err) { console.error('Modern clipboard API failed, trying fallback...', err); // 使用备用复制方案 this.fallbackCopy(textToCopy, el); } const discountId = item.dataset["discountId"]; // 是否跳转落地页配置 const redirection = item.dataset["redirection"] === "true"; // 跳转到落地页 if (redirection && appDiscountUtils.inProductBody(this.element)) { this.win.open(`/promotions/discount-default/${discountId}`); } } }) } } /** * 使用 execCommand 的复制方案 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ fallbackCopy(codeText, el) { const textarea = this.win.document.createElement('textarea'); textarea.value = codeText; // 设置样式使文本框不可见 textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; // 添加 readonly 属性防止移动端虚拟键盘弹出 textarea.setAttribute('readonly', 'readonly'); this.win.document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { this.win.document.execCommand('copy'); // 显示复制成功提示 this.showCopySuccessToast(codeText, el); } catch (err) { console.error('Copy failed:', err); } this.win.document.body.removeChild(textarea); } /** * 创建 Toast 元素 * @returns {Element} 创建的 Toast 元素 */ createToastEl_() { const toast = document.createElement('ljs-toast'); toast.setAttribute('layout', 'nodisplay'); toast.setAttribute('hidden', ''); toast.setAttribute('id', 'discount-code-toast'); toast.style.zIndex = '1051'; return toast; } /** * 挂载 Toast 元素到 body * @returns {Element} 挂载的 Toast 元素 */ mountToastToBody_() { const existingToast = this.win.document.getElementById('discount-code-toast'); if (existingToast) { return existingToast; } const toast = this.createToastEl_(); this.win.document.body.appendChild(toast); return toast; } /** * 复制成功的提醒 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ showCopySuccessToast(codeText, el) { const $toast = this.mountToastToBody_(); SPZ.whenApiDefined($toast).then(toast => { toast.showToast("Discount code copied !"); this.codeCopyInSessionStorage(codeText); }); } /** * 复制优惠码成功后要存一份到本地存储中,购物车使用 * @param {string} codeText - 要复制的文本 */ codeCopyInSessionStorage(codeText) { try { sessionStorage.setItem('other-copied-coupon', codeText); } catch (error) { console.error(error) } } } // 注册自定义元素 SPZ.defineElement('spz-custom-discount-code-model', SpzCustomDiscountCodeModel);
${function(){ return `
Discount code cannot be displayed here. Please move it to the product detail area. (This prompt will not be displayed on the client-side)
`; }()}
/** * Custom discount code component that handles displaying and managing discount codes * @extends {SPZ.BaseElement} */ class SpzCustomDiscountCode extends SPZ.BaseElement { constructor(element) { super(element); // API endpoint for fetching discount codes this.getDiscountCodeApi = "\/api\/storefront\/promotion\/code\/list"; // Debounce timer for resize events this.timer = null; // Current variant ID this.variantId = "c5f55d23-b8cf-4419-89b5-11415646891f"; // Store discount code data this.discountCodeData = {} } /** * Check if layout is supported * @param {string} layout - Layout type * @return {boolean} */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** * Initialize component after build */ buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // Bind methods to maintain context this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } /** * Setup component when mounted */ mountCallback() { this.getData(); // Add event listeners this.viewport_.onResize(this.resize); this.win.document.addEventListener('dj.variantChange', this.switchVariant); } /** * Cleanup when component is unmounted */ unmountCallback() { this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } /** * Handle resize events with debouncing */ resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { if (appDiscountUtils.inProductBody(this.element)) { this.render(); } else { this.renderSkeleton(); } }, 200); } /** * Handle variant changes * @param {Event} event - Variant change event */ switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == '7b95db68-bd9b-413b-a063-28898041d9d8' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } /** * Fetch discount code data from API */ getData() { if (appDiscountUtils.inProductBody(this.element)) { const reqBody = { product_id: "7b95db68-bd9b-413b-a063-28898041d9d8", variant_id: this.variantId, product_type: "default", } if (!reqBody.product_id || !reqBody.variant_id) return; this.discountCodeData = {}; this.win.fetch(this.getDiscountCodeApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { let data = await response.json(); if (data.list && data.list.length > 0) { data.list[0].product_setting.template_config = JSON.parse(data.list[0].product_setting.template_config); // Format timestamps to local timezone const zone = this.win.SHOPLAZZA.shop.time_zone; data.list = data.list.map(item => { if(+item.ends_at !== -1) { item.ends_at = appDiscountUtils.convertTimestampToFormat(+item.ends_at, zone); } item.starts_at = appDiscountUtils.convertTimestampToFormat(+item.starts_at, zone); return item; }); } this.discountCodeData = data; this.render(); } else { this.clearDom(); } }).catch(err => { console.error("discount_code", err) this.clearDom(); }); } else { this.renderSkeleton(); } } /** * Clear component DOM except template */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * Render discount codes with formatted dates */ render() { // Render using discount code model SPZ.whenApiDefined(document.querySelector('#spz_custom_discount_code_model')).then(renderApi => { renderApi.doRender_({ discountCodeData: this.discountCodeData }) }).catch(err => { this.clearDom(); }) } renderSkeleton() { // Render template for non-product pages this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile() }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) .catch(err => { this.clearDom(); }); } } // Register custom element SPZ.defineElement('spz-custom-discount-code', SpzCustomDiscountCode);
${(function () { const automatic_discount_list = originData.automatic_discount_list; // 显示类型 const DISPLAY_TYPE = { DTE_FOLD: 'DTE_FOLD', // 折叠 DTE_TILE: 'DTE_TILE' // 平铺 } const DEFAULT_CONFIG = { BG: 'rgba(235, 57, 27, 0.04)', TEXT_COLOR: '#EB391B', BORDER_COLOR: 'rgb(235, 57, 27)', ADD_TO_CART_BG: 'transparent', ADD_TO_CART_TEXT_COLOR: 'rgb(235, 57, 27)', ADD_TO_CART_BORDER_COLOR: 'rgb(235, 57, 27)', }; const isExist = automatic_discount_list?.length > 0 && automatic_discount_list.some(item => item.discount[0].product_enabled); // 如果没有任何自动折扣,则隐藏,防止gap占位 if (!isExist) { return ` `; } else { return `
${(function () { return automatic_discount_list.map((item) => { // 模版类型 const template_type = item.discount[0].template_type; // 是否显示自动折扣 const is_show_automatic_discount = item.discount[0].product_enabled; // 是否跳转落地页 const is_redirection = item.discount[0].is_redirection; // 折扣图标 const discount_icon = item.discount_icon; // 第一个自动折扣 const first_automatic_discount = item.discount[0]; // 显示折叠展示 const isFold = (item.discount[0].display_type || DISPLAY_TYPE.DTE_FOLD) === DISPLAY_TYPE.DTE_FOLD; // 文本数组 const text_arr = item.discount[0].config.texts; // 条件值数组 const condition_values = item?.discount[0]?.condition_values || []; // 落地页链接 const first_landing_url = `/promotions/discount-default/${first_automatic_discount.discount_id}`; // 自动折扣总数 const automatic_discount_total = item.discount.length; // 是否显示折扣图标 const isHasDiscountIcon = discount_icon ? true : false; // 是否显示折扣图标且模版类型不为tag和add_to_cart const isHasDiscountIconWithNoTag = (template_type != 'tag' && template_type != 'add_to_cart' && isHasDiscountIcon)? true : false; // 文本颜色 let text_color = DEFAULT_CONFIG.TEXT_COLOR; // 背景颜色 const bgFn = (curBg) => template_type === "text" ? "transparent" : curBg; let bg_color = bgFn(DEFAULT_CONFIG.BG); // 边框颜色 const borderFn = (curBorder) => template_type == "tag" ? curBorder : "initial"; let border_color = borderFn(DEFAULT_CONFIG.BORDER_COLOR); // 模版配置 let template_config = first_automatic_discount.template_config; // 一键加购样式 let addToCartBtnBgColor = DEFAULT_CONFIG.ADD_TO_CART_BG; let addToCartBtnTextColor = DEFAULT_CONFIG.ADD_TO_CART_TEXT_COLOR; let addToCartBtnBorderColor = DEFAULT_CONFIG.ADD_TO_CART_BORDER_COLOR; // 兜底方案 try { if(template_config.length !== 0){ template_config = JSON.parse(template_config); text_color= isHasDiscountIconWithNoTag ? template_config.color[template_type].icon_text_color : template_config.color[template_type].text_color; bg_color = bgFn(template_config.color[template_type].background_color); const arrayRgba = bg_color.split(","); arrayRgba.splice(3, 1, " 1)"); border_color = borderFn(`${arrayRgba.join(",")}`); addToCartBtnTextColor = template_config.color[template_type].button_text_color; addToCartBtnBorderColor = template_config.color[template_type].button_border_color; addToCartBtnBgColor = template_config.color[template_type].button_background_color; } } catch (error) { console.error('template_config_error', error); template_config = { color: { [template_type]: { icon_text_color: DEFAULT_CONFIG.TEXT_COLOR, text_color: DEFAULT_CONFIG.TEXT_COLOR, background_color: DEFAULT_CONFIG.BG } } }; } // 标签 const isTag = template_type == 'tag'; // 文字和横幅 const isTextAndBanner = template_type == 'text' || template_type == 'banner'; // 是否一键加购 const isAddToCart = template_type == 'add_to_cart'; // 文字样式 const textStyle = `color: ${text_color}; background-color: transparent; border: none;`; // 标签样式 const labelStyle = `color: ${text_color};border: 1px solid ${border_color};background-color:${bg_color};padding: 4px;`; // 横幅样式 const bannerStyle = `color: ${text_color};border: none; background-color:${bg_color}`; // 一键加购单个容器样式(只包含动态样式) const addToCartSingleContainerStyle = `color: ${text_color}; background-color:${bg_color};`; // 一键加购按钮样式(只包含配置的动态样式) const addToCartBtnStyle = `color: ${addToCartBtnTextColor}; background-color:${addToCartBtnBgColor}; border:1px solid ${addToCartBtnBorderColor};`; // 外层样式在标签样式下不展示颜色配置,除开标签类型,颜色都可以在外层覆盖 let outerStyle = ''; if (template_type == 'text') { outerStyle = textStyle; } else if (template_type == 'tag') { outerStyle = "border: none;"; } else if (template_type == 'banner') { outerStyle = bannerStyle; } /** * 1. 标签一定是单独样式展示的 * 2. 折叠:横向布局,文字和横幅,合并成一行文本; 标签:单独样式处理 * 3. 平铺:纵向布局,文字、横幅和标签; 标签:单独样式处理;一键加购默认都是平铺 */ let txtHtml = ``; if (isFold) { if(isTag) { // 标签 const spanText = text_arr.map((text) => { return `
${text}
`; }).join(''); txtHtml = `
${spanText}
`; } else { // 文字和横幅 txtHtml = `
${first_automatic_discount.config.text}
`; } } else { // 文字和横幅, 但标签有自己的样式,且一键加购有单独样式 const spanText = text_arr.map((text, index) => { const condition_value = condition_values[index]; if(isAddToCart) { return `
${text}
Add to cart
` } else { return `
${text}
`; } }).join(''); // 都是纵向布局,标签有间距 txtHtml = `
${spanText}
`; } /** * 显示图标的判断 */ const discount_type = item.discount_type; const isShowRebateIcon = ["DT_REBATE_CTQ_OTP", "DT_REBATE_CTQ_OTR", "DT_REBATE_CTA_OTP", "DT_REBATE_CTA_OTR", "DT_M_N_DISCOUNT"].includes(discount_type) && isTextAndBanner const isShowBxgyIcon = ["DT_BUY_ONE_GET_ONE", "DT_BUY_X_GET_Y"].includes(discount_type) const isShowBundleIcon = ["DT_CLASSIC_BUNDLE","DT_MIX_MATCH_BUNDLE"].includes(discount_type); /** * 渲染下拉框或抽屉的折扣列表 */ const discount_list_html = (curItem) => { return `
${function() { return curItem.discount.map(childItem => { return `
${childItem.config.text}
${childItem.config.text}
`}).join(''); }()}
`; } return `
${txtHtml}
${discount_list_html(item)}
${discount_list_html(item)}
${function() { return text_arr.map((text) => { return `
${text}
`; }).join(''); }()}
`; }).join(''); })()}
` } })()}
const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = 'c5f55d23-b8cf-4419-89b5-11415646891f'; this.isRTL = SPZ.win.document.dir === 'rtl'; this.isAddingToCart_ = false; // 加购中状态 } static deferredMount() { return false; } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); this.viewport_ = this.getViewport(); } mountCallback() { this.init(); // 监听事件 this.bindEvent_(); } async init() { this.handleFitTheme(); const data = await this.getDiscountList(); this.renderApiData_(data); } async getDiscountList() { const productId = '7b95db68-bd9b-413b-a063-28898041d9d8'; const variantId = this.variant_id; const productType = 'default'; const reqBody = { product_id: productId, variant_id: variantId, discount_method: "DM_AUTOMATIC", customer: { customer_id: window.C_SETTINGS.customer.customer_id, email: window.C_SETTINGS.customer.customer_email }, product_type: productType } const url = `/api/storefront/promotion/display_setting/text/list`; const data = await this.xhr_.fetchJson(url, { method: "post", body: reqBody }).then(res => { return res; }).catch(err => { this.setContainerDisabled(false); }) return data; } async renderDiscountList() { this.setContainerDisabled(true); const data = await this.getDiscountList(); this.setContainerDisabled(false); // 重新渲染 抖动问题处理 this.renderApiData_(data); } clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } async renderApiData_(data) { const parentDiv = document.querySelector('.automatic_discount_container'); const newTplDom = await this.getRenderTemplate(data); if (parentDiv) { parentDiv.innerHTML = ''; parentDiv.appendChild(newTplDom); } else { console.log('automatic_discount_container is null'); } } doRender_(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); this.element.appendChild(el); }); } async getRenderTemplate(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, { ...renderData, isRTL: this.isRTL }) .then((el) => { this.clearDom(); return el; }); } setContainerDisabled(isDisable) { const automaticDiscountEl = document.querySelector('.automatic_discount_container_outer'); if(isDisable) { automaticDiscountEl.setAttribute('disabled', ''); } else { automaticDiscountEl.removeAttribute('disabled'); } } // 绑定事件 bindEvent_() { window.addEventListener('click', (e) => { let containerNodes = document.querySelectorAll(".automatic-container .panel"); let bool; Array.from(containerNodes).forEach((node) => { if(node.contains(e.target)){ bool = true; } }) // 是否popover面板点击范围 if (bool) { return; } if(e.target.classList.contains('drowdown-icon') || e.target.parentNode.classList.contains('drowdown-icon')){ return; } const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { node.classList.remove('open-dropdown'); }) // 兼容主题 this.toggleProductSticky(true); }) // 监听变体变化 document.addEventListener('dj.variantChange', async(event) => { // 重新渲染 const variant = event.detail.selected; if (variant.product_id == '7b95db68-bd9b-413b-a063-28898041d9d8' && variant.id != this.variant_id) { this.variant_id = variant.id; this.renderDiscountList(); } }); } // 兼容主题 handleFitTheme() { // top 属性影响抖动 let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ productInfoEl.classList.add('force-top-auto'); } } // 兼容 wind/flash /hero 主题 (sticky属性影响 popover 层级展示, 会被其他元素覆盖) toggleProductSticky(isSticky) { let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ if(isSticky) { // 还原该主题原有的sticky属性值 productInfoEl.classList.remove('force-position-static'); return; } productInfoEl.classList.toggle('force-position-static'); } } setupAction_() { this.registerAction('handleDropdown', (invocation) => { const discount_id = invocation.args.discount_id; const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { if(node.getAttribute('id') != `automatic-${discount_id}`) { node.classList.remove('open-dropdown'); } }) const $discount_item = document.querySelector(`#automatic-${discount_id}`); $discount_item && $discount_item.classList.toggle('open-dropdown'); // 兼容主题 this.toggleProductSticky(); }); // 加购事件 this.registerAction('handleAddToCart', (invocation) => { // 阻止事件冒泡 const event = invocation.event; if (event) { event.stopPropagation(); event.preventDefault(); } // 如果正在加购中,直接返回 if (this.isAddingToCart_) { return; } const quantity = invocation.args.quantity || 1; this.addToCart(quantity); }); } // 加购方法 async addToCart(quantity) { // 设置加购中状态 this.isAddingToCart_ = true; const productId = '7b95db68-bd9b-413b-a063-28898041d9d8'; const variantId = this.variant_id; const url = '/api/cart'; const reqBody = { product_id: productId, variant_id: variantId, quantity: quantity }; try { const data = await this.xhr_.fetchJson(url, { method: 'POST', body: reqBody }); // 触发加购成功提示 this.triggerAddToCartToast_(); return data; } catch (error) { error.then(err=>{ this.showToast_(err?.message || err?.errors?.[0] || 'Unknown error'); }) } finally { // 无论成功失败,都重置加购状态 this.isAddingToCart_ = false; } } showToast_(message) { const toastEl = document.querySelector("#apps-match-drawer-add_to_cart_toast"); if (toastEl) { SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast(message); }); } } // 触发加购成功提示 triggerAddToCartToast_() { // 如果主题有自己的加购提示,则不显示 const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy'); if (themeAddToCartToastEl) return; // 显示应用的加购成功提示 this.showToast_("Added successfully"); } 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, SpzCustomProductAutomatic);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() {} unmountCallback() {} setupAction_() { this.registerAction('showAddToCartToast', () => { const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy') if(themeAddToCartToastEl) return const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);
${function(){ const isRTL = originData.isRTL; const isMobile = originData.isMobile; const inProductDetail = originData.inProductDetail; if (!inProductDetail) { return `
Flash sale cannot be displayed here. Please move it to the product detail area. (This prompt will not be displayed on the client-side)
`; } const flashsaleData = originData.flashsaleData; const image_domain = originData.image_domain; const discount_info = flashsaleData.discount_info; const setting = flashsaleData.product_setting; if (!discount_info || !setting) return ``; const displayType = setting.display_type; const banner = setting.banner; const productDisplay = setting.product_display; const bannerConfig = JSON.parse(banner.config); const productDisplayConfig = JSON.parse(productDisplay.config); const colorConfig = productDisplayConfig.color; const countdownConfig = productDisplayConfig.countdown; let titleIcon = ``; let bgImg = ``; const deg = `${isRTL ? -90 : 90}deg`; const { banner_bg_start, banner_bg_end, banner_text } = colorConfig; let bgStyle = `background: linear-gradient(${deg}, ${banner_bg_start} 0%, ${banner_bg_end} 100%);`; let bannerColor = `color: ${banner_text};` if (banner.type === "TYPE_CUSTOM") { const { desktop, mobile, image_render } = bannerConfig; const bgSize = image_render === "fill" ? "background-size: cover;background-position: center;" : "background-position: center;background-size: auto 100%;"; if (isMobile && mobile) { bgStyle = `background: URL(${image_domain + mobile});${bgSize}`; } else if (!isMobile && desktop) { bgStyle = `background: URL(${image_domain + desktop});${bgSize}`; } } else { if (banner.type === "TYPE_ONE") { titleIcon = productDisplay.text ? `
` : ""; bgImg = `
` } if (banner.type === "TYPE_TWO") { titleIcon = productDisplay.text ? `
` : "" } } const { sale_bar_background_color, progress_sale_bar_background_color_start, progress_sale_bar_background_color_end } = colorConfig; const rate = discount_info.discount_sales_rate; const progressBarStyle = `background: linear-gradient(${deg}, ${progress_sale_bar_background_color_start} 0%, ${progress_sale_bar_background_color_end} 100%);`; const saleCount = productDisplay.sales_progress.format === "FORMAT_NUMBER" ? discount_info.discount_sales : `${rate}%`; const progressBarDom = productDisplay.sales_progress.enabled && rate > 0 ? `
${saleCount}
sold
` : ``; const { countdown_bg, countdown_text } = colorConfig; const { end_opened, end_format } = countdownConfig; const tempMap = { "DD_SSS": "DD:HH:mm:ss:SSS", "HH_SSS": "HH:mm:ss:SSS", "DD_ss": "DD:HH:mm:ss", "HH_ss": "HH:mm:ss" } const isShowDD = [tempMap.DD_SSS, tempMap.DD_ss].includes(end_format); const isShowSSS = [tempMap.DD_SSS, tempMap.HH_SSS].includes(end_format); const countdown = discount_info.ends_remaining_seconds; const countdownDom = end_opened ? `
${function() { if (banner.type === "TYPE_TWO") return `
` return ``; }()}
` : ``; const flashSaleDesc = discount_info.limit_user_product_discount > -1 ? `
Promo products limited to ${discount_info.limit_user_product_discount} item per person
` : ""; return `
${bgImg}
${titleIcon}
${productDisplay.text}
${progressBarDom}
${countdownDom}
${flashSaleDesc}
`}()}
${function(){ const dd = data.dd; const hh = data.hh; const mm = data.mm; const ss = data.ss; const sss = data.SSS; const hours = data.d * 24 + data.h; return `
${dd}D
·
${hours}
${hh}
:
${mm}
:
${ss}
.
${sss}
` }()}
class SpzCustomDiscountFlashsale extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.getFlashSaleApi = "\/api\/storefront\/promotion\/flashsale\/display_setting\/product_setting"; this.timer = null; this.variantId = "c5f55d23-b8cf-4419-89b5-11415646891f"; // 促销活动数据 this.flashsaleData = {} } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // 挂载bind函数 解决this指向问题 this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } mountCallback() { // 获取数据 this.getData(); this.element.onclick = (e) => { const cur = this.win.document.querySelector(".app_discount_flashsale_desc"); if (this.flashsaleData.product_setting.is_redirection && appDiscountUtils.inProductBody(this.element) && e.target !== cur) { this.win.open(`/promotions/discount-default/${this.flashsaleData.discount_info.id}`); } } // 绑定 this.viewport_.onResize(this.resize); // 监听子款式切换,重新渲染 this.win.document.addEventListener('dj.variantChange', this.switchVariant); } unmountCallback() { // 解绑 this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { this.render(); }, 200) } switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == '7b95db68-bd9b-413b-a063-28898041d9d8' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } getData() { const reqBody = { product_id: "7b95db68-bd9b-413b-a063-28898041d9d8", product_type: "default", variant_id: this.variantId } this.flashsaleData = {}; this.win.fetch(this.getFlashSaleApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { this.flashsaleData = await response.json(); this.render(); } else { this.clearDom(); } }).catch(err => { this.clearDom(); }); } clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } render() { this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), inProductDetail: appDiscountUtils.inProductBody(this.element), flashsaleData: this.flashsaleData, image_domain: this.win.SHOPLAZZA.image_domain, }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) } } SPZ.defineElement('spz-custom-discount-flashsale', SpzCustomDiscountFlashsale);
Size-
S
${function(){ const enable_selected_variants = "true" === 'false'; const optionValue = data.value; return `
${optionValue ? `${enable_selected_variants ? '-' : ''}${optionValue}` : ''}
`; }()}
S
M
L
XL
XXL
${function(){ return `
Please select a Size
`; }()}
Quantity
Support global delivery
Normally delivered in about 15 days
Pre-sale product shipments are delayed
Support customization
Add to cart
-
$27.90
${function(){ const wholesale_enabled = false; const qty = data.quantity || 1; const currentSelectVariant = data.variant; const defaultVariant = (data.product && data.product.variants && data.product.variants[0]) || Object.keys(data).length > 1 ? data : null; const productVariant = {"id":"c5f55d23-b8cf-4419-89b5-11415646891f","product_id":"7b95db68-bd9b-413b-a063-28898041d9d8","title":"S","weight_unit":"kg","inventory_quantity":1000,"sku":"\u7403\u5458\u7248 2026 \u6cd5\u56fd \u4e16\u754c\u676f\u4e3b\u573a\u7403\u8863-\u957f\u8896","barcode":"","position":1,"option1":"S","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":27.9,"min_quantity":1}],"weight":"0","compare_at_price":"55.9","price":"27.9","retail_price":"55.9","available":true,"url":"\/products\/player-version-2026-france-world-cup-home-jersey-long-sleeve?variant=c5f55d23-b8cf-4419-89b5-11415646891f","available_quantity":999999999,"options":[{"name":"Size","value":"S"}],"off_ratio":"50","flashsale_info":{"variant_id":"c5f55d23-b8cf-4419-89b5-11415646891f","product_id":"","quantity":0,"discount_id":"","limit_time":0,"limit_buy":0,"user_limit_buy":0,"discount_sales":0,"discount_sales_rate":"","discount_stock":0,"ends_at":0,"starts_at":0,"allow_oversold":"","allocation_method":"","price":"27.9","compare_at_price":"","discount_price":"27.9","customary_saved_price":"","customary_off_ratio":"","discount_saved_price":"","discount_off_ratio":"50","use_before_price":false,"before_price":"","title":"","properties":"","color_setting_promotional_copy":"","discount_quantity":0,"is_need_split":false},"sales":63}; const variantData = currentSelectVariant || defaultVariant || productVariant; const wholesale_price = variantData.wholesale_price || []; if(wholesale_enabled && wholesale_price.length > 0) { let wholesaleIndex = wholesale_price.findIndex(item => { return item.min_quantity > qty; }); if(wholesaleIndex < 0){ wholesaleIndex = wholesale_price.length - 1; }else if(wholesaleIndex > 0){ wholesaleIndex = wholesaleIndex - 1; } const wholesalePrice = wholesale_price[wholesaleIndex] || ''; return `
` }else { const price = variantData && variantData.price; return price != undefined ? `
` : '
'; } }()}
Buy it now
Product was out of stock.
Product is unavailable.
people are viewing this right now
Shipping
Estimated Delivery:
May-20
-
May-25
Share
Tweet
Pin it
Kind tips: It is recommended to turn the clothes inside out when washing/avoid violent rubbing/avoid soaking in water for a long time
You may also like
Recently viewed
${function(){ const settings_product_title = "title"; const product_grid_image_size = "100%"; const settings_product_image_hover_on = true; let settings_product_save_label = false; const product_sold_out_label = true; const settings_product_swatches_name = ["color","size"]; const settings_collection_color_swatches = true; const product_price_currency = `
` const from_on = data.price_max != data.price_min ? '
from
{{ price }}
'.replace(/\{\{\s*price\s*\}\}/, product_price_currency) : product_price_currency; const variantShowLimit = 2; const private_id = 'product-tmpl-' + Math.random().toFixed(6).slice(-6) const product_variants = data.variants || []; const product_id = data.id; const images = data.images || []; const image = data.image || {}; const imageWidth = image.width; let imageHeight = image.height; if (product_grid_image_size !== 'natural') { imageHeight = (imageWidth * parseFloat(product_grid_image_size)) / 100; } const price = Number(data.price_min); let compareAtPrice = Number(data.compare_at_price); let offRatio = data.off_ratio; const type = data.type; const isMock = data.isMock; let product_image_hover_on = false; for (let i = 0; i < product_variants.length; i++) { const item = product_variants[i]; const vcap = Number(item.compare_at_price); if (item.price == price && vcap > compareAtPrice) { compareAtPrice = vcap; offRatio = item.off_ratio; } } let second_image = null; if (settings_product_image_hover_on) { for (let i = 1; i < images.length; i++) { const img = images[i]; if (img.src && img.src.indexOf('video=') === -1) { second_image = img; product_image_hover_on = true; break; } } } let sold_label_on = false; let sale_label_on = false; if (settings_product_save_label == null) { settings_product_save_label = true; } if (!data.available && product_sold_out_label) { sold_label_on = true; } if (settings_product_save_label && compareAtPrice > price && data.available) { sale_label_on = true; } const diffPrice = compareAtPrice - price; const variantValues = []; const showVariants = []; if (data.need_variant_image && settings_collection_color_swatches && settings_product_swatches_name.length > 0) { for (let i = 0; i < (data.options || []).length; i++) { const option = data.originData.options[i]; const optionName = option.name && option.name.toLowerCase(); if (settings_product_swatches_name.includes(optionName)) { for (let j = 0; j < product_variants.length; j++) { const variant = product_variants[j]; const value = variant.options[i].value; if (!variantValues.includes(value)) { variantValues.push(value); showVariants.push(variant); } } break; } } } return `
${function(){ if(showVariants.length == 0){ return `
` } return `
${ showVariants.map(item=>{ return `
`; }).join('') }
` }() }
SOLD OUT
SALE
${ showVariants.slice(0,variantShowLimit).map((item,index)=>{ return `
`; }).join('') }
+${showVariants.length - variantShowLimit}
${(settings_product_title === 'sub_title' && data.brief) ? data.brief : data.title}
${from_on}
-
-
${data.available ? ` ` : ''}
`; }()}
Cart
Your cart is reserved for
${data.mm}
m
${data.ss}
s
!
${data.line_items.map(item => { const renderDiscountApp = () => { const isEmpty = item.discount_applications && item.discount_applications.length < 1; const isNotExist = !item.discount_applications; if (isEmpty || isNotExist) { return "" } return `
${ (item.discount_applications || []).map(discount_item => { const discount_item_amount = discount_item.discount_amount || discount_item.amount || ''; return `
${discount_item.title}
(-
)
` }).join('') }
` } return `
${item.product_title}
${item.options.map(o => `
${o.name}:
${o.value}
`).join('')} ${(item.parsedProperties || []).map((propertie)=>{ if (propertie.isImage){ return `
${propertie.name}:
View image
` }else{ return `
${propertie.name}:
${propertie.value}
` } }).join('')}
Free gift
*${item.quantity}
${renderDiscountApp()}
`; }).join('')}
Goes great with
cart
cart
Your cart is currently empty.
Continue shopping
${function() { const freeAmount = 60; const totalPrice = (data && data.total_price) || (data && data.cart && data.cart.total_price) || 0; const amountDiff = freeAmount - totalPrice; const percentDiff = (amountDiff > 0 ? (totalPrice / freeAmount * 100).toFixed(2) : 100) + '%'; const spendTip = "Buy {amount} more to enjoy FREE Shipping"; let tipText = "Your order is free delivery"; if (amountDiff > 0 && spendTip) { tipText = spendTip.replace('{amount}', `
`); } return `
${tipText}
${percentDiff}
`; }()}
${function() { return `
Add order note
Add order note
`; }()}
Total:
${data.total_discount > 0 ? ( `
Save
${data.discount_applications.length > 0 && data.discount_applications.map(item => { return `
${item.title}:
` }).join('')}
Save
` ) : ''}
Check out
Taxes and shipping calculated at checkout
${function() { const freeAmount = 60; const totalPrice = (data && data.total_price) || (data && data.cart && data.cart.total_price) || 0; const amountDiff = freeAmount - totalPrice; const percentDiff = (amountDiff > 0 ? (totalPrice / freeAmount * 100).toFixed(2) : 100) + '%'; const spendTip = "Buy {amount} more to enjoy FREE Shipping"; let tipText = "Your order is free delivery"; if (amountDiff > 0 && spendTip) { tipText = spendTip.replace('{amount}', `
`); } return `
${tipText}
${percentDiff}
`; }()}
Total:
${data.total_discount > 0 ? ( `
Save
${data.discount_applications.length > 0 && data.discount_applications.map(item => { return `
${item.title}:
` }).join('')}
Save
` ) : ''}
Check out
Taxes and shipping calculated at checkout
${data.discount_applications.length > 0 && `
Subtotal:
` || ''} ${data.discount_applications.length > 0 && data.discount_applications.map(item => { return `
${item.title}:
` }).join('') || ''}
Total:
Check out
Taxes and shipping calculated at checkout