View all
  • DUTY-FREE FOR ALL ITEMS

    DUTY-FREE FOR ALL ITEMS

    Shop now

DUTY-FREE FOR ALL ITEMS

DUTY-FREE FOR ALL ITEMS

function getTotalHeightIncludingMargin(element) { if (!element) return 0; const style = window.getComputedStyle(element); const marginTop = parseFloat(style.marginTop); const marginBottom = parseFloat(style.marginBottom); return element.offsetHeight + marginTop + marginBottom; } function updateAnnouncementContainerHeight() { const socialLinksHeight = getTotalHeightIncludingMargin(socialLinks); const announcementHeight = getTotalHeightIncludingMargin(announcement); const height = Math.max(socialLinksHeight, announcementHeight); announcementContainer.style.height = height + 'px'; } function resetAnnouncementContainerHeight() { announcementContainer.style.height = 'auto'; } const socialLinks = document.getElementById('socialLinks'); const announcement = document.querySelector('.pc-announcement'); const announcementContainer = document.querySelector('.announcement-container'); const resizeObserver = new ResizeObserver(() => { if (window.matchMedia("(min-width: 960px)").matches) { updateAnnouncementContainerHeight(); }else { resetAnnouncementContainerHeight(); } }); if (socialLinks) { resizeObserver.observe(socialLinks); } if (announcement) { resizeObserver.observe(announcement); }
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); Search

Flycurvy

