Vintage Washed Denim Jumpsuit | 70s Hippie Boho Style
โจ Relaxed Fit • Soft Cotton Denim • Multiple Pockets • Effortless Boho Chic
${function() {
const variantData = data.variant || {"id":"9241d530-96e7-4e56-a9be-6a4d94ab2d41","product_id":"eddddb11-1b71-4042-a0f3-9dc1173e5308","title":"Light Blue-S","weight_unit":"kg","inventory_quantity":999,"sku":"161H-260108-55-WB0229NPV1-LightBlue-S","barcode":"","position":1,"option1":"Light Blue","option2":"S","option3":"","note":"","image":{"src":"\/\/img.staticdj.com\/caef01d92575db674fae1c0366f19cd5.jpg","path":"caef01d92575db674fae1c0366f19cd5.jpg","width":720,"height":960,"alt":"","aspect_ratio":0.75},"wholesale_price":[{"price":54.99,"min_quantity":1}],"weight":"0","compare_at_price":"0","price":"54.99","retail_price":"0","available":true,"url":"\/products\/vintage-washed-denim-jumpsuit-70s-hippie-boho-style?variant=9241d530-96e7-4e56-a9be-6a4d94ab2d41","available_quantity":999999999,"options":[{"name":"color","value":"Light Blue"},{"name":"size","value":"S"}],"off_ratio":"0","flashsale_info":{"variant_id":"9241d530-96e7-4e56-a9be-6a4d94ab2d41","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":"54.99","compare_at_price":"","discount_price":"54.99","customary_saved_price":"","customary_off_ratio":"","discount_saved_price":"","discount_off_ratio":"0","use_before_price":false,"before_price":"","title":"","properties":"","color_setting_promotional_copy":"","discount_quantity":0,"is_need_split":false},"sales":631};
const saveType = "amount";
const productLabelDiscountOn = true;
return `
-
${saveType == 'percentage'
? `-${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}` : ""}
`
}
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 = `
`
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 = "9241d530-96e7-4e56-a9be-6a4d94ab2d41";
// 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 == 'eddddb11-1b71-4042-a0f3-9dc1173e5308' && 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: "eddddb11-1b71-4042-a0f3-9dc1173e5308",
variant_id: this.variantId,
product_type: "",
}
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 `
`}).join('');
}()}
`;
}
return `
${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 = '9241d530-96e7-4e56-a9be-6a4d94ab2d41';
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 = 'eddddb11-1b71-4042-a0f3-9dc1173e5308';
const variantId = this.variant_id;
const productType = '';
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 == 'eddddb11-1b71-4042-a0f3-9dc1173e5308' && 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 = 'eddddb11-1b71-4042-a0f3-9dc1173e5308';
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 ? `
` : ``;
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 = "9241d530-96e7-4e56-a9be-6a4d94ab2d41";
// ไฟ้ๆดปๅจๆฐๆฎ
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 == 'eddddb11-1b71-4042-a0f3-9dc1173e5308' && variant.id != this.variantId) {
this.variantId = variant.id;
this.getData();
}
}
getData() {
const reqBody = {
product_id: "eddddb11-1b71-4042-a0f3-9dc1173e5308",
product_type: "",
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);
Color:
Light Blue
${function(){
const optName = "color";
const optionValue = data.originData.selectData ? data.originData.selectData[optName].value : data.originData.value;
const optionValueText = optionValue ? (optionValue) : '';
return `${optionValueText} `;
}()}
${function(){
const tipText = "Please select a {{ name }}".replace(/\{\{\s+name\s+\}\}/g, data);
return `${tipText}
`
}()}
Size:
S
${function(){
const optName = "size";
const optionValue = data.originData.selectData ? data.originData.selectData[optName].value : data.originData.value;
const optionValueText = optionValue ? (optionValue) : '';
return `${optionValueText} `;
}()}
${function(){
const tipText = "Please select a {{ name }}".replace(/\{\{\s+name\s+\}\}/g, data);
return `${tipText}
`
}()}
Add to cart
$54.99
${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]);
const productVariant = {"id":"9241d530-96e7-4e56-a9be-6a4d94ab2d41","product_id":"eddddb11-1b71-4042-a0f3-9dc1173e5308","title":"Light Blue-S","weight_unit":"kg","inventory_quantity":999,"sku":"161H-260108-55-WB0229NPV1-LightBlue-S","barcode":"","position":1,"option1":"Light Blue","option2":"S","option3":"","note":"","image":{"src":"\/\/img.staticdj.com\/caef01d92575db674fae1c0366f19cd5.jpg","path":"caef01d92575db674fae1c0366f19cd5.jpg","width":720,"height":960,"alt":"","aspect_ratio":0.75},"wholesale_price":[{"price":54.99,"min_quantity":1}],"weight":"0","compare_at_price":"0","price":"54.99","retail_price":"0","available":true,"url":"\/products\/vintage-washed-denim-jumpsuit-70s-hippie-boho-style?variant=9241d530-96e7-4e56-a9be-6a4d94ab2d41","available_quantity":999999999,"options":[{"name":"color","value":"Light Blue"},{"name":"size","value":"S"}],"off_ratio":"0","flashsale_info":{"variant_id":"9241d530-96e7-4e56-a9be-6a4d94ab2d41","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":"54.99","compare_at_price":"","discount_price":"54.99","customary_saved_price":"","customary_off_ratio":"","discount_saved_price":"","discount_off_ratio":"0","use_before_price":false,"before_price":"","title":"","properties":"","color_setting_promotional_copy":"","discount_quantity":0,"is_need_split":false},"sales":631};
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 now
Product was out of stock.
Product is unavailable.
๐ Why You’ll Love It
๐ผ Vintage Washed Denim – Retro 70s hippie vibe with soft, lived-in wash for timeless boho style
๐งต Premium Cotton Denim – Ultra-soft, breathable, and durable for all-day comfort & year-round wear
๐ Relaxed Wide-Leg Fit – Flattering, roomy silhouette that skims curves, perfect for all body types
๐๏ธ Roomy Front Pockets – Functional, stylish pockets for your essentials, boho-chic & practical
๐ Button-Front Closure – Easy on/off, adjustable fit with classic denim detailing
๐ Sleeveless Tank Design – Breezy, sun-friendly, easy to layer for any season & occasion
๐ฟ Product Description
Channel your free spirit in this vintage-inspired boho denim jumpsuit.
Featuring a soft washed cotton denim, relaxed wide-leg fit, and roomy front pockets, it blends retro 70s hippie charm with everyday comfort.
Made for festival days, summer adventures, or casual outings – let your wild side shine in this one-of-a-kind wardrobe staple.
๐ Styling Guide
๐ธ Festival Ready | Layered crop top + fringe vest + platform boots
๐ด Beach Vacation | Straw hat + woven sandals + layered boho necklaces
โ Weekend Casual | Oversized flannel + white sneakers + crossbody bag
๐ Summer Outing | Cropped tank + strappy sandals + statement sunglasses
๐งถProduct Details
๐งต Material : Soft, breathable washed cotton denim
๐ Neckline : Sleeveless scoop tank neck
๐ Fit : Relaxed wide-leg jumpsuit fit, side pockets for functionality
๐ Closure : Button-front placket for adjustable fit
โ๏ธ Season : Spring / Summer / Early Fall
๐ Occasion : Daily wear, festivals, vacation, beach, farmers markets, casual outings
๐งบ Care Instructions
Hand wash cold, do not bleach
Hang or lay flat to dry
Iron on low heat if needed
Wash separately to avoid color transfer
๐ Who It’s For
Boho, hippie & vintage denim fashion lovers
Women seeking comfortable, flattering everyday jumpsuits
Free spirits who love travel, festivals & outdoor adventures
Anyone who wants effortless, timeless boho style for any occasion
Product ID:WB0229NPV1
Weight: 0.5kg
Package: 1 xJumpsuit
Size Guide For Women
Size
UK
US
EUR
Length
Chest
Waist
Hip
S
8~10
4~6
34~36
124
98
98
104
M
12~14
8~10
38~40
125
104
104
110
L
16
12
42~44
126
110
110
116
XL
18
14
46
126
116
116
122
2XL
20
16~18
48
126
126
126
132
3XL
26
20~22
50~52
126
136
136
142
International Shipping
Processing Time: 3–5 business days
Shipping Method
Shipping Time
Shipping Fee
Standard Shipping
10–15 business days
$9.99 (FREE on orders over $89)
Priority Shipping
7–10 business days
$19.99
๐ Enjoy free returns and exchanges within 30 days of delivery.