Skip to content
Search
Cart

Our first official month is here — and it's open to the whole community.

This is a big one for us — September marks the very first official Bloomin' Book Club month, now open to everyone in the community, and we're kicking things off with The Correspondent by Virginia Evans.

If you've already placed your order, your book and a beautiful bunch of fresh flowers will be delivered on your chosen date. Still want to join in? There's time — orders close on 5 September, and every Bloomin' Book Club order comes with a copy of the book plus a gorgeous, locally grown bunch, delivered straight to your door.

Once you've got stuck in, come chat with us. We're discussing all things Bloomin' Book Club over on our Fable group and Instagram channel, and we'd love to hear what you think as you read.

We can't wait to share this one with you.

Explore and Join Bloomin' Book Club


Shop Our Best Selling Collections

`; document.querySelector('body').insertAdjacentHTML('beforeend', snackBarHtml); window.addEventListener('message', toasterEventListener, false); function toasterEventListener(event) { if (!isAppstleLoyaltyMessage(event)) return; if (typeof event.data === 'string' && event.data.startsWith('appstle_message_for_notification|')) { var message = event?.data?.split('|')[1]; showAppstleLoyaltyToaster(message); } } let snackBarIndex = 0; async function showAppstleLoyaltyToaster(msg) { const purifier = await window.appstleLoyaltyLoadSanitizer(); var snackBar = document.getElementById('snackbar'); snackBar.classList.add('show'); snackBar.insertAdjacentHTML('beforeend', `
`); const description = document.getElementById(`elem${snackBarIndex}`).querySelector('.description'); if (purifier) description.innerHTML = purifier.sanitize(String(msg), { ALLOWED_TAGS: ['a', 'b', 'br', 'em', 'i', 'span', 'strong'], ALLOWED_ATTR: ['href', 'title', 'class'], }); else description.textContent = String(msg); const el = snackBarIndex; setTimeout(function() { if (document.getElementById(`elem${el}`)) document.getElementById(`elem${el}`).remove(); }, 5000); snackBarIndex++; } const closeSnackBar = (el) => document.getElementById(el).remove(); document.addEventListener('DOMContentLoaded', () => { }); const executeLoyaltyWidget = () => { window.appstleLoyaltyLauncher?.mount({ escapeAttribute: escapeLoyaltyAttribute, navigationUrl: loyaltyNavigationUrl, sanitizeTitle: title => window.appstleLoyaltyLoadSanitizer().then(p => (p ? sanitizeLoyaltyLabel(title, p, false) : null)), preparePopupWindow: win => { win.__st = window.__st; win.Shopify = { shop: location.host }; win.appstle_public_domain = location.host; } }); } const launcherScript = new Promise(resolve => { const script = document.createElement('script'); script.src = "https:\/\/cdn.shopify.com\/extensions\/01a1839d-8f78-7058-8c23-100012412a28\/appstle-loyalty-1513\/assets\/appstle-loyalty-launcher.js"; script.onload = resolve; script.onerror = resolve; document.head.appendChild(script); }); try { const versionUrl = `${location.origin}/${_ALConfig?.proxy_path_prefix || 'apps/loyalty'}/app-loyalty-version`; fetch(versionUrl) .then(res => res.json()) .then(data => { if (data) { const widgetJsUrl = new URL(_ALConfig.widgetJsPath); const widgetCssUrl = new URL(_ALConfig.widgetCssPath); widgetJsUrl.searchParams.set('v', data); widgetCssUrl.searchParams.set('v', data); _ALConfig.widgetJsPath = widgetJsUrl.toString(); _ALConfig.widgetCssPath = widgetCssUrl.toString(); } }) .catch(() => { }) .finally(() => { launcherScript.then(executeLoyaltyWidget); }); } catch (err) { launcherScript.then(executeLoyaltyWidget); } const storeCreditMismatch = _ALConfig?.customerId && _ALConfig?.customerStoreCreditBalance >= 0 && _ALConfig?.customerLoyalty?.storeCreditBalance >= 0 && _ALConfig?.customerLoyalty?.storeCreditBalance !== _ALConfig?.customerStoreCreditBalance; if (storeCreditMismatch && _ALConfig.shop === 'olineloyalty27.myshopify.com') { const updateCustomerUrl = `/${_ALConfig?.proxy_path_prefix || 'apps/loyalty'}/cp/api/update-customer`; try { fetch(updateCustomerUrl, { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then((response) => { if(response.ok) {} }) .catch(() => {}); } catch (err) {} } const dedicatedPageURL = new URL(window.location.href); const decodeUrl = (content) => { if (typeof content !== 'string') return content; try { const htmlDecoded = content?.replace(/\\\//g, '/'); return JSON.parse(`"${htmlDecoded}"`); } catch (error) { console.error('Error parsing content:', error); return content; } }; if (dedicatedPageURL?.searchParams?.get('appstle_referral') && _ALConfig?.widget_setting?.widgetType === 'DEDICATED_PAGE') { const customUrl = decodeUrl(_ALConfig?.widget_setting?.referralCustomRedirectUrl); if (customUrl) { const normalizedCustomPath = customUrl.startsWith('/') ? customUrl : `/${customUrl}`; if (window.location.pathname !== normalizedCustomPath) { const redirectUrl = new URL(window.location.href); redirectUrl.pathname = normalizedCustomPath; window.open(redirectUrl.toString(), '_self'); } } else if (dedicatedPageURL?.searchParams?.get('appstle_referral') && _ALConfig?.widget_setting?.widgetType === 'DEDICATED_PAGE' && !window.location.href.includes(_ALConfig?.proxy_path_prefix)) { window.open(`${window.location.origin}/${_ALConfig?.proxy_path_prefix}${window.location.search}`, '_self'); } } const dedicatedPageEventListener = (event) => { if (event.origin !== window.location.origin || event.source !== window) return; if (event.data === 'refresh_appstle_loyalty_page') { initiateAppstleLoyaltyPage(); console.log('REFRESH PAGE'); } }; window.addEventListener('message', dedicatedPageEventListener, false); function initiateAppstleLoyaltyPage() { if (document.querySelector('#appstleLoyaltyPage')) { const appstleLoyaltyPageElement = document.getElementById('appstleLoyaltyPage'); while (!appstleLoyaltyPageElement.__appstleReactRoot && appstleLoyaltyPageElement.firstChild) { appstleLoyaltyPageElement.firstChild.remove(); } if (appstleLoyaltyPageElement) { const loadDedicatedPageAsset = (createAsset, attempt, onSettle) => { const asset = createAsset(); let settled = false; const settle = () => { if (settled) return; settled = true; if (typeof onSettle === 'function') { onSettle(); } }; asset.onload = settle; asset.onerror = () => { asset.remove(); if (attempt < 4) { setTimeout(() => loadDedicatedPageAsset(createAsset, attempt + 1, onSettle), 1000 * Math.pow(2, attempt - 1)); } else { settle(); } }; } const appendDedicatedPageWidgetScript = () => { loadDedicatedPageAsset(() => { const s = document.createElement('script'); s.setAttribute('src', _ALConfig?.widgetJsPath); s.async = false; document.body.appendChild(s); return s; }, 1); } const executeDedicatedPageScript = () => { let widgetScriptAppended = false; const appendWidgetScriptOnce = () => { if (widgetScriptAppended) return; widgetScriptAppended = true; appendDedicatedPageWidgetScript(); }; try { const preload = document.createElement('link'); preload.rel = 'preload'; preload.as = 'script'; preload.href = _ALConfig?.widgetJsPath; document.head.appendChild(preload); } catch (e) {} loadDedicatedPageAsset(() => { const link = document.createElement('link'); link.type = 'text/css'; link.rel = 'stylesheet'; link.href = _ALConfig?.widgetCssPath; document.head.appendChild(link); return link; }, 1, appendWidgetScriptOnce); setTimeout(appendWidgetScriptOnce, 8000); } try { const versionUrl = `${location.origin}/${_ALConfig?.proxy_path_prefix || 'apps/loyalty'}/app-loyalty-version`; fetch(versionUrl).then(res => res.json()).then(data => { if (data) { const widgetJsUrl = new URL(_ALConfig.widgetJsPath); const widgetCssUrl = new URL(_ALConfig.widgetCssPath); widgetJsUrl.searchParams.set('v', data); widgetCssUrl.searchParams.set('v', data); _ALConfig.widgetJsPath = widgetJsUrl.toString(); _ALConfig.widgetCssPath = widgetCssUrl.toString(); } }).catch(() => {}).finally(() => { executeDedicatedPageScript(); }); } catch (err) { executeDedicatedPageScript(); } } } else { setTimeout(() => { initiateAppstleLoyaltyPage(); }, 2000); } } const dedicatedPageReferralUrl = new URL(window.location.href)?.searchParams.get('appstle_referral'); if (_ALConfig?.widget_setting?.showWidget === true) { initiateAppstleLoyaltyPage(); } (async function() { const isAvailableVisitShop = _ALConfig?.pointEarnRules?.length > 0 && _ALConfig?.pointEarnRules?.find((rule) => rule?.type === 'VISIT_SHOP' && rule?.status === 'ACTIVE'); if (_ALConfig?.customerId && isAvailableVisitShop) { if (!sessionStorage.getItem('syncVisitStore') && ((_ALConfig?.customerId && isAvailableVisitShop && isAvailableVisitShop?.id) || (_ALConfig?.referralEnabled && _ALConfig?.referralLoyalty?.referralType === 'VISIT_SHOP'))) { try { const response = await fetch(`/${_ALConfig?.proxy_path_prefix || 'apps/loyalty'}/cp/api/customer-visit-store`, { method: 'POST', headers: {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}, }); if (response?.ok) { sessionStorage.setItem('syncVisitStore', 'true'); } } catch (error) { console.error('Error:', error); } } } })(); const loyaltyCustomStyles = document.createElement('style'); loyaltyCustomStyles.id = 'appstle-loyalty-custom-styles'; loyaltyCustomStyles.textContent = _ALConfig?.widget_setting?.customCss || ''; document.body.appendChild(loyaltyCustomStyles);