function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl); Search function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl); Search
Account
Log in Create an account
Cart
Your cart is reserved for !
Your cart is currently empty.
Close
  • NEW & NOW
  • DRESSES Hot
    DRESSES Hot
    • Shop by Occasion
      Shop by Occasion
      • Wedding Guest Dresses
      • Mother of the Bride Dresses
      • Formal Dresses
      • Vacation Dresses
      • Everyday Dresses
      • Casual Dresses
      • Bridesmaid Dresses
    • Shop by Style
      Shop by Style
      • Floral Dresses
      • Wrap Dresses
      • Chiffon Dresses
      • Lace Dresses
      • Satin Dresses
      • Sparkly Dresses
      • Dresses with Jacket
      • Long Sleeve Dresses
    • Shop by Color
      Shop by Color
      • Green
      • Black
      • White
      • Blue
      • Purple
      • Pink
      • Red
  • SS2025🌿
    SS2025🌿
    • Summer Dresses🏖️
    • Floral Dresses🌸
    • Chiffon Dresses👗
  • MOM
    MOM
    • Mother of the Bride Dresses
    • Mother of the Bride Pant Suits
  • TOPS & BOTTOMS
    TOPS & BOTTOMS
    • Tops Hot
      Tops Hot
      • Blouses & Shirts
      • Tank Tops & Camis
    • Bottoms
  • 24-HOUR SHIPPING🚀
  • CLOTHING
    CLOTHING
    • Tops Hot
      Tops Hot
      • Blouses & Shirts
      • Tank Tops
    • Dresses Hot
      Dresses Hot
      • Midi Dresses
      • Maxi Dresses
    • Pant Suits & Jumpsuits
    • Bottoms
    • Linen
    • Swimwear
      Swimwear
      • Swimdress
      • Cover Ups
  • SALE🏷️
    SALE🏷️
    • 🎉$9.9 Everything
    • BOGO
    • 60% OFF
    • 70% OFF
    • Under $40
  • SHOES & ACCS
    SHOES & ACCS
    • Shoes
    • Accessories
  • ABOUT FLYCURVY
    ABOUT FLYCURVY
    • Blog
      Blog
      • Summer Collections
      • 💍Mother of the Bride Blog
      • 👚Tops Blog
      • Summer Collection
      • 🎄Christmas Blog
      • Colorblock Blog
      • 🎃Halloween Blog
      • Event
    • Customer Reviews
    • Influencer Program
    • Flycurvy Affiliate Program
  • Log in Create an account
  • NEW & NOW
  • DRESSES Hot
    Shop by Occasion
    • Wedding Guest Dresses
    • Mother of the Bride Dresses
    • Formal Dresses
    • Vacation Dresses
    • Everyday Dresses
    • Casual Dresses
    • Bridesmaid Dresses
    Shop by Style
    • Floral Dresses
    • Wrap Dresses
    • Chiffon Dresses
    • Lace Dresses
    • Satin Dresses
    • Sparkly Dresses
    • Dresses with Jacket
    • Long Sleeve Dresses
    Shop by Color
    • Green
    • Black
    • White
    • Blue
    • Purple
    • Pink
    • Red
    Flycurvy Plus Size Mother Of The Bride Dark Green Chiffon Wrap Lantern Sleeve Split Maxi Dress
    $69.99
  • SS2025🌿
    • Summer Dresses🏖️
    • Floral Dresses🌸
    • Chiffon Dresses👗
    Flycurvy Plus Size Mother Of The Bride Dark Green Chiffon Wrap Lantern Sleeve Split Maxi Dress
    $69.99
  • MOM
    • Mother of the Bride Dresses
    • Mother of the Bride Pant Suits
    Flycurvy Plus Size Mother Of The Bride Navy Blue Chiffon Wrap Puff Sleeve Maxi Dress
    $66.99
  • TOPS & BOTTOMS
    Tops Hot
    • Blouses & Shirts
    • Tank Tops & Camis
    Bottoms
    +2
    Plus Size Everyday Pink Cotton And Linen Solid Batwing Sleeve Blouse
    $19.99
  • 24-HOUR SHIPPING🚀
  • CLOTHING
    Tops Hot
    • Blouses & Shirts
    • Tank Tops
    Dresses Hot
    • Midi Dresses
    • Maxi Dresses
    Pant Suits & Jumpsuits
    Bottoms
    Linen
    Swimwear
    • Swimdress
    • Cover Ups
    Flycurvy Plus Size Mother Of The Bride Dark Green Chiffon Wrap Lantern Sleeve Split Maxi Dress
    $69.99
  • SALE🏷️
    • 🎉$9.9 Everything
    • BOGO
    • 60% OFF
    • 70% OFF
    • Under $40
    Lucky Bag-3 Random Dresses Or Jumpsuits Or Pants Or Swimwears
    $19.99
  • SHOES & ACCS
    • Shoes
    • Accessories
    Elegant Burgundy Retro Rhinestone Flower Hair Clip
    $6.99
    $15.99
    - 56%
    - 56%
  • ABOUT FLYCURVY
    Blog
    • Summer Collections
    • 💍Mother of the Bride Blog
    • 👚Tops Blog
    • Summer Collection
    • 🎄Christmas Blog
    • Colorblock Blog
    • 🎃Halloween Blog
    • Event
    Customer Reviews
    Influencer Program
    Flycurvy Affiliate Program
  • More links
    function setSearchUrl(searchValue) { return Promise.resolve({ url: '/search?q=' + searchValue }); } exportFunction('setSearchUrl', setSearchUrl);
    Top search terms
    Dresses Purple Mother of the Bride Green Pink
    Top searched
    Flycurvy Plus Size Mother Of The Bride Navy Blue Chiffon Wrap Puff Sleeve Maxi Dress
    $66.99
    Login
    Please enter your e-mail and password:
    Email is required
    Please enter a valid email.
    Password is required.
    Password must be between 6-16 characters long.
    Forgot password?
    Don't have an account? Create one
    Login for more discounts
    Subscribe to hear first about our sales and new trends || Code: FCP5
    Please fill in this field
    Please enter a valid email address
    Thanks for subscribing
    Flycurvy Info
    • About Us
    • Contact Us
    • Terms & Conditions
    • Privacy Policy
    • Influencer Program
    • Affiliate Program
    • Bulk Purchaser Policy
    • Copyright Notice
    • Intellectual Property Rights
    Help
    • Shipping Info
    • Return Policy
    • Payment Method
    • Size Guide
    • Track Order
    • Tarriff FAQ
    • FAQs
    Get in touch
    support@flycurvy.com
    Follow us
    We accept
    Visa Mastercard Maestro American Express Diners Club Discover PayPal
    Flycurvy Info
    • About Us
    • Contact Us
    • Terms & Conditions
    • Privacy Policy
    • Influencer Program
    • Affiliate Program
    • Bulk Purchaser Policy
    • Copyright Notice
    • Intellectual Property Rights
    Help
    • Shipping Info
    • Return Policy
    • Payment Method
    • Size Guide
    • Track Order
    • Tarriff FAQ
    • FAQs
    Get in touch
    support@flycurvy.com
    Follow us
    We accept
    Visa Mastercard Maestro American Express Diners Club Discover PayPal
    © 2025 Flycurvy
    const TAG = "spz-custom-announcement"; const DISPLAY_TYPE = { ANNOUNCEMENT: "PTT_BANNER" // 公告栏 }; const API = { LIST: `/api/storefront/promotion/placement/list`, // 获取公告栏列表 REPORT: `/api/storefront/promotion/placement/data/report` // 上报数据 }; const DISPLAY_DEVICE = { PC_AND_MOBILE: "PD_PC_MOBILE", // PC和移动端 PC: "PD_PC", // PC MOBILE: "PD_MOBILE" // 移动端 }; const REPORT_EVENT = { CLICK: "PE_CLICK", // 点击事件 IMPRESSION: "PE_IMPRESSION" // 曝光事件 }; const POSITION = { TOP: "PP_TOP", // 顶部 BOTTOM: "PP_BOTTOM" // 底部 } const MODE = { FIXED: "PM_FIXED", // 固定 NORMAL: "PM_SCROLLING" // 滚动 } const THEME_NAME = window.SHOPLAZZA.theme.merchant_theme_name; class SpzCustomAnnouncement extends SPZ.BaseElement { constructor(element) { super(element); this.announcementList_ = []; // 公告栏数据 } 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.fetchData_(); this.createAnnouncementDom_(); this.listenCartChange_(); } fetchData_(type = '') { const id = window.SHOPLAZZA.meta.page.template_type === 51 ? window.SHOPLAZZA.meta.page.resource_id : 0; return this.xhr_.fetchJson(API.LIST, { method: 'POST', body: { page_id: window.SHOPLAZZA.meta.page.template_type, placement_type: DISPLAY_TYPE.ANNOUNCEMENT, discount_id: id } }).then((res) => { this.announcementList_ = res.list || []; if (this.announcementList_.length > 0) { this.announcementList_.forEach((item) => { item.config = JSON.parse(item.config); }); } if(type === 'cartChange') { this.announcementList_.forEach((item) => { this.updateText_(item); }); } else { this.doRender_(this.announcementList_); } }).catch((error) => { console.error(error); }) } doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, { list: this.announcementList_ }) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) .then(() => { this.announcementList_.forEach((item) => { this.showAnnouncement_(item); }); }).then(() => { this.handleThemeCompatibility_(); }); } // 更新文案 updateText_(item) { const announcement = document.querySelector(`#announcement-${item.id}`); const announcementText = announcement.querySelectorAll('.announcement_text'); const textArr = item.config.text_discount.replace_texts; const textDom = textArr.map((text) => { return `${text}`; }).join(','); announcementText.forEach((text) => { text.innerHTML = textDom; }); } // 创建公告栏dom createAnnouncementDom_() { const isHero = /Hero/.test(THEME_NAME); const isEva = /Eva/.test(THEME_NAME); const headerEl = document.querySelector('[data-section-type="header"]'); const headerSticky = headerEl && SPZCore.Dom.computedStyle(this.win, headerEl).position === 'sticky'; // 创建滚动的底部公告栏 const announcementBottomContainer = document.createElement('div'); announcementBottomContainer.className = 'announcement__container_bottom bootstrap'; document.body.appendChild(announcementBottomContainer); // 创建固定的底部公告栏 const announcementBottomSticky = document.createElement('ljs-sticky'); announcementBottomSticky.className = 'announcement__container_bottom-sticky'; announcementBottomSticky.setAttribute('layout', 'container'); announcementBottomSticky.setAttribute('position', 'bottom'); announcementBottomSticky.style.position = 'fixed'; announcementBottomSticky.style.bottom = '0'; announcementBottomSticky.style.left = '0'; announcementBottomSticky.style.right = '0'; announcementBottomSticky.style.zIndex = '1030'; document.body.appendChild(announcementBottomSticky); const announcementTopContainer = document.createElement('div'); announcementTopContainer.classList.add('announcement__container_top'); if (isHero) { announcementTopContainer.classList.add('announcement__container_top_zIndex_1030'); } announcementTopContainer.classList.add('bootstrap'); document.body.insertBefore(announcementTopContainer, document.body.children[0]); const announcementTopFixedContainer = document.createElement('div'); announcementTopFixedContainer.classList.add('announcement__container_top-fixed'); if (isHero) { announcementTopFixedContainer.classList.add('announcement__container_top_zIndex_1030'); } announcementTopFixedContainer.classList.add('bootstrap'); const insertBeforeElement = headerSticky ? headerEl : document.body; insertBeforeElement.insertBefore(announcementTopFixedContainer, insertBeforeElement.children[0]); if (isEva) { const evaHeader = document.querySelector('header.header'); const isEvaMaskHeader = evaHeader && SPZCore.Dom.computedStyle(this.win, evaHeader).position === 'absolute'; let fixedBannerTopContainer = document.querySelector('.announcement__container_top-fixed'); if (isEvaMaskHeader) { if (fixedBannerTopContainer) { fixedBannerTopContainer.remove(); } const newBanner = document.createElement('div'); newBanner.className = 'announcement__container_top-fixed bootstrap'; document.body.insertBefore(newBanner, document.body.firstChild); fixedBannerTopContainer = newBanner; } else { if (!headerEl) return; const observer = new MutationObserver(() => { const isSticky = SPZCore.Dom.computedStyle(this.win, headerEl).position === 'sticky'; if (!isSticky) return; const isTopFixedAnnouncementInHeader = headerEl.querySelector('.announcement__container_top-fixed'); if (isTopFixedAnnouncementInHeader) return; const announcementTopFixedContainer = document.querySelector('.announcement__container_top-fixed'); if (announcementTopFixedContainer) { announcementTopFixedContainer.remove(); headerEl.insertBefore(announcementTopFixedContainer, headerEl.children[0]); observer.disconnect(); } }); observer.observe(headerEl, { attributes: true, attributeFilter: ['style', 'class'] }); } if (headerSticky && !isEvaMaskHeader && fixedBannerTopContainer) { fixedBannerTopContainer.style.position = 'relative'; fixedBannerTopContainer.style.zIndex = '29'; } } } // 展示公告栏 showAnnouncement_(item) { const announcement = document.querySelector(`#announcement-${item.id}`); const announcementBottomContainer = document.querySelector('.announcement__container_bottom'); const announcementBottomSticky = document.querySelector('.announcement__container_bottom-sticky'); const announcementTopContainer = document.querySelector('.announcement__container_top'); const announcementTopFixedContainer = document.querySelector('.announcement__container_top-fixed'); const isPC = this.viewport_.getWidth() >= 960; const isMobile = this.viewport_.getWidth() < 960; const isMatchPCDevice = item.device === DISPLAY_DEVICE.PC_AND_MOBILE || item.device === DISPLAY_DEVICE.PC; const isMatchMobileDevice = item.device == DISPLAY_DEVICE.PC_AND_MOBILE || item.device === DISPLAY_DEVICE.MOBILE; if((isPC && isMatchPCDevice) || (isMobile && isMatchMobileDevice)) { if (item.position === POSITION.BOTTOM) { if(item.mode === MODE.FIXED) { announcementBottomSticky && announcementBottomSticky.appendChild(announcement); } else { announcementBottomContainer && announcementBottomContainer.appendChild(announcement); } } else { if (item.mode === MODE.FIXED) { announcementTopFixedContainer && announcementTopFixedContainer.appendChild(announcement); } else { announcementTopContainer && announcementTopContainer.appendChild(announcement); } } this.reportData({ placement_id: item.id, event: REPORT_EVENT.IMPRESSION }); } } // 处理主题兼容 handleThemeCompatibility_() { try { const isBoost = /Boost/.test(THEME_NAME); const isHyde = /Hyde/.test(THEME_NAME); const isEva = /Eva/.test(THEME_NAME); const boostHeader = document.querySelector('.boost-header'); const fixedBannerTopContainer = document.querySelector('.announcement__container_top-fixed'); const notFixedBannerTopContainer = document.querySelector('.announcement__container_top'); const headerEl = document.querySelector('[data-section-type="header"]'); const headerSticky = headerEl && SPZCore.Dom.computedStyle(this.win, headerEl).position === 'sticky'; const header = document.querySelector('.header__fixed') || document.querySelector('.header__wrapper'); const headerFixed = header && SPZCore.Dom.computedStyle(this.win, header).position === 'fixed'; const handleScroll = SPZCore.Types.throttle(this.win, () => { if (isHyde) { if (header && headerSticky) { header.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } } if (isEva) { const evaHeader = document.querySelector('header.header'); const isEvaMaskHeader = evaHeader && SPZCore.Dom.computedStyle(this.win, evaHeader).position === 'absolute'; if (!isEvaMaskHeader) return; if (evaHeader.classList.contains('header__fixed')) { evaHeader.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } if(document.documentElement.scrollTop === 0) { evaHeader.style.marginTop = '0'; } } if (headerSticky) return; if (headerFixed) { header.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { const observer = new MutationObserver((mutationsList, observer) => { for (const mutation of mutationsList) { if (mutation.type === 'childList' && fixedBannerTopContainer.childElementCount > 0) { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; observer.disconnect(); // 停止观察 break; } } }); // 开始观察 fixedBannerTopContainer 的子节点变化 observer.observe(fixedBannerTopContainer, { childList: true, subtree: true }); // 初始检查 if (fixedBannerTopContainer.childElementCount > 0) { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } if(header) { header.style.marginTop = '0'; } } if (isBoost) { fixedBannerTopContainer.style.zIndex = '1031'; if (boostHeader && boostHeader.classList.contains('header__fixed')) { boostHeader.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } } }, 16); window.addEventListener('scroll', handleScroll); window.dispatchEvent(new Event('scroll')); } catch (error) { console.error('error', error); } } // 上报数据 async reportData(data) { // 如果是主题编辑器则不用处理 if(window.top !== window.self) { return; } this.xhr_.fetchJson(API.REPORT, { method: "POST", body: { placement_id: data.placement_id, event: data.event } }); } // 监听购物车变化事件dj.cartChange listenCartChange_() { SPZUtils.Event.listen(document, 'dj.cartChange', (event) => { this.fetchData_('cartChange'); }); } setupAction_() { this.registerAction('handleClose', (invocation) => { const data = invocation.args; const id = data.id; const announcement = document.querySelector(`#announcement-${id}`); announcement && SPZCore.Dom.removeElement(announcement); window.dispatchEvent(new Event('scroll')); }); this.registerAction('handleJumpLink', (invocation) => { const data = invocation.args; if(!data.show_url) return; data.url && window.open(data.url, data.open_new_window ? '_blank' : '_self'); this.reportData({ placement_id: data.id, event: REPORT_EVENT.CLICK }); }); } 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, SpzCustomAnnouncement);