49% OFF Reusable Ocean Theme Garden Art Mo – Hand, Everyday Comfort, Was $38, Save 21%

$29.99
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ 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"]; // 跳转决策: is_redirection + link(可选覆盖) const setting = { is_redirection: item.dataset["redirection"] === "true", link: item.dataset["link"], }; const landingUrl = `/promotions/discount-default/${discountId}`; const finalUrl = appDiscountUtils.resolveDiscountHref(setting, landingUrl); if (finalUrl && appDiscountUtils.inProductBody(this.element)) { this.win.open(finalUrl, '_blank', 'noopener'); } } }) } } /** * 使用 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);
/** * 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 = "d2340a65-f8a5-44b5-9810-20304dc22f84"; // 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 == '140cb85c-35c9-466d-b733-0ff277e1ebdc' && 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: "140cb85c-35c9-466d-b733-0ff277e1ebdc", 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);
Style:  🐢Sea Turtle
Size - Diameter: 15.7 in (40 cm):  Diameter: 15.7 in (40 cm)
Quantity
Free worldwide shipping
Free returns
Sustainably made
Secure payments

Description

Turn Ordinary Concrete Into An Ocean-Inspired Garden

Create detailed sea animal stepping stones with your own hands—no sculpting or special artistic skills required.

Choose from the Sea Turtle, Seahorse, Jellyfish, or Blue-Ringed Octopus design. Simply fill the mold with concrete, allow it to cure, gently release the finished piece, and paint it in your favorite colors.

Perfect for garden paths, flower beds, patios, coastal homes, and creative weekend projects.



We don’t run sales like this very often, but today is the last day to grab this for just $22.99.

After tonight, the price goes back up to $44.98.


Why You’ll Love It

Detailed Ocean Animal Designs

Each mold features raised textures and sculpted details that create a dimensional finished piece.

Choose from:

✔ Sea Turtle
✔ Seahorse
✔ Jellyfish
✔ Blue-Ringed Octopus

Once painted, the patterns catch the light beautifully and turn simple concrete into eye-catching garden art.


Create Your Own Ocean Garden

Place the finished animals along walkways, between flower beds, beside ponds, around patios, or throughout your backyard.

Create one decorative focal point or combine several designs to build a complete underwater-themed pathway.

 


Easy To Fill And Release

The flexible mold can be gently pulled away from the cured concrete, helping preserve the detailed fins, shells, tentacles, and textured patterns.

No complicated machinery or professional casting equipment is required.


Paint It Your Way

Leave the finished piece in its natural concrete color for a rustic stone look, or customize it with outdoor paint.

Try ocean blue, turquoise, coral, purple, sandy beige, metallic highlights, or any color combination that matches your garden.

Every finished piece can look completely different.


Reusable For Multiple Projects

Clean and reuse the mold to create matching stepping stones for larger pathways and landscaping projects.

It is also ideal for handmade gifts, coastal decorations, family crafts, and weekend DIY projects.


A Relaxing Project for Ocean Lovers

Enjoy the satisfaction of creating something beautiful for your own outdoor space.

It’s a fun hands-on activity for gardeners, DIY enthusiasts, couples, families, and anyone who enjoys adding personal touches to the home.


From Concrete To Ocean Art

Ordinary stepping stones can feel plain and impersonal.

These reusable molds let you create detailed sea animals that bring color, movement, and handcrafted personality to your outdoor space.

Each design can be painted differently, so no two creations have to look exactly the same.

Perfect For

Garden and lawn pathways
Flower beds and landscape borders
Patios, porches, and courtyards
Coastal and beach-inspired gardens
Pond and fountain surroundings
Decorative concrete plaques
Memorial garden accents
Family craft projects
Handmade gifts


⭐ Customer Reviews

⭐⭐⭐⭐⭐
“The Sea Turtle details are beautiful and showed up clearly in the concrete. Very happy with this mold.”
James R. — United States

⭐⭐⭐⭐⭐
“The mold released really easily and didn’t damage any of the small details.”
Michael T. — United States

⭐⭐⭐⭐⭐
“This was my first time making one! I used regular concrete mix, and it turned out great. The finished stone feels really solid.”
Daniel K. — Canada


How to Use

1. Prepare the Mold

Place the mold on a flat, stable, and level surface. Apply a light layer of suitable mold-release agent if desired to make demolding easier.

2. Mix the Concrete

For a stronger stepping stone, use an exterior-grade concrete mix rather than pure cement. Follow the manufacturer’s instructions and avoid adding too much water, as an overly wet mixture may weaken the finished piece.

3. Pour and Reinforce

Slowly pour part of the mixture into the mold. For added strength, place a piece of galvanized wire mesh or concrete reinforcement fiber in the center, keeping it fully covered and away from the outer edges. Add the remaining mixture until the mold is evenly filled.

4. Remove Air Bubbles

Spread and smooth the mixture evenly. Gently tap or shake the sides of the mold to help trapped air bubbles rise to the surface and reduce cracks or hollow areas.

5. Allow It to Cure

Leave the mold undisturbed on a level surface until the concrete has hardened. Do not remove it too early. For better strength, keep the concrete slightly moist and protected from strong sunlight, rain, or freezing temperatures during the curing process.

6. Gently Demold

Carefully flex the mold away from the edges before slowly lifting it from the cured sunflower. Avoid pulling forcefully on the petals or detailed sections.

7. Paint and Seal

Allow the concrete to dry and cure fully before painting. Use outdoor paint, then apply a weather-resistant concrete sealer to help protect the color and surface from moisture, sunlight, and changing weather.

Tips for a Stronger, Longer-Lasting Stepping Stone

  • Use exterior-grade concrete mix instead of pure cement.
  • Do not add excessive water to the mixture.
  • Add reinforcement mesh or concrete fibers for extra durability.
  • Make sure the stone is filled to an even thickness and not poured too thin.
  • Allow sufficient curing time before walking on or placing it outdoors.
  • Seal both the painted surface and exposed concrete for better weather protection.

Helpful Tips

Use exterior-grade concrete for outdoor stepping stones.

Avoid adding too much water to the mixture.

Work the concrete carefully into narrow fins, tentacles, tails, and textured areas.

For added strength, use suitable reinforcement mesh or concrete fibers.

Allow the finished piece to cure fully before painting or walking on it.

Apply a weather-resistant concrete sealer for longer-lasting color.


Product Details

Product type: Reusable concrete casting mold
Available designs: Sea Turtle, Seahorse, Jellyfish, Blue-Ringed Octopus
Recommended materials: Concrete, cement, plaster, or compatible casting mixtures
Finished uses: Stepping stones, garden plaques, pathway accents, and outdoor décor
Reusable: Yes
Paintable: Yes
Skill level: Beginner-friendly

Design and dimensions vary depending on the selected style.


Package Includes

1 × Reusable Ocean Animal Stepping Stone Mold

Concrete, paint, tools, reinforcement, sealant, and decorative accessories are not included.


A Creative Gift For Ocean Lovers

Perfect for gardeners, coastal décor lovers, homeowners, DIY enthusiasts, and anyone who loves marine animals.

Instead of giving another ordinary garden decoration, give them a creative project they can personalize and enjoy season after season.

Pour it. Paint it. Create your own ocean garden.